/ Hex Artifact Content
Login

Artifact 2139262641607bf3b5fc8d651b344233695f622bf477b4cbb55182b93251fe6b:


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 52 6f 75 74 69 6e 65 73 20 74  /*.** Routines t
7c20: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
7c30: 78 5f 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67  x_count() aggreg
7c40: 61 74 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a  ate function..**
7c50: 0a 2a 2a 20 78 5f 63 6f 75 6e 74 28 29 20 63 6f  .** x_count() co
7c60: 75 6e 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20  unts the number 
7c70: 6f 66 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75  of non-null argu
7c80: 6d 65 6e 74 73 2e 20 20 42 75 74 20 74 68 65 72  ments.  But ther
7c90: 65 20 61 72 65 0a 2a 2a 20 73 6f 6d 65 20 74 77  e are.** some tw
7ca0: 69 73 74 73 20 66 6f 72 20 74 65 73 74 69 6e 67  ists for testing
7cb0: 20 70 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a   purposes..**.**
7cc0: 20 49 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74   If the argument
7cd0: 20 74 6f 20 78 5f 63 6f 75 6e 74 28 29 20 69 73   to x_count() is
7ce0: 20 34 30 20 74 68 65 6e 20 61 20 55 54 46 2d 38   40 then a UTF-8
7cf0: 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
7d00: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 65  ed.** on the ste
7d10: 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20  p function.  If 
7d20: 78 5f 63 6f 75 6e 74 28 34 31 29 20 69 73 20 73  x_count(41) is s
7d30: 65 65 6e 2c 20 74 68 65 6e 20 61 20 55 54 46 2d  een, then a UTF-
7d40: 31 36 20 65 72 72 6f 72 0a 2a 2a 20 69 73 20 72  16 error.** is r
7d50: 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 73  eported on the s
7d60: 74 65 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49  tep function.  I
7d70: 66 20 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e  f the total coun
7d80: 74 20 69 73 20 34 32 2c 20 74 68 65 6e 0a 2a 2a  t is 42, then.**
7d90: 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69   a UTF-8 error i
7da0: 73 20 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68  s reported on th
7db0: 65 20 66 69 6e 61 6c 69 7a 65 20 66 75 6e 63 74  e finalize funct
7dc0: 69 6f 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ion..*/.typedef 
7dd0: 73 74 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74  struct t1CountCt
7de0: 78 20 74 31 43 6f 75 6e 74 43 74 78 3b 0a 73 74  x t1CountCtx;.st
7df0: 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20  ruct t1CountCtx 
7e00: 7b 0a 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74  {.  int n;.};.st
7e10: 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e  atic void t1Coun
7e20: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
7e30: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7e40: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
7e50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7e60: 2a 61 72 67 76 0a 29 7b 0a 20 20 74 31 43 6f 75  *argv.){.  t1Cou
7e70: 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20  ntCtx *p;.  p = 
7e80: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
7e90: 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78  e_context(contex
7ea0: 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  t, sizeof(*p));.
7eb0: 20 20 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c    if( (argc==0 |
7ec0: 7c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73  | SQLITE_NULL!=s
7ed0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70  qlite3_value_typ
7ee0: 65 28 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20  e(argv[0]) ) && 
7ef0: 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b  p ){.    p->n++;
7f00: 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e  .  }.  if( argc>
7f10: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d  0 ){.    int v =
7f20: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
7f30: 6e 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  nt(argv[0]);.   
7f40: 20 69 66 28 20 76 3d 3d 34 30 20 29 7b 0a 20 20   if( v==40 ){.  
7f50: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
7f60: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
7f70: 2c 20 22 76 61 6c 75 65 20 6f 66 20 34 30 20 68  , "value of 40 h
7f80: 61 6e 64 65 64 20 74 6f 20 78 5f 63 6f 75 6e 74  anded to x_count
7f90: 22 2c 20 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20  ", -1);.#ifndef 
7fa0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
7fb0: 36 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  6.    }else if( 
7fc0: 76 3d 3d 34 31 20 29 7b 0a 20 20 20 20 20 20 63  v==41 ){.      c
7fd0: 6f 6e 73 74 20 63 68 61 72 20 7a 55 74 66 31 36  onst char zUtf16
7fe0: 45 72 72 4d 73 67 5b 5d 20 3d 20 7b 20 30 2c 20  ErrMsg[] = { 0, 
7ff0: 30 78 36 31 2c 20 30 2c 20 30 78 36 32 2c 20 30  0x61, 0, 0x62, 0
8000: 2c 20 30 78 36 33 2c 20 30 2c 20 30 2c 20 30 7d  , 0x63, 0, 0, 0}
8010: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
8020: 72 65 73 75 6c 74 5f 65 72 72 6f 72 31 36 28 63  result_error16(c
8030: 6f 6e 74 65 78 74 2c 20 26 7a 55 74 66 31 36 45  ontext, &zUtf16E
8040: 72 72 4d 73 67 5b 31 2d 53 51 4c 49 54 45 5f 42  rrMsg[1-SQLITE_B
8050: 49 47 45 4e 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a  IGENDIAN], -1);.
8060: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d  #endif.    }.  }
8070: 0a 7d 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69  .}   .static voi
8080: 64 20 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a  d t1CountFinaliz
8090: 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  e(sqlite3_contex
80a0: 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 74  t *context){.  t
80b0: 31 43 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20  1CountCtx *p;.  
80c0: 70 20 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72  p = sqlite3_aggr
80d0: 65 67 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f  egate_context(co
80e0: 6e 74 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70  ntext, sizeof(*p
80f0: 29 29 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20  ));.  if( p ){. 
8100: 20 20 20 69 66 28 20 70 2d 3e 6e 3d 3d 34 32 20     if( p->n==42 
8110: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
8120: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f  _result_error(co
8130: 6e 74 65 78 74 2c 20 22 78 5f 63 6f 75 6e 74 20  ntext, "x_count 
8140: 74 6f 74 61 6c 73 20 74 6f 20 34 32 22 2c 20 2d  totals to 42", -
8150: 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1);.    }else{. 
8160: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8170: 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c  ult_int(context,
8180: 20 70 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a   p ? p->n : 0);.
8190: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66      }.  }.}..#if
81a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
81b0: 5f 44 45 50 52 45 43 41 54 45 44 0a 73 74 61 74  _DEPRECATED.stat
81c0: 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f  ic void legacyCo
81d0: 75 6e 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74  untStep(.  sqlit
81e0: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
81f0: 65 78 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  ext,.  int argc,
8200: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
8210: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 2f 2a 20   **argv.){.  /* 
8220: 6e 6f 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73 74 61 74  no-op */.}..stat
8230: 69 63 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f  ic void legacyCo
8240: 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  untFinalize(sqli
8250: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
8260: 74 65 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33  text){.  sqlite3
8270: 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74  _result_int(cont
8280: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 61 67 67  ext, sqlite3_agg
8290: 72 65 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e  regate_count(con
82a0: 74 65 78 74 29 29 3b 0a 7d 0a 23 65 6e 64 69 66  text));.}.#endif
82b0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
82c0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61  sqlite3_create_a
82d0: 67 67 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a  ggregate DB.**.*
82e0: 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74  * Call the sqlit
82f0: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8300: 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69  on API on the gi
8310: 76 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20  ven database in 
8320: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61  order.** to crea
8330: 74 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61  te a function na
8340: 6d 65 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20  med "x_count".  
8350: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
8360: 20 73 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 74   similar.** to t
8370: 68 65 20 62 75 69 6c 74 2d 69 6e 20 63 6f 75 6e  he built-in coun
8380: 74 28 29 20 66 75 6e 63 74 69 6f 6e 2c 20 77 69  t() function, wi
8390: 74 68 20 61 20 66 65 77 20 73 70 65 63 69 61 6c  th a few special
83a0: 20 71 75 69 72 6b 73 0a 2a 2a 20 66 6f 72 20 74   quirks.** for t
83b0: 65 73 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74  esting the sqlit
83c0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
83d0: 29 20 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ) APIs..**.** Th
83e0: 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76  e original motiv
83f0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72  ation for this r
8400: 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65  outine was to be
8410: 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68   able to call th
8420: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65  e.** sqlite3_cre
8430: 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 66 75  ate_aggregate fu
8440: 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71  nction while a q
8450: 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72  uery is in progr
8460: 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ess in order.** 
8470: 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c 49  to test the SQLI
8480: 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74  TE_MISUSE detect
8490: 69 6f 6e 20 6c 6f 67 69 63 2e 20 20 53 65 65 20  ion logic.  See 
84a0: 6d 69 73 75 73 65 2e 74 65 73 74 2e 0a 2a 2a 0a  misuse.test..**.
84b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
84c0: 77 61 73 20 6c 61 74 65 72 20 65 78 74 65 6e 64  was later extend
84d0: 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 75  ed to test the u
84e0: 73 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 72 65  se of sqlite3_re
84f0: 73 75 6c 74 5f 65 72 72 6f 72 28 29 0a 2a 2a 20  sult_error().** 
8500: 77 69 74 68 69 6e 20 61 67 67 72 65 67 61 74 65  within aggregate
8510: 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a   functions..**.*
8520: 2a 20 4c 61 74 65 72 3a 20 49 74 20 69 73 20 6e  * Later: It is n
8530: 6f 77 20 61 6c 73 6f 20 65 78 74 65 6e 64 65 64  ow also extended
8540: 20 74 6f 20 72 65 67 69 73 74 65 72 20 74 68 65   to register the
8550: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8560: 69 6f 6e 0a 2a 2a 20 22 6c 65 67 61 63 79 5f 63  ion.** "legacy_c
8570: 6f 75 6e 74 28 29 22 20 77 69 74 68 20 74 68 65  ount()" with the
8580: 20 73 75 70 70 6c 69 65 64 20 64 61 74 61 62 61   supplied databa
8590: 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  se handle. This 
85a0: 69 73 20 75 73 65 64 0a 2a 2a 20 74 6f 20 74 65  is used.** to te
85b0: 73 74 20 74 68 65 20 64 65 70 72 65 63 61 74 65  st the deprecate
85c0: 64 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  d sqlite3_aggreg
85d0: 61 74 65 5f 63 6f 75 6e 74 28 29 20 41 50 49 2e  ate_count() API.
85e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
85f0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
8600: 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
8610: 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  te(.  void *NotU
8620: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
8630: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
8640: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
8650: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8660: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8670: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8690: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
86a0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
86b0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
86c0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
86d0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
86e0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
86f0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
8700: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
8710: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8720: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8730: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8740: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8750: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
8760: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8770: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8780: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
8790: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
87a0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
87b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
87c0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
87d0: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
87e0: 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  x_count", 0, SQL
87f0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
8800: 20 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65        t1CountSte
8810: 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a  p,t1CountFinaliz
8820: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
8830: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
8840: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
8850: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
8860: 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51  "x_count", 1, SQ
8870: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
8880: 0a 20 20 20 20 20 20 20 20 74 31 43 6f 75 6e 74  .        t1Count
8890: 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61  Step,t1CountFina
88a0: 6c 69 7a 65 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  lize);.  }.#ifnd
88b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
88c0: 45 50 52 45 43 41 54 45 44 0a 20 20 69 66 28 20  EPRECATED.  if( 
88d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
88e0: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
88f0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
8900: 6e 28 64 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f  n(db, "legacy_co
8910: 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  unt", 0, SQLITE_
8920: 41 4e 59 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  ANY, 0, 0,.     
8930: 20 20 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74     legacyCountSt
8940: 65 70 2c 20 6c 65 67 61 63 79 43 6f 75 6e 74 46  ep, legacyCountF
8950: 69 6e 61 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20  inalize.    );. 
8960: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8970: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
8980: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
8990: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
89a0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
89b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
89c0: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
89d0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
89e0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
89f0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70  ./*.** Usage:  p
8a00: 72 69 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a  rintf TEXT.**.**
8a10: 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
8a20: 70 72 69 6e 74 66 2e 20 20 55 73 65 20 74 68 69  printf.  Use thi
8a30: 73 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 75  s rather than pu
8a40: 74 73 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20  ts to merge the 
8a50: 6f 75 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65  output.** in the
8a60: 20 63 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63   correct sequenc
8a70: 65 20 77 69 74 68 20 64 65 62 75 67 67 69 6e 67  e with debugging
8a80: 20 70 72 69 6e 74 66 73 20 69 6e 73 65 72 74 65   printfs inserte
8a90: 64 20 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a  d into C code..*
8aa0: 2a 20 50 75 74 73 20 75 73 65 73 20 61 20 73 65  * Puts uses a se
8ab0: 70 61 72 61 74 65 20 62 75 66 66 65 72 20 61 6e  parate buffer an
8ac0: 64 20 64 65 62 75 67 67 69 6e 67 20 73 74 61 74  d debugging stat
8ad0: 65 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f  ements will be o
8ae0: 75 74 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63  ut of.** sequenc
8af0: 65 20 69 66 20 69 74 20 69 73 20 75 73 65 64 2e  e if it is used.
8b00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
8b10: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
8b20: 74 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64  t_printf(.  void
8b30: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8b40: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8b50: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8b60: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8b70: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
8b80: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
8b90: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
8ba0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8bb0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
8bc0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
8bd0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8be0: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8bf0: 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ){.  if( argc!=2
8c00: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8c10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8c20: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8c30: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
8c40: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
8c50: 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20   TEXT\"", 0);.  
8c60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
8c70: 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66  OR;.  }.  printf
8c80: 28 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b 31 5d  ("%s\n", argv[1]
8c90: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8ca0: 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55  OK;.}..../*.** U
8cb0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
8cc0: 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41  printf_int FORMA
8cd0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
8ce0: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
8cf0: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
8d00: 68 20 74 68 72 65 65 20 69 6e 74 65 67 65 72 20  h three integer 
8d10: 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61  arguments.*/.sta
8d20: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
8d30: 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70  CLAPI sqlite3_mp
8d40: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
8d50: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
8d60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8d70: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
8d80: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
8d90: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
8da0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
8db0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
8dc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
8dd0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
8de0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
8df0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
8e00: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
8e10: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
8e20: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
8e30: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8e40: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8e50: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8e60: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8e70: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8e80: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
8e90: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
8ea0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8eb0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8ec0: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
8ed0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
8ee0: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
8ef0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
8f00: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
8f10: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
8f20: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8f30: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
8f40: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
8f50: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8f60: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
8f70: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
8f80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
8f90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
8fa0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
8fb0: 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41  intf_int64 FORMA
8fc0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
8fd0: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
8fe0: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
8ff0: 68 20 74 68 72 65 65 20 36 34 2d 62 69 74 20 69  h three 64-bit i
9000: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
9010: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
9020: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c  QLITE_TCLAPI sql
9030: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
9040: 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  64(.  void *NotU
9050: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9060: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9070: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9080: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9090: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
90a0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
90b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
90c0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
90d0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
90e0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
90f0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
9100: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
9110: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69  nt i;.  sqlite_i
9120: 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63 68 61  nt64 a[3];.  cha
9130: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
9140: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
9150: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9160: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9170: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9180: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9190: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
91a0: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
91b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
91c0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
91d0: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
91e0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 41 74     if( sqlite3At
91f0: 6f 69 36 34 28 61 72 67 76 5b 69 5d 2c 20 26 61  oi64(argv[i], &a
9200: 5b 69 2d 32 5d 2c 20 73 71 6c 69 74 65 33 53 74  [i-2], sqlite3St
9210: 72 6c 65 6e 33 30 28 61 72 67 76 5b 69 5d 29 2c  rlen30(argv[i]),
9220: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 20 29 7b   SQLITE_UTF8) ){
9230: 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
9240: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9250: 22 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74  "argument is not
9260: 20 61 20 76 61 6c 69 64 20 36 34 2d 62 69 74 20   a valid 64-bit 
9270: 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20 20  integer", 0);.  
9280: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9290: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
92a0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
92b0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
92c0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29  [0], a[1], a[2])
92d0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
92e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
92f0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
9300: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
9310: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
9320: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
9330: 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 46 4f  _mprintf_long FO
9340: 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54  RMAT INTEGER INT
9350: 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a  EGER INTEGER.**.
9360: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
9370: 77 69 74 68 20 74 68 72 65 65 20 6c 6f 6e 67 20  with three long 
9380: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
9390: 73 2e 20 20 20 54 68 69 73 20 6d 69 67 68 74 20  s.   This might 
93a0: 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61  be the.** same a
93b0: 73 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  s sqlite3_mprint
93c0: 66 5f 69 6e 74 20 6f 72 20 73 71 6c 69 74 65 33  f_int or sqlite3
93d0: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 2c 20  _mprintf_int64, 
93e0: 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20  depending on.** 
93f0: 70 6c 61 74 66 6f 72 6d 2e 0a 2a 2f 0a 73 74 61  platform..*/.sta
9400: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
9410: 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70  CLAPI sqlite3_mp
9420: 72 69 6e 74 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f  rintf_long(.  vo
9430: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
9440: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
9450: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
9460: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
9470: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
9480: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
9490: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
94a0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
94b0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
94c0: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
94d0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
94e0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
94f0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
9500: 6c 6f 6e 67 20 69 6e 74 20 61 5b 33 5d 3b 0a 20  long int a[3];. 
9510: 20 69 6e 74 20 62 5b 33 5d 3b 0a 20 20 63 68 61   int b[3];.  cha
9520: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
9530: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
9540: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9550: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9560: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9570: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9580: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
9590: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
95a0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
95b0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
95c0: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
95d0: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
95e0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
95f0: 5d 2c 20 26 62 5b 69 2d 32 5d 29 20 29 20 72 65  ], &b[i-2]) ) re
9600: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
9610: 20 20 20 20 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f      a[i-2] = (lo
9620: 6e 67 20 69 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20  ng int)b[i-2];. 
9630: 20 20 20 61 5b 69 2d 32 5d 20 26 3d 20 28 28 28     a[i-2] &= (((
9640: 75 36 34 29 31 29 3c 3c 28 73 69 7a 65 6f 66 28  u64)1)<<(sizeof(
9650: 69 6e 74 29 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a  int)*8))-1;.  }.
9660: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
9670: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
9680: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29  [0], a[1], a[2])
9690: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
96a0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
96b0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
96c0: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
96d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
96e0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
96f0: 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20 46 4f 52  _mprintf_str FOR
9700: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
9710: 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  GER STRING.**.**
9720: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
9730: 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61  th two integer a
9740: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65  rguments and one
9750: 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65 6e 74   string argument
9760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
9770: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c  QLITE_TCLAPI sql
9780: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72  ite3_mprintf_str
9790: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
97a0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
97b0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
97c0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
97d0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
97e0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
97f0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
9800: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
9810: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
9820: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
9830: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
9840: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
9850: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
9860: 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72   a[3], i;.  char
9870: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c   *z;.  if( argc<
9880: 34 20 7c 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20  4 || argc>5 ){. 
9890: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
98a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
98b0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
98c0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
98d0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
98e0: 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54 52 49  AT INT INT ?STRI
98f0: 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  NG?\"", 0);.    
9900: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9910: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
9920: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
9930: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
9940: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
9950: 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &a[i-2]) ) retur
9960: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9970: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
9980: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
9990: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63  a[0], a[1], argc
99a0: 3e 34 20 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e  >4 ? argv[4] : N
99b0: 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  ULL);.  Tcl_Appe
99c0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
99d0: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
99e0: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
99f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
9a00: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
9a10: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74  ite3_snprintf_st
9a20: 72 20 49 4e 54 45 47 45 52 20 46 4f 52 4d 41 54  r INTEGER FORMAT
9a30: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
9a40: 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61   STRING.**.** Ca
9a50: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
9a60: 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75  two integer argu
9a70: 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74  ments and one st
9a80: 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  ring argument.*/
9a90: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
9aa0: 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65  TE_TCLAPI sqlite
9ab0: 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 28 0a  3_snprintf_str(.
9ac0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9ad0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9ae0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9af0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9b00: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9b10: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9b20: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9b30: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9b40: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9b50: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9b60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
9b70: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
9b80: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
9b90: 5b 33 5d 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 3b  [3], i;.  int n;
9ba0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
9bb0: 28 20 61 72 67 63 3c 35 20 7c 7c 20 61 72 67 63  ( argc<5 || argc
9bc0: 3e 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  >6 ){.    Tcl_Ap
9bd0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9be0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
9bf0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
9c00: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
9c10: 20 22 20 49 4e 54 20 46 4f 52 4d 41 54 20 49 4e   " INT FORMAT IN
9c20: 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22  T INT ?STRING?\"
9c30: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9c40: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9c50: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
9c60: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  t(interp, argv[1
9c70: 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20  ], &n) ) return 
9c80: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
9c90: 20 6e 3c 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f   n<0 ){.    Tcl_
9ca0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9cb0: 65 72 70 2c 20 22 4e 20 6d 75 73 74 20 62 65 20  erp, "N must be 
9cc0: 6e 6f 6e 2d 6e 65 67 61 74 69 76 65 22 2c 20 30  non-negative", 0
9cd0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
9ce0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
9cf0: 6f 72 28 69 3d 33 3b 20 69 3c 35 3b 20 69 2b 2b  or(i=3; i<5; i++
9d00: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
9d10: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
9d20: 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 33 5d 29 20  gv[i], &a[i-3]) 
9d30: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
9d40: 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  OR;.  }.  z = sq
9d50: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b  lite3_malloc( n+
9d60: 31 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  1 );.  sqlite3_s
9d70: 6e 70 72 69 6e 74 66 28 6e 2c 20 7a 2c 20 61 72  nprintf(n, z, ar
9d80: 67 76 5b 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[2], a[0], a[1
9d90: 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76  ], argc>4 ? argv
9da0: 5b 35 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54  [5] : NULL);.  T
9db0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9dc0: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
9dd0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
9de0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
9df0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
9e00: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
9e10: 6e 74 66 5f 64 6f 75 62 6c 65 20 46 4f 52 4d 41  ntf_double FORMA
9e20: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
9e30: 52 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43  R DOUBLE.**.** C
9e40: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
9e50: 20 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67   two integer arg
9e60: 75 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64  uments and one d
9e70: 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a  ouble argument.*
9e80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
9e90: 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74  ITE_TCLAPI sqlit
9ea0: 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
9eb0: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
9ec0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
9ed0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
9ee0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
9ef0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
9f00: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
9f10: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
9f20: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
9f30: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
9f40: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
9f50: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
9f60: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
9f70: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
9f80: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75  t a[3], i;.  dou
9f90: 62 6c 65 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ble r;.  char *z
9fa0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
9fb0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9fc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9fd0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
9fe0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
9ff0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
a000: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 44  FORMAT INT INT D
a010: 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20  OUBLE\"", 0);.  
a020: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a030: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
a040: 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  2; i<4; i++){.  
a050: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
a060: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
a070: 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &a[i-2]) ) ret
a080: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a090: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
a0a0: 44 6f 75 62 6c 65 28 69 6e 74 65 72 70 2c 20 61  Double(interp, a
a0b0: 72 67 76 5b 34 5d 2c 20 26 72 29 20 29 20 72 65  rgv[4], &r) ) re
a0c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a0d0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
a0e0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
a0f0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20  [0], a[1], r);. 
a100: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a110: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
a120: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a130: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
a140: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
a150: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
a160: 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 46 4f 52  rintf_scaled FOR
a170: 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c  MAT DOUBLE DOUBL
a180: 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  E.**.** Call mpr
a190: 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e 67  intf with a sing
a1a0: 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d 65  le double argume
a1b0: 6e 74 20 77 68 69 63 68 20 69 73 20 74 68 65 20  nt which is the 
a1c0: 70 72 6f 64 75 63 74 20 6f 66 20 74 68 65 0a 2a  product of the.*
a1d0: 2a 20 74 77 6f 20 61 72 67 75 6d 65 6e 74 73 20  * two arguments 
a1e0: 67 69 76 65 6e 20 61 62 6f 76 65 2e 20 20 54 68  given above.  Th
a1f0: 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 67 65  is is used to ge
a200: 6e 65 72 61 74 65 20 6f 76 65 72 66 6c 6f 77 20  nerate overflow 
a210: 61 6e 64 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a  and underflow.**
a220: 20 64 6f 75 62 6c 65 73 20 74 6f 20 74 65 73 74   doubles to test
a230: 20 74 68 61 74 20 74 68 65 79 20 61 72 65 20 63   that they are c
a240: 6f 6e 76 65 72 74 65 64 20 70 72 6f 70 65 72 6c  onverted properl
a250: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
a260: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73   SQLITE_TCLAPI s
a270: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
a280: 63 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e  caled(.  void *N
a290: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
a2a0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
a2b0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
a2c0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
a2d0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
a2e0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
a2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a300: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
a310: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
a320: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
a330: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
a340: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
a350: 20 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c    int i;.  doubl
a360: 65 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a  e r[2];.  char *
a370: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  z;.  if( argc!=4
a380: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
a390: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
a3a0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
a3b0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
a3c0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
a3d0: 20 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44   FORMAT DOUBLE D
a3e0: 4f 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20  OUBLE\"", 0);.  
a3f0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a400: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
a410: 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  2; i<4; i++){.  
a420: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
a430: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
a440: 5b 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20  [i], &r[i-2]) ) 
a450: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a460: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
a470: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
a480: 5b 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b  [1], r[0]*r[1]);
a490: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
a4a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30  ult(interp, z, 0
a4b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
a4c0: 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  e(z);.  return T
a4d0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
a4e0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
a4f0: 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20  mprintf_stronly 
a500: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a  FORMAT STRING.**
a510: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
a520: 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64   with a single d
a530: 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77  ouble argument w
a540: 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64  hich is the prod
a550: 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77  uct of the.** tw
a560: 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65  o arguments give
a570: 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69  n above.  This i
a580: 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61  s used to genera
a590: 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20  te overflow and 
a5a0: 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75  underflow.** dou
a5b0: 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61  bles to test tha
a5c0: 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65  t they are conve
a5d0: 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  rted properly..*
a5e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
a5f0: 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74  ITE_TCLAPI sqlit
a600: 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e  e3_mprintf_stron
a610: 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ly(.  void *NotU
a620: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
a630: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a640: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a650: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a660: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a670: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
a680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a690: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a6a0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
a6b0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
a6c0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
a6d0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
a6e0: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
a6f0: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
a700: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
a710: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
a720: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
a730: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
a740: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54 52      " FORMAT STR
a750: 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  ING\"", 0);.    
a760: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a770: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
a780: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
a790: 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20  [1], argv[2]);. 
a7a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
a7b0: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
a7c0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
a7d0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
a7e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
a7f0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
a800: 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 20  rintf_hexdouble 
a810: 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a  FORMAT HEX.**.**
a820: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
a830: 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62  th a single doub
a840: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
a850: 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72 6f  h is derived fro
a860: 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65 63  m the.** hexadec
a870: 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66  imal encoding of
a880: 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65 2e   an IEEE double.
a890: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
a8a0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c  QLITE_TCLAPI sql
a8b0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78  ite3_mprintf_hex
a8c0: 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
a8d0: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
a8e0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
a8f0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
a900: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
a910: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
a920: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
a930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
a940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
a950: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
a960: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
a970: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
a980: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
a990: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 64 6f  .  char *z;.  do
a9a0: 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73 69 67 6e  uble r;.  unsign
a9b0: 65 64 20 69 6e 74 20 78 31 2c 20 78 32 3b 0a 20  ed int x1, x2;. 
a9c0: 20 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 64   sqlite_uint64 d
a9d0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
a9e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
a9f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
aa00: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
aa10: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
aa20: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
aa30: 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22  FORMAT STRING\""
aa40: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
aa50: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
aa60: 20 20 69 66 28 20 73 73 63 61 6e 66 28 61 72 67    if( sscanf(arg
aa70: 76 5b 32 5d 2c 20 22 25 30 38 78 25 30 38 78 22  v[2], "%08x%08x"
aa80: 2c 20 26 78 32 2c 20 26 78 31 29 21 3d 32 20 29  , &x2, &x1)!=2 )
aa90: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
aaa0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
aab0: 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  2nd argument sho
aac0: 75 6c 64 20 62 65 20 31 36 2d 63 68 61 72 61 63  uld be 16-charac
aad0: 74 65 72 73 20 6f 66 20 68 65 78 22 2c 20 30 29  ters of hex", 0)
aae0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
aaf0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 20  _ERROR;.  }.  d 
ab00: 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28 64 3c 3c  = x2;.  d = (d<<
ab10: 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d 65 6d 63  32) + x1;.  memc
ab20: 70 79 28 26 72 2c 20 26 64 2c 20 73 69 7a 65 6f  py(&r, &d, sizeo
ab30: 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  f(r));.  z = sql
ab40: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
ab50: 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f  v[1], r);.  Tcl_
ab60: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
ab70: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
ab80: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
ab90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
aba0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
abb0: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
abc0: 68 61 72 65 64 5f 63 61 63 68 65 20 3f 42 4f 4f  hared_cache ?BOO
abd0: 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23 69 66 20  LEAN?.**.*/.#if 
abe0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
abf0: 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48  OMIT_SHARED_CACH
ac00: 45 29 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  E).static int SQ
ac10: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
ac20: 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 28 0a  _enable_shared(.
ac30: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
ac40: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
ac50: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
ac60: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
ac70: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
ac80: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
ac90: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
aca0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
acb0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
acc0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
acd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ace0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
acf0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
ad00: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
ad10: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
ad20: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
ad30: 72 63 3b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65  rc;.  int enable
ad40: 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30 3b  ;.  int ret = 0;
ad50: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
ad60: 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  && objc!=1 ){.  
ad70: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
ad80: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
ad90: 6a 76 2c 20 22 3f 42 4f 4f 4c 45 41 4e 3f 22 29  jv, "?BOOLEAN?")
ada0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
adb0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65  _ERROR;.  }.  re
adc0: 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  t = sqlite3Globa
add0: 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
ade0: 63 68 65 45 6e 61 62 6c 65 64 3b 0a 0a 20 20 69  cheEnabled;..  i
adf0: 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
ae00: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f    if( Tcl_GetBoo
ae10: 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
ae20: 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 65 6e  rp, objv[1], &en
ae30: 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20 72  able) ){.      r
ae40: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ae50: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
ae60: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
ae70: 68 61 72 65 64 5f 63 61 63 68 65 28 65 6e 61 62  hared_cache(enab
ae80: 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  le);.    if( rc!
ae90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
aea0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
aeb0: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
aec0: 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  *)sqlite3ErrStr(
aed0: 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
aee0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
aef0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
af00: 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
af10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
af20: 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
af30: 28 72 65 74 29 29 3b 0a 20 20 72 65 74 75 72 6e  (ret));.  return
af40: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
af50: 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  f..../*.** Usage
af60: 3a 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  : sqlite3_extend
af70: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 20  ed_result_codes 
af80: 20 20 44 42 20 20 20 20 42 4f 4f 4c 45 41 4e 0a    DB    BOOLEAN.
af90: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
afa0: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
afb0: 65 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  est_extended_res
afc0: 75 6c 74 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69  ult_codes(.  Cli
afd0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
afe0: 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
aff0: 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
b000: 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
b010: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b020: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
b030: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
b040: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
b050: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
b060: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
b070: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b080: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
b090: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
b0a0: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
b0b0: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
b0c0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c  /.){.  int enabl
b0d0: 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  e;.  sqlite3 *db
b0e0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
b0f0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
b100: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
b110: 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f   1, objv, "DB BO
b120: 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74  OLEAN");.    ret
b130: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b140: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
b150: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
b160: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
b170: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
b180: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
b190: 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
b1a0: 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
b1b0: 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61  p, objv[2], &ena
b1c0: 62 6c 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  ble) ) return TC
b1d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
b1e0: 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
b1f0: 6c 74 5f 63 6f 64 65 73 28 64 62 2c 20 65 6e 61  lt_codes(db, ena
b200: 62 6c 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ble);.  return T
b210: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
b220: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c  Usage: sqlite3_l
b230: 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72  ibversion_number
b240: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
b250: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
b260: 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f  test_libversion_
b270: 6e 75 6d 62 65 72 28 0a 20 20 43 6c 69 65 6e 74  number(.  Client
b280: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
b290: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
b2a0: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
b2b0: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
b2c0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b2d0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
b2e0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
b2f0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
b300: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
b310: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
b320: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b330: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
b340: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
b350: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
b360: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
b370: 7b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {.  Tcl_SetObjRe
b380: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
b390: 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
b3a0: 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75  e3_libversion_nu
b3b0: 6d 62 65 72 28 29 29 29 3b 0a 20 20 72 65 74 75  mber()));.  retu
b3c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
b3d0: 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
b3e0: 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
b3f0: 6d 65 74 61 64 61 74 61 20 44 42 20 64 62 6e 61  metadata DB dbna
b400: 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61  me tblname colna
b410: 6d 65 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  me.**.*/.static 
b420: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
b430: 49 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c  I test_table_col
b440: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
b450: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
b460: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
b470: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
b480: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
b490: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
b4a0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
b4b0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
b4c0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
b4d0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
b4e0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
b4f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
b500: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
b510: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
b520: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
b530: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
b540: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
b550: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
b560: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73  har *zDb;.  cons
b570: 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20  t char *zTbl;.  
b580: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
b590: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63  ;.  int rc;.  Tc
b5a0: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
b5b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
b5c0: 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63  atype;.  const c
b5d0: 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20  har *zCollseq;. 
b5e0: 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20   int notnull;.  
b5f0: 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  int primarykey;.
b600: 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d    int autoincrem
b610: 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ent;..  if( objc
b620: 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
b630: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
b640: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
b650: 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62 6e 61  , objv, "DB dbna
b660: 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61  me tblname colna
b670: 6d 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  me");.    return
b680: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b690: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
b6a0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
b6b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
b6c0: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
b6d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44   TCL_ERROR;.  zD
b6e0: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
b6f0: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 54  g(objv[2]);.  zT
b700: 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  bl = Tcl_GetStri
b710: 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7a  ng(objv[3]);.  z
b720: 43 6f 6c 20 3d 20 6f 62 6a 63 3d 3d 35 20 3f 20  Col = objc==5 ? 
b730: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b740: 6a 76 5b 34 5d 29 20 3a 20 30 3b 0a 0a 20 20 69  jv[4]) : 0;..  i
b750: 66 28 20 73 74 72 6c 65 6e 28 7a 44 62 29 3d 3d  f( strlen(zDb)==
b760: 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a 0a 20 20  0 ) zDb = 0;..  
b770: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
b780: 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
b790: 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a 54 62 6c  ta(db, zDb, zTbl
b7a0: 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20 20 20 26  , zCol, .      &
b7b0: 7a 44 61 74 61 74 79 70 65 2c 20 26 7a 43 6f 6c  zDatatype, &zCol
b7c0: 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20  lseq, &notnull, 
b7d0: 26 70 72 69 6d 61 72 79 6b 65 79 2c 20 26 61 75  &primarykey, &au
b7e0: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b 0a 0a 20  toincrement);.. 
b7f0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
b800: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
b810: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
b820: 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
b830: 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72  g(db), 0);.    r
b840: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b850: 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54  .  }..  pRet = T
b860: 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
b870: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b880: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b890: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
b8a0: 6a 28 7a 44 61 74 61 74 79 70 65 2c 20 2d 31 29  j(zDatatype, -1)
b8b0: 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
b8c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
b8d0: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
b8e0: 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71  ringObj(zCollseq
b8f0: 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
b900: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
b910: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
b920: 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c  NewIntObj(notnul
b930: 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  l));.  Tcl_ListO
b940: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b950: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b960: 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72 79 6b 65  IntObj(primaryke
b970: 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  y));.  Tcl_ListO
b980: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b990: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b9a0: 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e 63 72 65  IntObj(autoincre
b9b0: 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65  ment));.  Tcl_Se
b9c0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
b9d0: 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74  p, pRet);..  ret
b9e0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
b9f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ba00: 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73 74 61  IT_INCRBLOB..sta
ba10: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
ba20: 43 4c 41 50 49 20 62 6c 6f 62 48 61 6e 64 6c 65  CLAPI blobHandle
ba30: 46 72 6f 6d 4f 62 6a 28 0a 20 20 54 63 6c 5f 49  FromObj(.  Tcl_I
ba40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
ba50: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c    Tcl_Obj *pObj,
ba60: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
ba70: 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a 20 20 63 68  **ppBlob.){.  ch
ba80: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ar *z;.  int n;.
ba90: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
baa0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a  ringFromObj(pObj
bab0: 2c 20 26 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  , &n);.  if( n==
bac0: 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 6c 6f 62  0 ){.    *ppBlob
bad0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
bae0: 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
baf0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
bb00: 63 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 43 6c 69  channel;.    Cli
bb10: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
bb20: 44 61 74 61 3b 0a 20 20 20 20 0a 20 20 20 20 63  Data;.    .    c
bb30: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74  hannel = Tcl_Get
bb40: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
bb50: 7a 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  z, &notUsed);.  
bb60: 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 20 29    if( !channel )
bb70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
bb80: 52 3b 0a 0a 20 20 20 20 54 63 6c 5f 46 6c 75 73  R;..    Tcl_Flus
bb90: 68 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20  h(channel);.    
bba0: 54 63 6c 5f 53 65 65 6b 28 63 68 61 6e 6e 65 6c  Tcl_Seek(channel
bbb0: 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  , 0, SEEK_SET);.
bbc0: 0a 20 20 20 20 69 6e 73 74 61 6e 63 65 44 61 74  .    instanceDat
bbd0: 61 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  a = Tcl_GetChann
bbe0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
bbf0: 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 2a 70 70  hannel);.    *pp
bc00: 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65  Blob = *((sqlite
bc10: 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e  3_blob **)instan
bc20: 63 65 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20  ceData);.  }..  
bc30: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
bc40: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  ..static int SQL
bc50: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
bc60: 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 0a 20 20 43  blob_reopen(.  C
bc70: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
bc80: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
bc90: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
bca0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
bcb0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
bcc0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
bcd0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
bce0: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
bcf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
bd00: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
bd10: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
bd20: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
bd30: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
bd40: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57  ts */.){.  Tcl_W
bd50: 69 64 65 49 6e 74 20 69 52 6f 77 69 64 3b 0a 20  ideInt iRowid;. 
bd60: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70   sqlite3_blob *p
bd70: 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Blob;.  int rc;.
bd80: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
bd90: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
bda0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
bdb0: 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c  , objv, "CHANNEL
bdc0: 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20 72 65   ROWID");.    re
bdd0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bde0: 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48    }..  if( blobH
bdf0: 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  andleFromObj(int
be00: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70  erp, objv[1], &p
be10: 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54  Blob) ) return T
be20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
be30: 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
be40: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
be50: 6a 76 5b 32 5d 2c 20 26 69 52 6f 77 69 64 29 20  jv[2], &iRowid) 
be60: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
be70: 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
be80: 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28  te3_blob_reopen(
be90: 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a  pBlob, iRowid);.
bea0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
beb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
bec0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
bed0: 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
bee0: 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  ErrName(rc), TCL
bef0: 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a  _VOLATILE);.  }.
bf00: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
bf10: 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f  QLITE_OK ? TCL_O
bf20: 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a  K : TCL_ERROR);.
bf30: 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  }..#endif../*.**
bf40: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
bf50: 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
bf60: 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20 4e 41  _v2 DB-HANDLE NA
bf70: 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d  ME CMP-PROC DEL-
bf80: 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  PROC.**.**   Thi
bf90: 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20 75 73  s Tcl proc is us
bfa0: 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74  ed for testing t
bfb0: 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a  he experimental.
bfc0: 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  **   sqlite3_cre
bfd0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
bfe0: 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f  () interface..*/
bff0: 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f 6c 6c  .struct TestColl
c000: 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c 5f 49  ationX {.  Tcl_I
c010: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20  nterp *interp;. 
c020: 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a   Tcl_Obj *pCmp;.
c030: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b    Tcl_Obj *pDel;
c040: 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74 72 75  .};.typedef stru
c050: 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  ct TestCollation
c060: 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58  X TestCollationX
c070: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  ;.static void te
c080: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
c090: 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74 78 29  nDel(void *pCtx)
c0a0: 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  {.  TestCollatio
c0b0: 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c  nX *p = (TestCol
c0c0: 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a  lationX *)pCtx;.
c0d0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f  .  int rc = Tcl_
c0e0: 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74  EvalObjEx(p->int
c0f0: 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20 54 43  erp, p->pDel, TC
c100: 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43  L_EVAL_DIRECT|TC
c110: 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a  L_EVAL_GLOBAL);.
c120: 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
c130: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b   ){.    Tcl_Back
c140: 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69  groundError(p->i
c150: 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 54  nterp);.  }..  T
c160: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c170: 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f  p->pCmp);.  Tcl_
c180: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
c190: 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  pDel);.  sqlite3
c1a0: 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29 70 29  _free((void *)p)
c1b0: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
c1c0: 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69  estCreateCollati
c1d0: 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20 2a 70  onCmp(.  void *p
c1e0: 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65 66 74  Ctx,.  int nLeft
c1f0: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
c200: 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e 52 69  zLeft,.  int nRi
c210: 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  ght,.  const voi
c220: 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20 20 54  d *zRight.){.  T
c230: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70  estCollationX *p
c240: 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f   = (TestCollatio
c250: 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c  nX *)pCtx;.  Tcl
c260: 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20 3d 20  _Obj *pScript = 
c270: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
c280: 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69 6e 74  (p->pCmp);.  int
c290: 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20 54 63   iRes = 0;..  Tc
c2a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
c2b0: 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c  Script);.  Tcl_L
c2c0: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
c2d0: 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20  ent(0, pScript, 
c2e0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
c2f0: 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74 2c 20  ((char *)zLeft, 
c300: 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c 5f 4c  nLeft));.  Tcl_L
c310: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
c320: 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74 2c 20  ent(0, pScript, 
c330: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
c340: 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68 74 2c  ((char *)zRight,
c350: 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69 66 28  nRight));..  if(
c360: 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61   TCL_OK!=Tcl_Eva
c370: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
c380: 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c 5f 45  , pScript, TCL_E
c390: 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45  VAL_DIRECT|TCL_E
c3a0: 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20 20 7c  VAL_GLOBAL).   |
c3b0: 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  | TCL_OK!=Tcl_Ge
c3c0: 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69  tIntFromObj(p->i
c3d0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62  nterp, Tcl_GetOb
c3e0: 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72  jResult(p->inter
c3f0: 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29 7b 0a  p), &iRes).  ){.
c400: 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75      Tcl_Backgrou
c410: 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72  ndError(p->inter
c420: 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65  p);.  }.  Tcl_De
c430: 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72 69  crRefCount(pScri
c440: 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 69  pt);..  return i
c450: 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  Res;.}.static in
c460: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
c470: 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  test_create_coll
c480: 61 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65  ation_v2(.  Clie
c490: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
c4a0: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
c4b0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
c4c0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
c4d0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
c4e0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
c4f0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
c500: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
c510: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c520: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
c530: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
c540: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
c550: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
c560: 2a 2f 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c  */.){.  TestColl
c570: 61 74 69 6f 6e 58 20 2a 70 3b 0a 20 20 73 71 6c  ationX *p;.  sql
c580: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
c590: 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
c5a0: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
c5b0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
c5c0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
c5d0: 48 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d  HANDLE NAME CMP-
c5e0: 50 52 4f 43 20 44 45 4c 2d 50 52 4f 43 22 29 3b  PROC DEL-PROC");
c5f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c600: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
c610: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
c620: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
c630: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
c640: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
c650: 45 52 52 4f 52 3b 0a 0a 20 20 70 20 3d 20 28 54  ERROR;..  p = (T
c660: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29  estCollationX *)
c670: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73  sqlite3_malloc(s
c680: 69 7a 65 6f 66 28 54 65 73 74 43 6f 6c 6c 61 74  izeof(TestCollat
c690: 69 6f 6e 58 29 29 3b 0a 20 20 70 2d 3e 70 43 6d  ionX));.  p->pCm
c6a0: 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 70  p = objv[3];.  p
c6b0: 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a 76 5b 34 5d  ->pDel = objv[4]
c6c0: 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20  ;.  p->interp = 
c6d0: 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 49 6e  interp;.  Tcl_In
c6e0: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43  crRefCount(p->pC
c6f0: 6d 70 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  mp);.  Tcl_IncrR
c700: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29  efCount(p->pDel)
c710: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
c720: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
c730: 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47 65  on_v2(db, Tcl_Ge
c740: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
c750: 2c 20 31 36 2c 20 0a 20 20 20 20 20 20 28 76 6f  , 16, .      (vo
c760: 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61  id *)p, testCrea
c770: 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20  teCollationCmp, 
c780: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c790: 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 69 66  ionDel.  );.  if
c7a0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53  ( rc!=SQLITE_MIS
c7b0: 55 53 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  USE ){.    Tcl_A
c7c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
c7d0: 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 63 72 65  rp, "sqlite3_cre
c7e0: 61 74 65 5f 63 6f 6c 6c 61 74 65 5f 76 32 28 29  ate_collate_v2()
c7f0: 20 66 61 69 6c 65 64 20 74 6f 20 64 65 74 65 63   failed to detec
c800: 74 20 22 0a 20 20 20 20 20 20 22 61 6e 20 69 6e  t ".      "an in
c810: 76 61 6c 69 64 20 65 6e 63 6f 64 69 6e 67 22 2c  valid encoding",
c820: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
c830: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c840: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
c850: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c860: 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c  ation_v2(db, Tcl
c870: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
c880: 32 5d 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  2]), SQLITE_UTF8
c890: 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a  , .      (void *
c8a0: 29 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  )p, testCreateCo
c8b0: 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74  llationCmp, test
c8c0: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44  CreateCollationD
c8d0: 65 6c 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e  el.  );.  return
c8e0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
c8f0: 2a 20 55 53 41 47 45 3a 20 73 71 6c 69 74 65 33  * USAGE: sqlite3
c900: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
c910: 5f 76 32 20 44 42 20 4e 41 4d 45 20 4e 41 52 47  _v2 DB NAME NARG
c920: 20 45 4e 43 20 3f 53 57 49 54 43 48 45 53 3f 0a   ENC ?SWITCHES?.
c930: 2a 2a 0a 2a 2a 20 41 76 61 69 6c 61 62 6c 65 20  **.** Available 
c940: 73 77 69 74 63 68 65 73 20 61 72 65 3a 0a 2a 2a  switches are:.**
c950: 0a 2a 2a 20 20 20 2d 66 75 6e 63 20 20 20 20 53  .**   -func    S
c960: 43 52 49 50 54 0a 2a 2a 20 20 20 2d 73 74 65 70  CRIPT.**   -step
c970: 20 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20      SCRIPT.**   
c980: 2d 66 69 6e 61 6c 20 20 20 53 43 52 49 50 54 0a  -final   SCRIPT.
c990: 2a 2a 20 20 20 2d 64 65 73 74 72 6f 79 20 53 43  **   -destroy SC
c9a0: 52 49 50 54 0a 2a 2f 0a 74 79 70 65 64 65 66 20  RIPT.*/.typedef 
c9b0: 73 74 72 75 63 74 20 43 72 65 61 74 65 46 75 6e  struct CreateFun
c9c0: 63 74 69 6f 6e 56 32 20 43 72 65 61 74 65 46 75  ctionV2 CreateFu
c9d0: 6e 63 74 69 6f 6e 56 32 3b 0a 73 74 72 75 63 74  nctionV2;.struct
c9e0: 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56   CreateFunctionV
c9f0: 32 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  2 {.  Tcl_Interp
ca00: 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
ca10: 4f 62 6a 20 2a 70 46 75 6e 63 3b 20 20 20 20 20  Obj *pFunc;     
ca20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
ca30: 63 72 69 70 74 20 66 6f 72 20 66 75 6e 63 74 69  cript for functi
ca40: 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  on invocation */
ca50: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 65  .  Tcl_Obj *pSte
ca60: 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
ca70: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
ca80: 20 61 67 67 2e 20 73 74 65 70 20 69 6e 76 6f 63   agg. step invoc
ca90: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ation */.  Tcl_O
caa0: 62 6a 20 2a 70 46 69 6e 61 6c 3b 20 20 20 20 20  bj *pFinal;     
cab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
cac0: 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 66 69  ript for agg. fi
cad0: 6e 61 6c 69 7a 61 74 69 6f 6e 20 69 6e 76 6f 63  nalization invoc
cae0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ation */.  Tcl_O
caf0: 62 6a 20 2a 70 44 65 73 74 72 6f 79 3b 20 20 20  bj *pDestroy;   
cb00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
cb10: 73 74 72 75 63 74 6f 72 20 73 63 72 69 70 74 20  structor script 
cb20: 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69  */.};.static voi
cb30: 64 20 63 66 32 46 75 6e 63 28 73 71 6c 69 74 65  d cf2Func(sqlite
cb40: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20  3_context *ctx, 
cb50: 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74 65  int nArg, sqlite
cb60: 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67 29 7b  3_value **aArg){
cb70: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  .}.static void c
cb80: 66 32 53 74 65 70 28 73 71 6c 69 74 65 33 5f 63  f2Step(sqlite3_c
cb90: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74  ontext *ctx, int
cba0: 20 6e 41 72 67 2c 20 73 71 6c 69 74 65 33 5f 76   nArg, sqlite3_v
cbb0: 61 6c 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a  alue **aArg){.}.
cbc0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32 46  static void cf2F
cbd0: 69 6e 61 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e  inal(sqlite3_con
cbe0: 74 65 78 74 20 2a 63 74 78 29 7b 0a 7d 0a 73 74  text *ctx){.}.st
cbf0: 61 74 69 63 20 76 6f 69 64 20 63 66 32 44 65 73  atic void cf2Des
cc00: 74 72 6f 79 28 76 6f 69 64 20 2a 70 55 73 65 72  troy(void *pUser
cc10: 29 7b 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74  ){.  CreateFunct
cc20: 69 6f 6e 56 32 20 2a 70 20 3d 20 28 43 72 65 61  ionV2 *p = (Crea
cc30: 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 29 70  teFunctionV2 *)p
cc40: 55 73 65 72 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  User;..  if( p->
cc50: 69 6e 74 65 72 70 20 26 26 20 70 2d 3e 70 44 65  interp && p->pDe
cc60: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 69 6e 74  stroy ){.    int
cc70: 20 72 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62   rc = Tcl_EvalOb
cc80: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
cc90: 2d 3e 70 44 65 73 74 72 6f 79 2c 20 30 29 3b 0a  ->pDestroy, 0);.
cca0: 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f      if( rc!=TCL_
ccb0: 4f 4b 20 29 20 54 63 6c 5f 42 61 63 6b 67 72 6f  OK ) Tcl_Backgro
ccc0: 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65  undError(p->inte
ccd0: 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  rp);.  }..  if( 
cce0: 70 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 44  p->pFunc ) Tcl_D
ccf0: 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ecrRefCount(p->p
cd00: 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d  Func); .  if( p-
cd10: 3e 70 53 74 65 70 20 29 20 54 63 6c 5f 44 65 63  >pStep ) Tcl_Dec
cd20: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74  rRefCount(p->pSt
cd30: 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  ep); .  if( p->p
cd40: 46 69 6e 61 6c 20 29 20 54 63 6c 5f 44 65 63 72  Final ) Tcl_Decr
cd50: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e  RefCount(p->pFin
cd60: 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  al); .  if( p->p
cd70: 44 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 44 65  Destroy ) Tcl_De
cd80: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44  crRefCount(p->pD
cd90: 65 73 74 72 6f 79 29 3b 20 0a 20 20 73 71 6c 69  estroy); .  sqli
cda0: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 73  te3_free(p);.}.s
cdb0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
cdc0: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 72 65  _TCLAPI test_cre
cdd0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
cde0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
cdf0: 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
ce00: 20 20 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a     /* Not used *
ce10: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
ce20: 69 6e 74 65 72 70 2c 20 20 20 20 20 20 20 20 20  interp,         
ce30: 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 76 6f 6b      /* The invok
ce40: 69 6e 67 20 54 43 4c 20 69 6e 74 65 72 70 72 65  ing TCL interpre
ce50: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  ter */.  int obj
ce60: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
ce70: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
ce80: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
ce90: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
cea0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 20 20 20 20  NST objv[]      
ceb0: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
cec0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
ced0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
cee0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
cef0: 6e 63 3b 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a  nc;.  int nArg;.
cf00: 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 43 72 65    int enc;.  Cre
cf10: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
cf20: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
cf30: 20 72 63 3b 0a 0a 20 20 73 74 72 75 63 74 20 45   rc;..  struct E
cf40: 6e 63 54 61 62 6c 65 20 7b 0a 20 20 20 20 63 6f  ncTable {.    co
cf50: 6e 73 74 20 63 68 61 72 20 2a 7a 45 6e 63 3b 0a  nst char *zEnc;.
cf60: 20 20 20 20 69 6e 74 20 65 6e 63 3b 0a 20 20 7d      int enc;.  }
cf70: 20 61 45 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20   aEnc[] = {.    
cf80: 7b 22 75 74 66 38 22 2c 20 20 20 20 53 51 4c 49  {"utf8",    SQLI
cf90: 54 45 5f 55 54 46 38 20 7d 2c 0a 20 20 20 20 7b  TE_UTF8 },.    {
cfa0: 22 75 74 66 31 36 22 2c 20 20 20 53 51 4c 49 54  "utf16",   SQLIT
cfb0: 45 5f 55 54 46 31 36 20 7d 2c 0a 20 20 20 20 7b  E_UTF16 },.    {
cfc0: 22 75 74 66 31 36 6c 65 22 2c 20 53 51 4c 49 54  "utf16le", SQLIT
cfd0: 45 5f 55 54 46 31 36 4c 45 20 7d 2c 0a 20 20 20  E_UTF16LE },.   
cfe0: 20 7b 22 75 74 66 31 36 62 65 22 2c 20 53 51 4c   {"utf16be", SQL
cff0: 49 54 45 5f 55 54 46 31 36 42 45 20 7d 2c 0a 20  ITE_UTF16BE },. 
d000: 20 20 20 7b 22 61 6e 79 22 2c 20 20 20 20 20 53     {"any",     S
d010: 51 4c 49 54 45 5f 41 4e 59 20 7d 2c 0a 20 20 20  QLITE_ANY },.   
d020: 20 7b 22 30 22 2c 20 30 20 7d 0a 20 20 7d 3b 0a   {"0", 0 }.  };.
d030: 0a 20 20 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c  .  if( objc<5 ||
d040: 20 28 6f 62 6a 63 25 32 29 3d 3d 30 20 29 7b 0a   (objc%2)==0 ){.
d050: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
d060: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
d070: 6f 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 4e  objv, "DB NAME N
d080: 41 52 47 20 45 4e 43 20 53 57 49 54 43 48 45 53  ARG ENC SWITCHES
d090: 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
d0a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
d0b0: 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
d0c0: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
d0d0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
d0e0: 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
d0f0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
d100: 7a 46 75 6e 63 20 3d 20 54 63 6c 5f 47 65 74 53  zFunc = Tcl_GetS
d110: 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
d120: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
d130: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
d140: 6f 62 6a 76 5b 33 5d 2c 20 26 6e 41 72 67 29 20  objv[3], &nArg) 
d150: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
d160: 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
d170: 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
d180: 75 63 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  uct(interp, objv
d190: 5b 34 5d 2c 20 61 45 6e 63 2c 20 73 69 7a 65 6f  [4], aEnc, sizeo
d1a0: 66 28 61 45 6e 63 5b 30 5d 29 2c 20 0a 20 20 20  f(aEnc[0]), .   
d1b0: 20 20 20 20 20 20 20 22 65 6e 63 6f 64 69 6e 67         "encoding
d1c0: 22 2c 20 30 2c 20 26 65 6e 63 29 0a 20 20 29 7b  ", 0, &enc).  ){
d1d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
d1e0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65 6e 63  ERROR;.  }.  enc
d1f0: 20 3d 20 61 45 6e 63 5b 65 6e 63 5d 2e 65 6e 63   = aEnc[enc].enc
d200: 3b 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  ;..  p = sqlite3
d210: 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43  _malloc(sizeof(C
d220: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29  reateFunctionV2)
d230: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  );.  assert( p )
d240: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  ;.  memset(p, 0,
d250: 20 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75   sizeof(CreateFu
d260: 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 70 2d  nctionV2));.  p-
d270: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
d280: 3b 0a 0a 20 20 66 6f 72 28 69 3d 35 3b 20 69 3c  ;..  for(i=5; i<
d290: 6f 62 6a 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20  objc; i+=2){.   
d2a0: 20 69 6e 74 20 69 53 77 69 74 63 68 3b 0a 20 20   int iSwitch;.  
d2b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
d2c0: 53 77 69 74 63 68 5b 5d 20 3d 20 7b 22 2d 66 75  Switch[] = {"-fu
d2d0: 6e 63 22 2c 20 22 2d 73 74 65 70 22 2c 20 22 2d  nc", "-step", "-
d2e0: 66 69 6e 61 6c 22 2c 20 22 2d 64 65 73 74 72 6f  final", "-destro
d2f0: 79 22 2c 20 30 7d 3b 0a 20 20 20 20 69 66 28 20  y", 0};.    if( 
d300: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
d310: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
d320: 5b 69 5d 2c 20 61 7a 53 77 69 74 63 68 2c 20 22  [i], azSwitch, "
d330: 73 77 69 74 63 68 22 2c 20 30 2c 20 26 69 53 77  switch", 0, &iSw
d340: 69 74 63 68 29 20 29 7b 0a 20 20 20 20 20 20 73  itch) ){.      s
d350: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
d360: 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
d370: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
d380: 20 20 20 73 77 69 74 63 68 28 20 69 53 77 69 74     switch( iSwit
d390: 63 68 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  ch ){.      case
d3a0: 20 30 3a 20 70 2d 3e 70 46 75 6e 63 20 3d 20 6f   0: p->pFunc = o
d3b0: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62  bjv[i+1];      b
d3c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
d3d0: 20 31 3a 20 70 2d 3e 70 53 74 65 70 20 3d 20 6f   1: p->pStep = o
d3e0: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62  bjv[i+1];      b
d3f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
d400: 20 32 3a 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20   2: p->pFinal = 
d410: 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 20 20 62  objv[i+1];     b
d420: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
d430: 20 33 3a 20 70 2d 3e 70 44 65 73 74 72 6f 79 20   3: p->pDestroy 
d440: 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 62  = objv[i+1];   b
d450: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
d460: 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29    if( p->pFunc )
d470: 20 70 2d 3e 70 46 75 6e 63 20 3d 20 54 63 6c 5f   p->pFunc = Tcl_
d480: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
d490: 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70  pFunc); .  if( p
d4a0: 2d 3e 70 53 74 65 70 20 29 20 70 2d 3e 70 53 74  ->pStep ) p->pSt
d4b0: 65 70 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61  ep = Tcl_Duplica
d4c0: 74 65 4f 62 6a 28 70 2d 3e 70 53 74 65 70 29 3b  teObj(p->pStep);
d4d0: 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61   .  if( p->pFina
d4e0: 6c 20 29 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20  l ) p->pFinal = 
d4f0: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
d500: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
d510: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
d520: 29 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20  ) p->pDestroy = 
d530: 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a  Tcl_DuplicateObj
d540: 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a  (p->pDestroy); .
d550: 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63 20  .  if( p->pFunc 
d560: 29 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75  ) Tcl_IncrRefCou
d570: 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  nt(p->pFunc); . 
d580: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
d590: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
d5a0: 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20 69  (p->pStep); .  i
d5b0: 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54  f( p->pFinal ) T
d5c0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
d5d0: 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69  p->pFinal); .  i
d5e0: 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29  f( p->pDestroy )
d5f0: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
d600: 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20  t(p->pDestroy); 
d610: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
d620: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
d630: 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e  _v2(db, zFunc, n
d640: 41 72 67 2c 20 65 6e 63 2c 20 28 76 6f 69 64 20  Arg, enc, (void 
d650: 2a 29 70 2c 20 0a 20 20 20 20 20 20 28 70 2d 3e  *)p, .      (p->
d660: 70 46 75 6e 63 20 3f 20 63 66 32 46 75 6e 63 20  pFunc ? cf2Func 
d670: 3a 20 30 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e  : 0),.      (p->
d680: 70 53 74 65 70 20 3f 20 63 66 32 53 74 65 70 20  pStep ? cf2Step 
d690: 3a 20 30 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e  : 0),.      (p->
d6a0: 70 46 69 6e 61 6c 20 3f 20 63 66 32 46 69 6e 61  pFinal ? cf2Fina
d6b0: 6c 20 3a 20 30 29 2c 0a 20 20 20 20 20 20 63 66  l : 0),.      cf
d6c0: 32 44 65 73 74 72 6f 79 0a 20 20 29 3b 0a 20 20  2Destroy.  );.  
d6d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
d6e0: 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73  K ){.    Tcl_Res
d6f0: 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
d700: 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
d710: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
d720: 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
d730: 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
d740: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
d750: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
d760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
d770: 3a 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65  : sqlite3_load_e
d780: 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44  xtension DB-HAND
d790: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a  LE FILE ?PROC?.*
d7a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
d7b0: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
d7c0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0a  load_extension(.
d7d0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
d7e0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20  entData, /* Not 
d7f0: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
d800: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
d810: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
d820: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
d830: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
d840: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d860: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
d870: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
d880: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
d890: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
d8a0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
d8b0: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
d8c0: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
d8d0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
d8e0: 61 72 20 2a 7a 44 62 3b 0a 20 20 63 68 61 72 20  ar *zDb;.  char 
d8f0: 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a  *zFile;.  char *
d900: 7a 50 72 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61  zProc = 0;.  cha
d910: 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20  r *zErr = 0;..  
d920: 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f  if( objc!=4 && o
d930: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
d940: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d950: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
d960: 22 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20  "DB-HANDLE FILE 
d970: 3f 50 52 4f 43 3f 22 29 3b 0a 20 20 20 20 72 65  ?PROC?");.    re
d980: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d990: 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
d9a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
d9b0: 5d 29 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63  ]);.  zFile = Tc
d9c0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
d9d0: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63  [2]);.  if( objc
d9e0: 3d 3d 34 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63  ==4 ){.    zProc
d9f0: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
da00: 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a  (objv[3]);.  }..
da10: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
da20: 20 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   C database hand
da30: 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20  le from the Tcl 
da40: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a  command name */.
da50: 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
da60: 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
da70: 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29  , zDb, &cmdInfo)
da80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
da90: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
daa0: 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
dab0: 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68  und: ", zDb, (ch
dac0: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
dad0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
dae0: 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63  }.  db = ((struc
daf0: 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49  t SqliteDb*)cmdI
db00: 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
db10: 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  a)->db;.  assert
db20: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c  (db);..  /* Call
db30: 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20   the underlying 
db40: 43 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61  C function. If a
db50: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
db60: 73 65 74 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20  set rc to .  ** 
db70: 54 43 4c 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f  TCL_ERROR and lo
db80: 61 64 20 61 6e 79 20 65 72 72 6f 72 20 73 74 72  ad any error str
db90: 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 69 6e 74  ing into the int
dba0: 65 72 70 72 65 74 65 72 2e 20 49 66 20 6e 6f 20  erpreter. If no 
dbb0: 0a 20 20 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75  .  ** error occu
dbc0: 72 73 2c 20 73 65 74 20 72 63 20 74 6f 20 54 43  rs, set rc to TC
dbd0: 4c 5f 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  L_OK..  */.#ifde
dbe0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
dbf0: 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72  AD_EXTENSION.  r
dc00: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
dc10: 3b 0a 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74  ;.  zErr = sqlit
dc20: 65 33 5f 6d 70 72 69 6e 74 66 28 22 74 68 69 73  e3_mprintf("this
dc30: 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c   build omits sql
dc40: 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  ite3_load_extens
dc50: 69 6f 6e 28 29 22 29 3b 0a 20 20 28 76 6f 69 64  ion()");.  (void
dc60: 29 7a 50 72 6f 63 3b 0a 20 20 28 76 6f 69 64 29  )zProc;.  (void)
dc70: 7a 46 69 6c 65 3b 0a 23 65 6c 73 65 0a 20 20 72  zFile;.#else.  r
dc80: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  c = sqlite3_load
dc90: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  _extension(db, z
dca0: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
dcb0: 72 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rr);.#endif.  if
dcc0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
dcd0: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
dce0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
dcf0: 72 20 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54  r ? zErr : "", T
dd00: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
dd10: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
dd20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
dd30: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a  c = TCL_OK;.  }.
dd40: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
dd50: 45 72 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Err);..  return 
dd60: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  rc;.}../*.** Usa
dd70: 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  ge: sqlite3_enab
dd80: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
dd90: 6e 20 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46  n DB-HANDLE ONOF
dda0: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
ddb0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
ddc0: 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a  st_enable_load(.
ddd0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
dde0: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20  entData, /* Not 
ddf0: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
de00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
de10: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
de20: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
de30: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
de40: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
de50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
de60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
de70: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
de80: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
de90: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
dea0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63  ments */.){.  Tc
deb0: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
dec0: 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  o;.  sqlite3 *db
ded0: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  ;.  char *zDb;. 
dee0: 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69   int onoff;..  i
def0: 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
df00: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
df10: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
df20: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4f  jv, "DB-HANDLE O
df30: 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65 74 75  NOFF");.    retu
df40: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
df50: 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
df60: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
df70: 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63 74 20  ;..  /* Extract 
df80: 74 68 65 20 43 20 64 61 74 61 62 61 73 65 20 68  the C database h
df90: 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65 20 54  andle from the T
dfa0: 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20  cl command name 
dfb0: 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65  */.  if( !Tcl_Ge
dfc0: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
dfd0: 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e  erp, zDb, &cmdIn
dfe0: 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  fo) ){.    Tcl_A
dff0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
e000: 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74  rp, "command not
e010: 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20   found: ", zDb, 
e020: 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
e030: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
e040: 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28 73 74  .  }.  db = ((st
e050: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
e060: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
e070: 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73  Data)->db;.  ass
e080: 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47  ert(db);..  /* G
e090: 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70 61 72  et the onoff par
e0a0: 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66 28 20  ameter */.  if( 
e0b0: 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
e0c0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
e0d0: 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[2], &onoff) )
e0e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
e0f0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66  _ERROR;.  }..#if
e100: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e110: 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
e120: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
e130: 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69 73 20  t(interp, "this 
e140: 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69  build omits sqli
e150: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
e160: 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75 72 6e  on()");.  return
e170: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73   TCL_ERROR;.#els
e180: 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  e.  sqlite3_enab
e190: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
e1a0: 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20  n(db, onoff);.  
e1b0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23  return TCL_OK;.#
e1c0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  endif.}../*.** U
e1d0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 61 62  sage:  sqlite_ab
e1e0: 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f  ort.**.** Shutdo
e1f0: 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20 69  wn the process i
e200: 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54 68 69  mmediately.  Thi
e210: 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e  s is not a clean
e220: 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68   shutdown..** Th
e230: 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73  is command is us
e240: 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 72  ed to test the r
e250: 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20 6f 66  ecoverability of
e260: 20 61 20 64 61 74 61 62 61 73 65 20 69 6e 0a 2a   a database in.*
e270: 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61  * the event of a
e280: 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a   program crash..
e290: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
e2a0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69  LITE_TCLAPI sqli
e2b0: 74 65 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64  te_abort(.  void
e2c0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
e2d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
e2e0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
e2f0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
e300: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
e310: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
e320: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
e330: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
e340: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
e350: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
e360: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
e370: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
e380: 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
e390: 4d 53 43 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65  MSC_VER).  /* We
e3a0: 20 64 6f 20 74 68 69 73 2c 20 6f 74 68 65 72 77   do this, otherw
e3b0: 69 73 65 20 74 68 65 20 74 65 73 74 20 77 69 6c  ise the test wil
e3c0: 6c 20 68 61 6c 74 20 77 69 74 68 20 61 20 70 6f  l halt with a po
e3d0: 70 75 70 20 6d 65 73 73 61 67 65 0a 20 20 20 2a  pup message.   *
e3e0: 20 74 68 61 74 20 77 65 20 68 61 76 65 20 74 6f   that we have to
e3f0: 20 63 6c 69 63 6b 20 61 77 61 79 20 62 65 66 6f   click away befo
e400: 72 65 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c  re the test will
e410: 20 63 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f   continue..   */
e420: 0a 20 20 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65  .  _set_abort_be
e430: 68 61 76 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c  havior( 0, _CALL
e440: 5f 52 45 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a  _REPORTFAULT );.
e450: 23 65 6e 64 69 66 0a 20 20 65 78 69 74 28 32 35  #endif.  exit(25
e460: 35 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e  5);.  assert( in
e470: 74 65 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20  terp==0 );   /* 
e480: 54 68 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73  This will always
e490: 20 66 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72   fail */.  retur
e4a0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
e4b0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
e4c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73   routine is a us
e4d0: 65 72 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66  er-defined SQL f
e4e0: 75 6e 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75  unction whose pu
e4f0: 72 70 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74  rpose.** is to t
e500: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73  est the sqlite_s
e510: 65 74 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e  et_result() API.
e520: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e530: 74 65 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33  testFunc(sqlite3
e540: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
e550: 74 2c 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c  t, int argc, sql
e560: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
e570: 76 29 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67  v){.  while( arg
e580: 63 3e 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73  c>=2 ){.    cons
e590: 74 20 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20  t char *zArg0 = 
e5a0: 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
e5b0: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
e5c0: 5d 29 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67  ]);.    if( zArg
e5d0: 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30  0 ){.      if( 0
e5e0: 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ==sqlite3StrICmp
e5f0: 28 7a 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29  (zArg0, "int") )
e600: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e610: 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e  3_result_int(con
e620: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
e630: 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29  lue_int(argv[1])
e640: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
e650: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
e660: 70 28 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29  p(zArg0,"int64")
e670: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
e680: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
e690: 74 36 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  t64(context, sql
e6a0: 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34  ite3_value_int64
e6b0: 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20  (argv[1]));.    
e6c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
e6d0: 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30  te3StrICmp(zArg0
e6e0: 2c 22 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b  ,"string")==0 ){
e6f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
e700: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
e710: 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c  text, (char*)sql
e720: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
e730: 61 72 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20  argv[1]), -1,.  
e740: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
e750: 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20  _TRANSIENT);.   
e760: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
e770: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
e780: 30 2c 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29  0,"double")==0 )
e790: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
e7a0: 33 5f 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28  3_result_double(
e7b0: 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33  context, sqlite3
e7c0: 5f 76 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72  _value_double(ar
e7d0: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
e7e0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
e7f0: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e  StrICmp(zArg0,"n
e800: 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
e810: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
e820: 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29  lt_null(context)
e830: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
e840: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
e850: 28 7a 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d  (zArg0,"value")=
e860: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
e870: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
e880: 75 65 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76  ue(context, argv
e890: 5b 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69  [sqlite3_value_i
e8a0: 6e 74 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20  nt(argv[1])]);. 
e8b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
e8c0: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
e8d0: 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
e8e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74  }else{.      got
e8f0: 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20  o error_out;.   
e900: 20 7d 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32   }.    argc -= 2
e910: 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b  ;.    argv += 2;
e920: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a  .  }.  return;..
e930: 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  error_out:.  sql
e940: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
e950: 72 28 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74  r(context,"first
e960: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
e970: 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20   be one of: ".  
e980: 20 20 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73      "int int64 s
e990: 74 72 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c  tring double nul
e9a0: 6c 20 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d  l value", -1);.}
e9b0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
e9c0: 20 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72   sqlite_register
e9d0: 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20  _test_function  
e9e0: 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52  DB  NAME.**.** R
e9f0: 65 67 69 73 74 65 72 20 74 68 65 20 74 65 73 74  egister the test
ea00: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e   SQL function on
ea10: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42   the database DB
ea20: 20 75 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20   under the name 
ea30: 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME..*/.static 
ea40: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
ea50: 49 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  I test_register_
ea60: 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  func(.  void *No
ea70: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
ea80: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
ea90: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
eaa0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
eab0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
eac0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
eae0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
eaf0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
eb00: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
eb10: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
eb20: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
eb30: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
eb40: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
eb50: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
eb60: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
eb70: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
eb80: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
eb90: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
eba0: 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49       " DB FUNCTI
ebb0: 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20  ON-NAME", 0);.  
ebc0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
ebd0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
ebe0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
ebf0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
ec00: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
ec10: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
ec20: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
ec30: 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
ec40: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
ec50: 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74  , 0, .      test
ec60: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
ec70: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
ec80: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
ec90: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
eca0: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
ecb0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ecc0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ecd0: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
ece0: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
ecf0: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
ed00: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
ed10: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
ed20: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
ed30: 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20  _finalize  STMT 
ed40: 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  .**.** Finalize 
ed50: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
ed60: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
ed70: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
ed80: 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20  test_finalize(. 
ed90: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
eda0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
edb0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
edc0: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
edd0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
ede0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
edf0: 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
ee00: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
ee10: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
ee20: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
ee30: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
ee40: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
ee50: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
ee60: 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
ee70: 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
ee80: 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
ee90: 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
eea0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
eeb0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
eec0: 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
eed0: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
eee0: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
eef0: 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
ef00: 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53  ERROR;..  if( pS
ef10: 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 20 3d 20  tmt ){.    db = 
ef20: 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 3b  StmtToDb(pStmt);
ef30: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
ef40: 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
ef50: 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  mt);.  Tcl_SetRe
ef60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
ef70: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
ef80: 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
ef90: 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26 20 73  );.  if( db && s
efa0: 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
efb0: 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63  e(interp, db, rc
efc0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
efd0: 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54  RROR;.  return T
efe0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
eff0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
f000: 73 74 6d 74 5f 73 74 61 74 75 73 20 20 53 54 4d  stmt_status  STM
f010: 54 20 20 43 4f 44 45 20 20 52 45 53 45 54 46 4c  T  CODE  RESETFL
f020: 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74 20 74 68 65  AG.**.** Get the
f030: 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74   value of a stat
f040: 75 73 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20  us counter from 
f050: 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
f060: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
f070: 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74  E_TCLAPI test_st
f080: 6d 74 5f 73 74 61 74 75 73 28 0a 20 20 76 6f 69  mt_status(.  voi
f090: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
f0a0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
f0b0: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
f0c0: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
f0d0: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
f0e0: 6e 74 20 69 56 61 6c 75 65 3b 0a 20 20 69 6e 74  nt iValue;.  int
f0f0: 20 69 2c 20 6f 70 20 3d 20 30 2c 20 72 65 73 65   i, op = 0, rese
f100: 74 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63  tFlag;.  const c
f110: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20  har *zOpName;.  
f120: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
f130: 74 6d 74 3b 0a 0a 20 20 73 74 61 74 69 63 20 63  tmt;..  static c
f140: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
f150: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
f160: 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b  ame;.    int op;
f170: 0a 20 20 7d 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20  .  } aOp[] = {. 
f180: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
f190: 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
f1a0: 5f 53 54 45 50 22 2c 20 20 20 53 51 4c 49 54 45  _STEP",   SQLITE
f1b0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
f1c0: 53 43 41 4e 5f 53 54 45 50 20 20 20 7d 2c 0a 20  SCAN_STEP   },. 
f1d0: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
f1e0: 54 53 54 41 54 55 53 5f 53 4f 52 54 22 2c 20 20  TSTATUS_SORT",  
f1f0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f200: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
f210: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
f220: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
f230: 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
f240: 58 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  X",       SQLITE
f250: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
f260: 49 4e 44 45 58 20 20 20 20 20 20 20 7d 2c 0a 20  INDEX       },. 
f270: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
f280: 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 22  TSTATUS_VM_STEP"
f290: 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
f2a0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53  _STMTSTATUS_VM_S
f2b0: 54 45 50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TEP         },. 
f2c0: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
f2d0: 54 53 54 41 54 55 53 5f 52 45 50 52 45 50 41 52  TSTATUS_REPREPAR
f2e0: 45 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  E",       SQLITE
f2f0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 45 50 52  _STMTSTATUS_REPR
f300: 45 50 41 52 45 20 20 20 20 20 20 20 7d 2c 0a 20  EPARE       },. 
f310: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
f320: 54 53 54 41 54 55 53 5f 52 55 4e 22 2c 20 20 20  TSTATUS_RUN",   
f330: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
f340: 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 55 4e 20  _STMTSTATUS_RUN 
f350: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
f360: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
f370: 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44 22  TSTATUS_MEMUSED"
f380: 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
f390: 5f 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55  _STMTSTATUS_MEMU
f3a0: 53 45 44 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  SED         },. 
f3b0: 20 7d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d   };.  if( objc!=
f3c0: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
f3d0: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
f3e0: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
f3f0: 20 50 41 52 41 4d 45 54 45 52 20 52 45 53 45 54   PARAMETER RESET
f400: 46 4c 41 47 22 29 3b 0a 20 20 20 20 72 65 74 75  FLAG");.    retu
f410: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f420: 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
f430: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
f440: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f450: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
f460: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f470: 52 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 54  R;.  zOpName = T
f480: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
f490: 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
f4a0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4f  ; i<ArraySize(aO
f4b0: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  p); i++){.    if
f4c0: 28 20 73 74 72 63 6d 70 28 61 4f 70 5b 69 5d 2e  ( strcmp(aOp[i].
f4d0: 7a 4e 61 6d 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d  zName, zOpName)=
f4e0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d  =0 ){.      op =
f4f0: 20 61 4f 70 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20   aOp[i].op;.    
f500: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
f510: 20 7d 0a 20 20 69 66 28 20 69 3e 3d 41 72 72 61   }.  if( i>=Arra
f520: 79 53 69 7a 65 28 61 4f 70 29 20 29 7b 0a 20 20  ySize(aOp) ){.  
f530: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
f540: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f550: 6f 62 6a 76 5b 32 5d 2c 20 26 6f 70 29 20 29 20  objv[2], &op) ) 
f560: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
f570: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
f580: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
f590: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
f5a0: 5d 2c 20 26 72 65 73 65 74 46 6c 61 67 29 20 29  ], &resetFlag) )
f5b0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f5c0: 52 3b 0a 20 20 69 56 61 6c 75 65 20 3d 20 73 71  R;.  iValue = sq
f5d0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
f5e0: 73 28 70 53 74 6d 74 2c 20 6f 70 2c 20 72 65 73  s(pStmt, op, res
f5f0: 65 74 46 6c 61 67 29 3b 0a 20 20 54 63 6c 5f 53  etFlag);.  Tcl_S
f600: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
f610: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
f620: 6a 28 69 56 61 6c 75 65 29 29 3b 0a 20 20 72 65  j(iValue));.  re
f630: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
f640: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
f650: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
f660: 41 54 55 53 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ATUS./*.** Usage
f670: 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  :  sqlite3_stmt_
f680: 73 63 61 6e 73 74 61 74 75 73 20 53 54 4d 54 20  scanstatus STMT 
f690: 49 44 58 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  IDX.*/.static in
f6a0: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
f6b0: 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74  test_stmt_scanst
f6c0: 61 74 75 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  atus(.  void * c
f6d0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
f6e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
f6f0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
f700: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
f710: 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
f720: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
f730: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
f740: 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  st argument */. 
f750: 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20 20 20   int idx;       
f760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f770: 20 2f 2a 20 53 65 63 6f 6e 64 20 61 72 67 75 6d   /* Second argum
f780: 65 6e 74 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20  ent */..  const 
f790: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63  char *zName;.  c
f7a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c  onst char *zExpl
f7b0: 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  ain;.  sqlite3_i
f7c0: 6e 74 36 34 20 6e 4c 6f 6f 70 3b 0a 20 20 73 71  nt64 nLoop;.  sq
f7d0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 56 69 73  lite3_int64 nVis
f7e0: 69 74 3b 0a 20 20 64 6f 75 62 6c 65 20 72 45 73  it;.  double rEs
f7f0: 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20  t;.  int res;.. 
f800: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
f810: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
f820: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
f830: 6f 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 22  objv, "STMT IDX"
f840: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f850: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
f860: 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
f870: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
f880: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
f890: 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
f8a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f8b0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
f8c0: 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
f8d0: 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
f8e0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f8f0: 0a 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65  ..  res = sqlite
f900: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f910: 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51  s(pStmt, idx, SQ
f920: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c  LITE_SCANSTAT_NL
f930: 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f  OOP, (void*)&nLo
f940: 6f 70 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d  op);.  if( res==
f950: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  0 ){.    Tcl_Obj
f960: 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77   *pRet = Tcl_New
f970: 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  Obj();.    Tcl_L
f980: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f990: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f9a0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
f9b0: 4c 6f 6f 70 22 2c 20 2d 31 29 29 3b 0a 20 20 20  Loop", -1));.   
f9c0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
f9d0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
f9e0: 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  t, Tcl_NewWideIn
f9f0: 74 4f 62 6a 28 6e 4c 6f 6f 70 29 29 3b 0a 20 20  tObj(nLoop));.  
fa00: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
fa10: 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c  canstatus(pStmt,
fa20: 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41   idx, SQLITE_SCA
fa30: 4e 53 54 41 54 5f 4e 56 49 53 49 54 2c 20 28 76  NSTAT_NVISIT, (v
fa40: 6f 69 64 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20  oid*)&nVisit);. 
fa50: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
fa60: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
fa70: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
fa80: 6e 67 4f 62 6a 28 22 6e 56 69 73 69 74 22 2c 20  ngObj("nVisit", 
fa90: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
faa0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
fab0: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
fac0: 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 56  NewWideIntObj(nV
fad0: 69 73 69 74 29 29 3b 0a 20 20 20 20 73 71 6c 69  isit));.    sqli
fae0: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
faf0: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
fb00: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
fb10: 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73  EST, (void*)&rEs
fb20: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  t);.    Tcl_List
fb30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fb40: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
fb50: 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 45 73 74  wStringObj("nEst
fb60: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
fb70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
fb80: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
fb90: 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28  cl_NewDoubleObj(
fba0: 72 45 73 74 29 29 3b 0a 20 20 20 20 73 71 6c 69  rEst));.    sqli
fbb0: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fbc0: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
fbd0: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
fbe0: 4e 41 4d 45 2c 20 28 76 6f 69 64 2a 29 26 7a 4e  NAME, (void*)&zN
fbf0: 61 6d 65 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ame);.    Tcl_Li
fc00: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
fc10: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
fc20: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 7a 4e  NewStringObj("zN
fc30: 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20  ame", -1));.    
fc40: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
fc50: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
fc60: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fc70: 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a  bj(zName, -1));.
fc80: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
fc90: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
fca0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
fcb0: 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c  CANSTAT_EXPLAIN,
fcc0: 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69   (void*)&zExplai
fcd0: 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  n);.    Tcl_List
fce0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fcf0: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
fd00: 77 53 74 72 69 6e 67 4f 62 6a 28 22 7a 45 78 70  wStringObj("zExp
fd10: 6c 61 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20  lain", -1));.   
fd20: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
fd30: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
fd40: 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
fd50: 4f 62 6a 28 7a 45 78 70 6c 61 69 6e 2c 20 2d 31  Obj(zExplain, -1
fd60: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  ));.    Tcl_SetO
fd70: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
fd80: 20 70 52 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b   pRet);.  }else{
fd90: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
fda0: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
fdb0: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
fdc0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
fdd0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e:  sqlite3_stmt
fde0: 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65  _scanstatus_rese
fdf0: 74 20 20 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69  t  STMT.*/.stati
fe00: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
fe10: 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f 73 63  API test_stmt_sc
fe20: 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 28 0a  anstatus_reset(.
fe30: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
fe40: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
fe50: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
fe60: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
fe70: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
fe80: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
fe90: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20   *pStmt;        
fea0: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67      /* First arg
feb0: 75 6d 65 6e 74 20 2a 2f 0a 20 20 69 66 28 20 6f  ument */.  if( o
fec0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
fed0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
fee0: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
fef0: 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
ff00: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
ff10: 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
ff20: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
ff30: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ff40: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
ff50: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
ff60: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  OR;.  sqlite3_st
ff70: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65  mt_scanstatus_re
ff80: 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 72 65  set(pStmt);.  re
ff90: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
ffa0: 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
ffb0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
ffc0: 4f 47 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  OG./*.** Usage: 
ffd0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f   sqlite3_config_
ffe0: 73 71 6c 6c 6f 67 0a 2a 2a 0a 2a 2a 20 5a 65 72  sqllog.**.** Zer
fff0: 6f 20 74 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  o the SQLITE_CON
10000 46 49 47 5f 53 51 4c 4c 4f 47 20 63 6f 6e 66 69  FIG_SQLLOG confi
10010 67 75 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  guration.*/.stat
10020 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
10030 4c 41 50 49 20 74 65 73 74 5f 63 6f 6e 66 69 67  LAPI test_config
10040 5f 73 71 6c 6c 6f 67 28 0a 20 20 76 6f 69 64 20  _sqllog(.  void 
10050 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
10060 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10070 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
10080 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
10090 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
100a0 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
100b0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
100c0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
100d0 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72  , "");.    retur
100e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
100f0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
10100 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
10110 53 51 4c 4c 4f 47 2c 20 30 2c 20 30 29 3b 0a 20  SQLLOG, 0, 0);. 
10120 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10130 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
10140 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
10150 63 6f 6e 66 69 67 5f 73 6f 72 74 65 72 72 65 66  config_sorterref
10160 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 53  .**.** Set the S
10170 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 4f 52  QLITE_CONFIG_SOR
10180 54 45 52 52 45 46 5f 53 49 5a 45 20 63 6f 6e 66  TERREF_SIZE conf
10190 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
101a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
101b0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
101c0 74 5f 63 6f 6e 66 69 67 5f 73 6f 72 74 65 72 72  t_config_sorterr
101d0 65 66 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ef(.  void * cli
101e0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
101f0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10200 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10210 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10220 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c  [].){.  int iVal
10230 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
10240 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
10250 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10260 31 2c 20 6f 62 6a 76 2c 20 22 4e 42 59 54 45 22  1, objv, "NBYTE"
10270 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10280 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
10290 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
102a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
102b0 76 5b 31 5d 2c 20 26 69 56 61 6c 29 20 29 20 72  v[1], &iVal) ) r
102c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
102d0 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69  .  sqlite3_confi
102e0 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
102f0 53 4f 52 54 45 52 52 45 46 5f 53 49 5a 45 2c 20  SORTERREF_SIZE, 
10300 69 56 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  iVal);.  return 
10310 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10320 20 55 73 61 67 65 3a 20 76 66 73 5f 63 75 72 72   Usage: vfs_curr
10330 65 6e 74 5f 74 69 6d 65 5f 69 6e 74 36 34 0a 2a  ent_time_int64.*
10340 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
10350 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
10360 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  y the default VF
10370 53 27 73 20 78 43 75 72 72 65 6e 74 54 69 6d 65  S's xCurrentTime
10380 49 6e 74 36 34 20 6d 65 74 68 6f 64 2e 0a 2a 2f  Int64 method..*/
10390 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
103a0 54 45 5f 54 43 4c 41 50 49 20 76 66 73 43 75 72  TE_TCLAPI vfsCur
103b0 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 0a 20  rentTimeInt64(. 
103c0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
103d0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
103e0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
103f0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
10400 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
10410 0a 20 20 69 36 34 20 74 3b 0a 20 20 73 71 6c 69  .  i64 t;.  sqli
10420 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
10430 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
10440 28 30 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  (0);.  if( objc!
10450 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
10460 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10470 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b  p, 1, objv, "");
10480 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10490 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 66  ERROR;.  }.  pVf
104a0 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49  s->xCurrentTimeI
104b0 6e 74 36 34 28 70 56 66 73 2c 20 26 74 29 3b 0a  nt64(pVfs, &t);.
104c0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
104d0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
104e0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 74 29 29  ewWideIntObj(t))
104f0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
10500 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
10510 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
10520 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  HOT./*.** Usage:
10530 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
10540 74 5f 67 65 74 20 44 42 20 44 42 4e 41 4d 45 0a  t_get DB DBNAME.
10550 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
10560 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
10570 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 0a 20  _snapshot_get(. 
10580 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
10590 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
105a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
105b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
105c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
105d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
105e0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
105f0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74   *zName;.  sqlit
10600 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e  e3_snapshot *pSn
10610 61 70 73 68 6f 74 20 3d 20 30 3b 0a 0a 20 20 69  apshot = 0;..  i
10620 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
10630 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10640 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
10650 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29  jv, "DB DBNAME")
10660 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10670 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
10680 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
10690 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
106a0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
106b0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
106c0 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20  _ERROR;.  zName 
106d0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
106e0 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 72 63 20  objv[2]);..  rc 
106f0 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  = sqlite3_snapsh
10700 6f 74 5f 67 65 74 28 64 62 2c 20 7a 4e 61 6d 65  ot_get(db, zName
10710 2c 20 26 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  , &pSnapshot);. 
10720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10730 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  OK ){.    Tcl_Se
10740 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10750 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
10760 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61  Obj(sqlite3ErrNa
10770 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20  me(rc), -1));.  
10780 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10790 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
107a0 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
107b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
107c0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
107d0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
107e0 20 70 53 6e 61 70 73 68 6f 74 29 20 29 20 72 65   pSnapshot) ) re
107f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10800 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
10810 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
10820 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42  _NewStringObj(zB
10830 75 66 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  uf, -1));.  }.  
10840 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10850 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10860 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
10870 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  T */..#ifdef SQL
10880 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
10890 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  HOT./*.** Usage:
108a0 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
108b0 74 5f 72 65 63 6f 76 65 72 20 44 42 20 44 42 4e  t_recover DB DBN
108c0 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  AME.*/.static in
108d0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
108e0 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 72 65  test_snapshot_re
108f0 63 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20  cover(.  void * 
10900 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10910 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10920 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10930 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10940 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72  bjv[].){.  int r
10950 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
10960 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
10970 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
10980 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
10990 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
109a0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e  1, objv, "DB DBN
109b0 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
109c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
109d0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
109e0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
109f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10a00 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
10a10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
10a20 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
10a30 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a  ring(objv[2]);..
10a40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
10a50 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28  napshot_recover(
10a60 64 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  db, zName);.  if
10a70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10a80 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
10a90 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10aa0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10ab0 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  (sqlite3ErrName(
10ac0 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72  rc), -1));.    r
10ad0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10ae0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
10af0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
10b00 74 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74  terp);.  }.  ret
10b10 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
10b20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
10b30 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
10b40 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
10b50 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
10b60 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
10b70 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f  lite3_snapshot_o
10b80 70 65 6e 20 44 42 20 44 42 4e 41 4d 45 20 53 4e  pen DB DBNAME SN
10b90 41 50 53 48 4f 54 0a 2a 2f 0a 73 74 61 74 69 63  APSHOT.*/.static
10ba0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
10bb0 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74  PI test_snapshot
10bc0 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20  _open(.  void * 
10bd0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10be0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10bf0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10c00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10c10 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72  bjv[].){.  int r
10c20 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
10c30 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
10c40 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
10c50 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 3b 0a  hot *pSnapshot;.
10c60 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
10c70 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
10c80 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
10c90 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41  , objv, "DB DBNA
10ca0 4d 45 20 53 4e 41 50 53 48 4f 54 22 29 3b 0a 20  ME SNAPSHOT");. 
10cb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10cc0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
10cd0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
10ce0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
10cf0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
10d00 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
10d10 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54  ROR;.  zName = T
10d20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10d30 76 5b 32 5d 29 3b 0a 20 20 70 53 6e 61 70 73 68  v[2]);.  pSnapsh
10d40 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 6e  ot = (sqlite3_sn
10d50 61 70 73 68 6f 74 2a 29 73 71 6c 69 74 65 33 54  apshot*)sqlite3T
10d60 65 73 74 54 65 78 74 54 6f 50 74 72 28 54 63 6c  estTextToPtr(Tcl
10d70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10d80 33 5d 29 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  3]));..  rc = sq
10d90 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f  lite3_snapshot_o
10da0 70 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70  pen(db, zName, p
10db0 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 69 66 28  Snapshot);.  if(
10dc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10dd0 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  {.    Tcl_SetObj
10de0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
10df0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
10e00 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
10e10 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65  c), -1));.    re
10e20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
10e40 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
10e50 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  erp);.  }.  retu
10e60 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
10e70 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
10e80 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f  ABLE_SNAPSHOT */
10e90 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
10ea0 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a  ENABLE_SNAPSHOT.
10eb0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
10ec0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
10ed0 65 65 20 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73  ee SNAPSHOT.*/.s
10ee0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
10ef0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61  _TCLAPI test_sna
10f00 70 73 68 6f 74 5f 66 72 65 65 28 0a 20 20 76 6f  pshot_free(.  vo
10f10 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
10f20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
10f30 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
10f40 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
10f50 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
10f60 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10f70 20 2a 70 53 6e 61 70 73 68 6f 74 3b 0a 20 20 69   *pSnapshot;.  i
10f80 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
10f90 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10fa0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
10fb0 6a 76 2c 20 22 53 4e 41 50 53 48 4f 54 22 29 3b  jv, "SNAPSHOT");
10fc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10fd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 53 6e  ERROR;.  }.  pSn
10fe0 61 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74 65  apshot = (sqlite
10ff0 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69  3_snapshot*)sqli
11000 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
11010 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f  (Tcl_GetString(o
11020 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 73 71 6c 69  bjv[1]));.  sqli
11030 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65  te3_snapshot_fre
11040 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20  e(pSnapshot);.  
11050 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11060 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11070 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
11080 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  T */..#ifdef SQL
11090 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
110a0 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  HOT./*.** Usage:
110b0 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
110c0 74 5f 63 6d 70 20 53 4e 41 50 53 48 4f 54 31 20  t_cmp SNAPSHOT1 
110d0 53 4e 41 50 53 48 4f 54 32 0a 2a 2f 0a 73 74 61  SNAPSHOT2.*/.sta
110e0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
110f0 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70 73  CLAPI test_snaps
11100 68 6f 74 5f 63 6d 70 28 0a 20 20 76 6f 69 64 20  hot_cmp(.  void 
11110 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
11120 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11130 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11140 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11150 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
11160 20 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f   res;.  sqlite3_
11170 73 6e 61 70 73 68 6f 74 20 2a 70 31 3b 0a 20 20  snapshot *p1;.  
11180 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11190 20 2a 70 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63   *p2;.  if( objc
111a0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
111b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
111c0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4e  rp, 1, objv, "SN
111d0 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48 4f 54  APSHOT1 SNAPSHOT
111e0 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  2");.    return 
111f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11200 20 70 31 20 3d 20 28 73 71 6c 69 74 65 33 5f 73   p1 = (sqlite3_s
11210 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74 65 33  napshot*)sqlite3
11220 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 54 63  TestTextToPtr(Tc
11230 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11240 5b 31 5d 29 29 3b 0a 20 20 70 32 20 3d 20 28 73  [1]));.  p2 = (s
11250 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a  qlite3_snapshot*
11260 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74  )sqlite3TestText
11270 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72  ToPtr(Tcl_GetStr
11280 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20  ing(objv[2]));. 
11290 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 73   res = sqlite3_s
112a0 6e 61 70 73 68 6f 74 5f 63 6d 70 28 70 31 2c 20  napshot_cmp(p1, 
112b0 70 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  p2);.  Tcl_SetOb
112c0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
112d0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
112e0 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  s));.  return TC
112f0 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
11300 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
11310 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66  SNAPSHOT */..#if
11320 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11330 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
11340 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
11350 73 6e 61 70 73 68 6f 74 5f 67 65 74 5f 62 6c 6f  snapshot_get_blo
11360 62 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73  b DB DBNAME.*/.s
11370 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
11380 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61  _TCLAPI test_sna
11390 70 73 68 6f 74 5f 67 65 74 5f 62 6c 6f 62 28 0a  pshot_get_blob(.
113a0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
113b0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
113c0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
113d0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
113e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
113f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
11400 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
11410 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69  r *zName;.  sqli
11420 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53  te3_snapshot *pS
11430 6e 61 70 73 68 6f 74 20 3d 20 30 3b 0a 0a 20 20  napshot = 0;..  
11440 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
11450 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
11460 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
11470 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22  bjv, "DB DBNAME"
11480 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11490 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
114a0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
114b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
114c0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
114d0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
114e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65  L_ERROR;.  zName
114f0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11500 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 72 63  (objv[2]);..  rc
11510 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73   = sqlite3_snaps
11520 68 6f 74 5f 67 65 74 28 64 62 2c 20 7a 4e 61 6d  hot_get(db, zNam
11530 65 2c 20 26 70 53 6e 61 70 73 68 6f 74 29 3b 0a  e, &pSnapshot);.
11540 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11550 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  _OK ){.    Tcl_S
11560 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11570 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
11580 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e  gObj(sqlite3ErrN
11590 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20  ame(rc), -1));. 
115a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
115b0 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ROR;.  }else{.  
115c0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
115d0 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
115e0 20 20 20 20 54 63 6c 5f 4e 65 77 42 79 74 65 41      Tcl_NewByteA
115f0 72 72 61 79 4f 62 6a 28 28 75 6e 73 69 67 6e 65  rrayObj((unsigne
11600 64 20 63 68 61 72 2a 29 70 53 6e 61 70 73 68 6f  d char*)pSnapsho
11610 74 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  t, sizeof(sqlite
11620 33 5f 73 6e 61 70 73 68 6f 74 29 29 0a 20 20 20  3_snapshot)).   
11630 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   );.    sqlite3_
11640 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 70 53  snapshot_free(pS
11650 6e 61 70 73 68 6f 74 29 3b 0a 20 20 7d 0a 20 20  napshot);.  }.  
11660 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
11670 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
11680 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
11690 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  T */..#ifdef SQL
116a0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
116b0 48 4f 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73  HOT.  /*.  ** Us
116c0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61  age: sqlite3_sna
116d0 70 73 68 6f 74 5f 6f 70 65 6e 5f 62 6c 6f 62 20  pshot_open_blob 
116e0 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53 48  DB DBNAME SNAPSH
116f0 4f 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  OT.*/.static int
11700 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
11710 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65  est_snapshot_ope
11720 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  n_blob(.  void *
11730 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
11740 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11750 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
11760 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
11770 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
11780 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
11790 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  b;.  char *zName
117a0 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
117b0 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20  r *pBlob;.  int 
117c0 6e 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62  nBlob;..  if( ob
117d0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
117e0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
117f0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
11800 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53 48  DB DBNAME SNAPSH
11810 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OT");.    return
11820 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11830 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
11840 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
11850 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11860 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
11870 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e   TCL_ERROR;.  zN
11880 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
11890 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
118a0 70 42 6c 6f 62 20 3d 20 54 63 6c 5f 47 65 74 42  pBlob = Tcl_GetB
118b0 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
118c0 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 6c 6f 62 29  objv[3], &nBlob)
118d0 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 62 21 3d 73  ;.  if( nBlob!=s
118e0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 73 6e  izeof(sqlite3_sn
118f0 61 70 73 68 6f 74 29 20 29 7b 0a 20 20 20 20 54  apshot) ){.    T
11900 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11910 69 6e 74 65 72 70 2c 20 22 62 61 64 20 53 4e 41  interp, "bad SNA
11920 50 53 48 4f 54 22 2c 20 30 29 3b 0a 20 20 20 20  PSHOT", 0);.    
11930 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11940 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
11950 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  ite3_snapshot_op
11960 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 73  en(db, zName, (s
11970 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a  qlite3_snapshot*
11980 29 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72  )pBlob);.  if( r
11990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
119a0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
119b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
119c0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
119d0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
119e0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75  , -1));.    retu
119f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11a00 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
11a10 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
11a20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
11a30 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66  PSHOT */..#ifdef
11a40 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
11a50 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73  NAPSHOT./*.** Us
11a60 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61  age: sqlite3_sna
11a70 70 73 68 6f 74 5f 63 6d 70 5f 62 6c 6f 62 20 53  pshot_cmp_blob S
11a80 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48 4f  NAPSHOT1 SNAPSHO
11a90 54 32 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  T2.*/.static int
11aa0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
11ab0 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70  est_snapshot_cmp
11ac0 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
11ad0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
11ae0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
11af0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
11b00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
11b10 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72  bjv[].){.  int r
11b20 65 73 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  es;.  unsigned c
11b30 68 61 72 20 2a 70 31 3b 0a 20 20 75 6e 73 69 67  har *p1;.  unsig
11b40 6e 65 64 20 63 68 61 72 20 2a 70 32 3b 0a 20 20  ned char *p2;.  
11b50 69 6e 74 20 6e 31 3b 0a 20 20 69 6e 74 20 6e 32  int n1;.  int n2
11b60 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
11b70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
11b80 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
11b90 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4e 41 50 53   1, objv, "SNAPS
11ba0 48 4f 54 31 20 53 4e 41 50 53 48 4f 54 32 22 29  HOT1 SNAPSHOT2")
11bb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
11bc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
11bd0 31 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41  1 = Tcl_GetByteA
11be0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
11bf0 5b 31 5d 2c 20 26 6e 31 29 3b 0a 20 20 70 32 20  [1], &n1);.  p2 
11c00 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
11c10 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
11c20 5d 2c 20 26 6e 32 29 3b 0a 0a 20 20 69 66 28 20  ], &n2);..  if( 
11c30 6e 31 21 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74  n1!=sizeof(sqlit
11c40 65 33 5f 73 6e 61 70 73 68 6f 74 29 20 7c 7c 20  e3_snapshot) || 
11c50 6e 31 21 3d 6e 32 20 29 7b 0a 20 20 20 20 54 63  n1!=n2 ){.    Tc
11c60 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11c70 6e 74 65 72 70 2c 20 22 62 61 64 20 53 4e 41 50  nterp, "bad SNAP
11c80 53 48 4f 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  SHOT", 0);.    r
11c90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11ca0 0a 20 20 7d 0a 0a 20 20 72 65 73 20 3d 20 73 71  .  }..  res = sq
11cb0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63  lite3_snapshot_c
11cc0 6d 70 28 28 73 71 6c 69 74 65 33 5f 73 6e 61 70  mp((sqlite3_snap
11cd0 73 68 6f 74 2a 29 70 31 2c 20 28 73 71 6c 69 74  shot*)p1, (sqlit
11ce0 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 70 32 29  e3_snapshot*)p2)
11cf0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
11d00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
11d10 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73 29 29  _NewIntObj(res))
11d20 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
11d30 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
11d40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
11d50 50 53 48 4f 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PSHOT */../*.** 
11d60 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64  Usage: sqlite3_d
11d70 65 6c 65 74 65 5f 64 61 74 61 62 61 73 65 20 46  elete_database F
11d80 49 4c 45 4e 41 4d 45 0a 2a 2f 0a 69 6e 74 20 73  ILENAME.*/.int s
11d90 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64 61  qlite3_delete_da
11da0 74 61 62 61 73 65 28 63 6f 6e 73 74 20 63 68 61  tabase(const cha
11db0 72 2a 29 3b 20 20 20 2f 2a 20 69 6e 20 74 65 73  r*);   /* in tes
11dc0 74 5f 64 65 6c 65 74 65 2e 63 20 2a 2f 0a 73 74  t_delete.c */.st
11dd0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
11de0 54 43 4c 41 50 49 20 74 65 73 74 5f 64 65 6c 65  TCLAPI test_dele
11df0 74 65 5f 64 61 74 61 62 61 73 65 28 0a 20 20 76  te_database(.  v
11e00 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
11e10 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
11e20 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
11e30 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
11e40 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
11e50 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
11e60 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
11e70 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
11e80 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
11e90 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
11ea0 62 6a 76 2c 20 22 46 49 4c 45 22 29 3b 0a 20 20  bjv, "FILE");.  
11eb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
11ec0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20  OR;.  }.  zFile 
11ed0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 54  = (const char*)T
11ee0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
11ef0 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  v[1]);.  rc = sq
11f00 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64 61 74  lite3_delete_dat
11f10 61 62 61 73 65 28 7a 46 69 6c 65 29 3b 0a 0a 20  abase(zFile);.. 
11f20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11f30 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11f40 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
11f50 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d  e3ErrName(rc), -
11f60 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1));.  return TC
11f70 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
11f80 73 61 67 65 3a 20 61 74 6f 6d 69 63 5f 62 61 74  sage: atomic_bat
11f90 63 68 5f 77 72 69 74 65 20 50 41 54 48 0a 2a 2f  ch_write PATH.*/
11fa0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
11fb0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 61  TE_TCLAPI test_a
11fc0 74 6f 6d 69 63 5f 62 61 74 63 68 5f 77 72 69 74  tomic_batch_writ
11fd0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
11fe0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
11ff0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
12000 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
12010 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
12020 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69  ].){.  char *zFi
12030 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  le = 0;         
12040 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20 74         /* Path t
12050 6f 20 66 69 6c 65 20 74 6f 20 74 65 73 74 20 2a  o file to test *
12060 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  /.  sqlite3 *db 
12070 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12080 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
12090 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69  handle */.  sqli
120a0 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20  te3_file *pFd = 
120b0 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  0;          /* S
120c0 51 4c 69 74 65 20 66 64 20 6f 70 65 6e 20 6f 6e  QLite fd open on
120d0 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20   zFile */.  int 
120e0 62 52 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20  bRes = 0;       
120f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
12100 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 6f 66  nteger result of
12110 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
12120 0a 20 20 69 6e 74 20 64 63 20 3d 20 30 3b 20 20  .  int dc = 0;  
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 2f 2a 20 44 65 76 69 63 65 2d 63 68 61     /* Device-cha
12150 72 61 63 74 65 72 69 73 74 69 63 73 20 6d 61 73  racteristics mas
12160 6b 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  k */.  int rc;  
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
12190 33 5f 6f 70 65 6e 28 29 20 72 65 74 75 72 6e 20  3_open() return 
121a0 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  code */..  if( o
121b0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
121c0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
121d0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
121e0 22 50 41 54 48 22 29 3b 0a 20 20 20 20 72 65 74  "PATH");.    ret
121f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
12200 20 7d 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c   }.  zFile = Tcl
12210 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12220 31 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  1]);..  rc = sql
12230 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c  ite3_open(zFile,
12240 20 26 64 62 29 3b 0a 20 20 69 66 28 20 72 63 21   &db);.  if( rc!
12250 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12260 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
12270 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
12280 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
12290 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  );.    sqlite3_c
122a0 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 72 65  lose(db);.    re
122b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
122c0 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
122d0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
122e0 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c  (db, "main", SQL
122f0 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50  ITE_FCNTL_FILE_P
12300 4f 49 4e 54 45 52 2c 20 28 76 6f 69 64 2a 29 26  OINTER, (void*)&
12310 70 46 64 29 3b 0a 20 20 64 63 20 3d 20 70 46 64  pFd);.  dc = pFd
12320 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44 65 76  ->pMethods->xDev
12330 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
12340 63 73 28 70 46 64 29 3b 0a 20 20 69 66 28 20 64  cs(pFd);.  if( d
12350 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  c & SQLITE_IOCAP
12360 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20 29 7b  _BATCH_ATOMIC ){
12370 0a 20 20 20 20 62 52 65 73 20 3d 20 31 3b 0a 20  .    bRes = 1;. 
12380 20 7d 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   }..  Tcl_SetObj
12390 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
123a0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 52 65  cl_NewIntObj(bRe
123b0 73 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  s));.  sqlite3_c
123c0 6c 6f 73 65 28 64 62 29 3b 0a 20 20 72 65 74 75  lose(db);.  retu
123d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
123e0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
123f0 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44  te3_next_stmt  D
12400 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65  B  STMT.**.** Re
12410 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 73 74  turn the next st
12420 61 74 6d 65 6e 74 20 69 6e 20 73 65 71 75 65 6e  atment in sequen
12430 63 65 20 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a  ce after STMT..*
12440 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
12450 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
12460 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20 76 6f 69  next_stmt(.  voi
12470 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
12480 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
12490 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
124a0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
124b0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
124c0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
124d0 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  mt;.  sqlite3 *d
124e0 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  b = 0;.  char zB
124f0 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  uf[50];..  if( o
12500 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
12510 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12520 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
12530 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
12540 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
12550 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
12560 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
12570 20 44 42 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20   DB STMT", 0);. 
12580 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12590 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
125a0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
125b0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
125c0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
125d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
125e0 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53  RROR;.  if( getS
125f0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
12600 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
12610 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d  (objv[2]), &pStm
12620 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
12630 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74 20 3d  ERROR;.  pStmt =
12640 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74   sqlite3_next_st
12650 6d 74 28 64 62 2c 20 70 53 74 6d 74 29 3b 0a 20  mt(db, pStmt);. 
12660 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
12670 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
12680 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
12690 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
126a0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
126b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c  L_ERROR;.    Tcl
126c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
126d0 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
126e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
126f0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
12700 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74  age:  sqlite3_st
12710 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53 54 4d  mt_readonly  STM
12720 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T.**.** Return t
12730 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20 61  rue if STMT is a
12740 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72   NULL pointer or
12750 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
12760 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61  statement.** tha
12770 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20  t is guaranteed 
12780 74 6f 20 6c 65 61 76 65 20 74 68 65 20 64 61 74  to leave the dat
12790 61 62 61 73 65 20 75 6e 6d 6f 64 69 66 69 65 64  abase unmodified
127a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
127b0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
127c0 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  st_stmt_readonly
127d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
127e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
127f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
12800 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
12810 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
12820 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
12830 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
12840 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
12850 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
12860 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12870 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
12880 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
12890 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
128a0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
128b0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
128c0 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
128d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
128e0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
128f0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
12900 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
12910 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
12920 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12930 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
12940 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  te3_stmt_readonl
12950 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  y(pStmt);.  Tcl_
12960 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
12970 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
12980 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  eanObj(rc));.  r
12990 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
129a0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
129b0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65 78  qlite3_stmt_isex
129c0 70 6c 61 69 6e 20 20 53 54 4d 54 0a 2a 2a 0a 2a  plain  STMT.**.*
129d0 2a 20 52 65 74 75 72 6e 20 31 2c 20 32 2c 20 6f  * Return 1, 2, o
129e0 72 20 30 20 72 65 73 70 65 63 74 69 76 65 6c 79  r 0 respectively
129f0 20 69 66 20 53 54 4d 54 20 69 73 20 61 6e 20 45   if STMT is an E
12a00 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e 74  XPLAIN statement
12a10 2c 20 61 6e 0a 2a 2a 20 45 58 50 4c 41 49 4e 20  , an.** EXPLAIN 
12a20 51 55 45 52 59 20 50 4c 41 4e 20 73 74 61 74 65  QUERY PLAN state
12a30 6d 65 6e 74 20 6f 72 20 61 6e 20 6f 72 64 69 6e  ment or an ordin
12a40 61 72 79 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  ary statement or
12a50 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a   NULL pointer..*
12a60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
12a70 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
12a80 73 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 0a  stmt_isexplain(.
12a90 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
12aa0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
12ab0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
12ac0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
12ad0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
12ae0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
12af0 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
12b00 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
12b10 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
12b20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12b30 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
12b40 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
12b50 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
12b60 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
12b70 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
12b80 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
12b90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12ba0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
12bb0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
12bc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
12bd0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
12be0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12bf0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
12c00 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e  3_stmt_isexplain
12c10 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
12c20 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
12c30 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
12c40 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  j(rc));.  return
12c50 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
12c60 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
12c70 33 5f 73 74 6d 74 5f 62 75 73 79 20 20 53 54 4d  3_stmt_busy  STM
12c80 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  T.**.** Return t
12c90 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20 61  rue if STMT is a
12ca0 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65   non-NULL pointe
12cb0 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e 74  r to a statement
12cc0 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65 65  .** that has bee
12cd0 6e 20 73 74 65 70 70 65 64 20 62 75 74 20 6e 6f  n stepped but no
12ce0 74 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e  t to completion.
12cf0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
12d00 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
12d10 74 5f 73 74 6d 74 5f 62 75 73 79 28 0a 20 20 76  t_stmt_busy(.  v
12d20 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
12d30 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
12d40 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
12d50 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
12d60 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
12d70 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12d80 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
12d90 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
12da0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
12db0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12dc0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
12dd0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
12de0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
12df0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
12e00 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20  ], 0), " STMT", 
12e10 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12e20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
12e30 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
12e40 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
12e50 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
12e60 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
12e70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12e80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
12e90 74 6d 74 5f 62 75 73 79 28 70 53 74 6d 74 29 3b  tmt_busy(pStmt);
12ea0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
12eb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
12ec0 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63  NewBooleanObj(rc
12ed0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
12ee0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
12ef0 61 67 65 3a 20 20 75 73 65 73 5f 73 74 6d 74 5f  age:  uses_stmt_
12f00 6a 6f 75 72 6e 61 6c 20 20 53 54 4d 54 0a 2a 2a  journal  STMT.**
12f10 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
12f20 69 66 20 53 54 4d 54 20 75 73 65 73 20 61 20 73  if STMT uses a s
12f30 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
12f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12f50 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 75 73  SQLITE_TCLAPI us
12f60 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28  es_stmt_journal(
12f70 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
12f80 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
12f90 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
12fa0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
12fb0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
12fc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
12fd0 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
12fe0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
12ff0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13000 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
13010 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
13020 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
13030 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
13040 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
13050 20 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20   " STMT", 0);.  
13060 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13070 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
13080 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
13090 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
130a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
130b0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
130c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
130d0 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  te3_stmt_readonl
130e0 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  y(pStmt);.  Tcl_
130f0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
13100 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
13110 65 61 6e 4f 62 6a 28 28 28 56 64 62 65 20 2a 29  eanObj(((Vdbe *)
13120 70 53 74 6d 74 29 2d 3e 75 73 65 73 53 74 6d 74  pStmt)->usesStmt
13130 4a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 72 65 74  Journal));.  ret
13140 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
13150 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
13160 6c 69 74 65 33 5f 72 65 73 65 74 20 20 53 54 4d  lite3_reset  STM
13170 54 20 0a 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61  T .**.** Reset a
13180 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c   statement handl
13190 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
131a0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
131b0 65 73 74 5f 72 65 73 65 74 28 0a 20 20 76 6f 69  est_reset(.  voi
131c0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
131d0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
131e0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
131f0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
13200 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
13210 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13220 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  mt;.  int rc;.. 
13230 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
13240 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13250 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
13260 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
13270 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
13280 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
13290 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
132a0 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20   0), " <STMT>", 
132b0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
132c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
132d0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
132e0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
132f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
13300 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
13310 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13320 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13330 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
13340 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71 6c  if( pStmt && sql
13350 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
13360 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
13370 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a  (pStmt), rc) ){.
13380 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13390 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
133a0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
133b0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
133c0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
133d0 54 41 54 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28  TATIC);./*.  if(
133e0 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72   rc ){.    retur
133f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
13400 0a 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .*/.  return TCL
13410 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
13420 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
13430 70 69 72 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a  pired STMT .**.*
13440 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
13450 20 61 20 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e   a recompilation
13460 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
13470 74 20 69 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64  t is recommended
13480 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13490 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
134a0 73 74 5f 65 78 70 69 72 65 64 28 0a 20 20 76 6f  st_expired(.  vo
134b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
134c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
134d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
134e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
134f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
13500 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13510 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73  T_DEPRECATED.  s
13520 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
13530 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
13540 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
13550 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13560 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
13570 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
13580 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
13590 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
135a0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d  v[0], 0), " <STM
135b0 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  T>", 0);.    ret
135c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
135d0 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
135e0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
135f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13600 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
13610 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
13620 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
13630 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
13640 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
13650 28 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64  (sqlite3_expired
13660 28 70 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69  (pStmt)));.#endi
13670 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
13680 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
13690 65 3a 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e  e:  sqlite3_tran
136a0 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 20 46 52  sfer_bindings FR
136b0 4f 4d 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a  OMSTMT TOSTMT.**
136c0 0a 2a 2a 20 54 72 61 6e 73 66 65 72 20 61 6c 6c  .** Transfer all
136d0 20 62 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46   bindings from F
136e0 52 4f 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f 20  ROMSTMT over to 
136f0 54 4f 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63  TOSTMT.*/.static
13700 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
13710 50 49 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72  PI test_transfer
13720 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20  _bind(.  void * 
13730 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
13740 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
13750 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
13760 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
13770 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
13780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
13790 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65  RECATED.  sqlite
137a0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20  3_stmt *pStmt1, 
137b0 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f  *pStmt2;.  if( o
137c0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
137d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
137e0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
137f0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
13800 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
13810 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
13820 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
13830 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54   FROM-STMT TO-ST
13840 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
13850 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13860 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
13870 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
13880 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13890 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31 29  jv[1]), &pStmt1)
138a0 29 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 69 66 28 20 67 65 74 53 74 6d  OR;.  if( getStm
138c0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
138d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
138e0 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32  bjv[2]), &pStmt2
138f0 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  )) return TCL_ER
13900 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
13910 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
13920 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74  .     Tcl_NewInt
13930 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61 6e  Obj(sqlite3_tran
13940 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53  sfer_bindings(pS
13950 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a  tmt1,pStmt2)));.
13960 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
13970 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
13980 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
13990 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a  _changes DB.**.*
139a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
139b0 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 6d  ber of changes m
139c0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
139d0 61 73 65 20 62 79 20 74 68 65 20 6c 61 73 74 20  ase by the last 
139e0 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  SQL.** execution
139f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
13a00 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
13a10 73 74 5f 63 68 61 6e 67 65 73 28 0a 20 20 76 6f  st_changes(.  vo
13a20 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
13a30 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13a40 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
13a50 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
13a60 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
13a70 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
13a80 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
13a90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13aa0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
13ab0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
13ac0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
13ad0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
13ae0 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
13af0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
13b00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
13b10 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
13b20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
13b30 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
13b40 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
13b50 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
13b60 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
13b70 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
13b80 6a 28 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65  j(sqlite3_change
13b90 73 28 64 62 29 29 29 3b 0a 20 20 72 65 74 75 72  s(db)));.  retur
13ba0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
13bb0 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 22  ** This is the "
13bc0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
13bd0 65 22 20 74 68 61 74 20 76 61 72 69 61 62 6c 65  e" that variable
13be0 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f 20 77  s are bound to w
13bf0 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20  hen.** the FLAG 
13c00 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65  option of sqlite
13c10 33 5f 62 69 6e 64 20 69 73 20 22 73 74 61 74 69  3_bind is "stati
13c20 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  c".*/.static cha
13c30 72 20 2a 73 71 6c 69 74 65 5f 73 74 61 74 69 63  r *sqlite_static
13c40 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b  _bind_value = 0;
13c50 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
13c60 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e  te_static_bind_n
13c70 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  byte = 0;../*.**
13c80 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
13c90 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58 20 20  _bind  VM  IDX  
13ca0 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a  VALUE  FLAGS.**.
13cb0 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61 6c 75  ** Sets the valu
13cc0 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74 68 20  e of the IDX-th 
13cd0 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20 22 3f  occurrence of "?
13ce0 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  " in the origina
13cf0 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e  l SQL.** string.
13d00 20 20 56 41 4c 55 45 20 69 73 20 74 68 65 20 6e    VALUE is the n
13d10 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20 46 4c  ew value.  If FL
13d20 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e  AGS=="null" then
13d30 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e   VALUE is.** ign
13d40 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c  ored and the val
13d50 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ue is set to NUL
13d60 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 73  L.  If FLAGS=="s
13d70 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74  tatic" then.** t
13d80 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
13d90 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  to the value of 
13da0 61 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c  a static variabl
13db0 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69  e named.** "sqli
13dc0 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
13dd0 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41 47 53  alue".  If FLAGS
13de0 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20  =="normal" then 
13df0 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65  a copy.** of the
13e00 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65 2e 20   VALUE is made. 
13e10 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62   If FLAGS=="blob
13e20 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c 55 45  10" then a VALUE
13e30 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61   is ignored.** a
13e40 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c 6f 62  n a 10-byte blob
13e50 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
13e60 70 71 22 20 69 73 20 69 6e 73 65 72 74 65 64 2e  pq" is inserted.
13e70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
13e80 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
13e90 74 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a  t_bind(.  void *
13ea0 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
13eb0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
13ec0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
13ed0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
13ee0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
13ef0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
13f00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
13f10 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
13f20 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
13f30 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
13f40 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
13f50 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
13f60 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
13f70 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
13f80 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
13f90 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
13fa0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13fb0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
13fc0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
13fd0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
13fe0 2c 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49  , .       " VM I
13ff0 44 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73  DX VALUE (null|s
14000 74 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22  tatic|normal)\""
14010 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
14020 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
14030 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
14040 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
14050 76 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20  v[1], &pStmt) ) 
14060 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14070 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
14080 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
14090 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
140a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
140b0 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
140c0 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b  4],"null")==0 ){
140d0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
140e0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
140f0 74 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65  t, idx);.  }else
14100 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
14110 5b 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30  [4],"static")==0
14120 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
14130 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
14140 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74  Stmt, idx, sqlit
14150 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
14160 6c 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d  lue, -1, 0);.  }
14170 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
14180 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d  argv[4],"static-
14190 6e 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20  nbytes")==0 ){. 
141a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
141b0 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
141c0 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61   idx, sqlite_sta
141d0 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a  tic_bind_value,.
141e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14200 20 20 20 20 20 20 20 73 71 6c 69 74 65 5f 73 74         sqlite_st
14210 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c  atic_bind_nbyte,
14220 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
14230 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
14240 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a  "normal")==0 ){.
14250 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14260 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74  _bind_text(pStmt
14270 2c 20 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20  , idx, argv[3], 
14280 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  -1, SQLITE_TRANS
14290 49 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69  IENT);.  }else i
142a0 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
142b0 5d 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29  ],"blob10")==0 )
142c0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
142d0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
142e0 6d 74 2c 20 69 64 78 2c 20 22 61 62 63 5c 30 30  mt, idx, "abc\00
142f0 30 78 79 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c  0xyz\000pq", 10,
14300 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
14310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63  .  }else{.    Tc
14320 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
14330 6e 74 65 72 70 2c 20 22 34 74 68 20 61 72 67 75  nterp, "4th argu
14340 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22  ment should be "
14350 0a 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c  .        "\"null
14360 5c 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22  \" or \"static\"
14370 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c   or \"normal\"",
14380 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
14390 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
143a0 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
143b0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
143c0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
143d0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
143e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
143f0 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  c ){.    char zB
14400 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69  uf[50];.    sqli
14410 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
14420 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
14430 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20   "(%d) ", rc);. 
14440 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
14450 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
14460 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
14470 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  rc), 0);.    ret
14480 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14490 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
144a0 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
144b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
144c0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
144d0 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c  d_test_collate <
144e0 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c  db ptr> <utf8> <
144f0 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62  utf16le> <utf16b
14500 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  e>.**.** This fu
14510 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
14520 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c 69  o test that SQLi
14530 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20 63  te selects the c
14540 6f 72 72 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e  orrect collation
14550 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 63 61 6c  .** sequence cal
14560 6c 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69  lback when multi
14570 70 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f  ple versions (fo
14580 72 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74  r different text
14590 20 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61   encodings).** a
145a0 72 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  re available..**
145b0 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73  .** Calling this
145c0 20 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65   routine registe
145d0 72 73 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  rs the collation
145e0 20 73 65 71 75 65 6e 63 65 20 22 74 65 73 74 5f   sequence "test_
145f0 63 6f 6c 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68  collate".** with
14600 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
14610 20 3c 64 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e   <db>. The secon
14620 64 20 61 72 67 75 6d 65 6e 74 20 6d 75 73 74 20  d argument must 
14630 62 65 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72  be a list of thr
14640 65 65 0a 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61  ee.** boolean va
14650 6c 75 65 73 2e 20 49 66 20 74 68 65 20 66 69 72  lues. If the fir
14660 73 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  st is true, then
14670 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65   a version of te
14680 73 74 5f 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a  st_collate is.**
14690 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
146a0 55 54 46 2d 38 2c 20 69 66 20 74 68 65 20 73 65  UTF-8, if the se
146b0 63 6f 6e 64 20 69 73 20 74 72 75 65 2c 20 61 20  cond is true, a 
146c0 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73  version is regis
146d0 74 65 72 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46  tered for.** UTF
146e0 2d 31 36 6c 65 2c 20 69 66 20 74 68 65 20 74 68  -16le, if the th
146f0 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 55  ird is true, a U
14700 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20  TF-16be version 
14710 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  is available..**
14720 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
14730 6e 73 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  ns of test_colla
14740 74 65 20 61 72 65 20 64 65 6c 65 74 65 64 2e 0a  te are deleted..
14750 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74  **.** The collat
14760 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 65 73  ion sequence tes
14770 74 5f 63 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70  t_collate is imp
14780 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c  lemented by call
14790 69 6e 67 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  ing the.** follo
147a0 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a  wing TCL script:
147b0 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63  .**.**   "test_c
147c0 6f 6c 6c 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68  ollate <enc> <lh
147d0 73 3e 20 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20  s> <rhs>".**.** 
147e0 54 68 65 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72  The <lhs> and <r
147f0 68 73 3e 20 61 72 65 20 74 68 65 20 74 77 6f 20  hs> are the two 
14800 76 61 6c 75 65 73 20 62 65 69 6e 67 20 63 6f 6d  values being com
14810 70 61 72 65 64 2c 20 65 6e 63 6f 64 65 64 20 69  pared, encoded i
14820 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20  n UTF-8..** The 
14830 3c 65 6e 63 3e 20 70 61 72 61 6d 65 74 65 72 20  <enc> parameter 
14840 69 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  is the encoding 
14850 6f 66 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  of the collation
14860 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a   function that.*
14870 2a 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 65  * SQLite selecte
14880 64 20 74 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54  d to call. The T
14890 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 20 69  CL test script i
148a0 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a  mplements the.**
148b0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20   "test_collate" 
148c0 70 72 6f 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  proc..**.** Note
148d0 20 74 68 61 74 20 74 68 69 73 20 77 69 6c 6c 20   that this will 
148e0 6f 6e 6c 79 20 77 6f 72 6b 20 77 69 74 68 20 6f  only work with o
148f0 6e 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 61  ne interpreter a
14900 74 20 61 20 74 69 6d 65 2c 20 61 73 20 74 68 65  t a time, as the
14910 0a 2a 2a 20 69 6e 74 65 72 70 20 70 6f 69 6e 74  .** interp point
14920 65 72 20 74 6f 20 75 73 65 20 77 68 65 6e 20 65  er to use when e
14930 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 54 43  valuating the TC
14940 4c 20 73 63 72 69 70 74 20 69 73 20 73 74 6f 72  L script is stor
14950 65 64 20 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f  ed in.** pTestCo
14960 6c 6c 61 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a  llateInterp..*/.
14970 73 74 61 74 69 63 20 54 63 6c 5f 49 6e 74 65 72  static Tcl_Inter
14980 70 2a 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49  p* pTestCollateI
14990 6e 74 65 72 70 3b 0a 73 74 61 74 69 63 20 69 6e  nterp;.static in
149a0 74 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  t test_collate_f
149b0 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  unc(.  void *pCt
149c0 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f  x, .  int nA, co
149d0 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
149e0 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f  int nB, const vo
149f0 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f  id *zB.){.  Tcl_
14a00 49 6e 74 65 72 70 20 2a 69 20 3d 20 70 54 65 73  Interp *i = pTes
14a10 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a  tCollateInterp;.
14a20 20 20 69 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51    int encin = SQ
14a30 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
14a40 70 43 74 78 29 3b 0a 20 20 69 6e 74 20 72 65 73  pCtx);.  int res
14a50 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71  ;.  int n;..  sq
14a60 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
14a70 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  l;.  Tcl_Obj *pX
14a80 3b 0a 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  ;..  pX = Tcl_Ne
14a90 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
14aa0 5f 63 6f 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a  _collate", -1);.
14ab0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
14ac0 6e 74 28 70 58 29 3b 0a 0a 20 20 73 77 69 74 63  nt(pX);..  switc
14ad0 68 28 20 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20  h( encin ){.    
14ae0 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 38  case SQLITE_UTF8
14af0 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
14b00 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
14b10 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
14b20 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d  ingObj("UTF-8",-
14b30 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
14b40 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
14b50 45 5f 55 54 46 31 36 4c 45 3a 0a 20 20 20 20 20  E_UTF16LE:.     
14b60 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
14b70 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54  ndElement(i,pX,T
14b80 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14b90 22 55 54 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b  "UTF-16LE",-1));
14ba0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
14bb0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55 54    case SQLITE_UT
14bc0 46 31 36 42 45 3a 0a 20 20 20 20 20 20 54 63 6c  F16BE:.      Tcl
14bd0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
14be0 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e  ement(i,pX,Tcl_N
14bf0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46  ewStringObj("UTF
14c00 2d 31 36 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20  -16BE",-1));.   
14c10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
14c20 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
14c30 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73  ert(0);.  }..  s
14c40 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
14c50 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61  nMalloc();.  pVa
14c60 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
14c70 4e 65 77 28 30 29 3b 0a 20 20 69 66 28 20 70 56  New(0);.  if( pV
14c80 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
14c90 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
14ca0 6c 2c 20 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e  l, nA, zA, encin
14cb0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
14cc0 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
14cd0 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
14ce0 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  al);.    Tcl_Lis
14cf0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14d00 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20  t(i,pX,.        
14d10 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14d20 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
14d30 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
14d40 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ,n));.    sqlite
14d50 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
14d60 6c 2c 20 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e  l, nB, zB, encin
14d70 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
14d80 3b 0a 20 20 20 20 6e 20 3d 20 73 71 6c 69 74 65  ;.    n = sqlite
14d90 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 70 56  3_value_bytes(pV
14da0 61 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  al);.    Tcl_Lis
14db0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
14dc0 74 28 69 2c 70 58 2c 0a 20 20 20 20 20 20 20 20  t(i,pX,.        
14dd0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14de0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
14df0 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
14e00 2c 6e 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ,n));.    sqlite
14e10 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
14e20 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
14e30 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
14e40 3b 0a 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  ;..  Tcl_EvalObj
14e50 45 78 28 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20  Ex(i, pX, 0);.  
14e60 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
14e70 28 70 58 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49  (pX);.  Tcl_GetI
14e80 6e 74 46 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c  ntFromObj(i, Tcl
14e90 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 29  _GetObjResult(i)
14ea0 2c 20 26 72 65 73 29 3b 0a 20 20 72 65 74 75 72  , &res);.  retur
14eb0 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20  n res;.}.static 
14ec0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
14ed0 49 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a  I test_collate(.
14ee0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
14ef0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
14f00 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
14f10 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
14f20 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
14f30 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
14f40 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71  .  int val;.  sq
14f50 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
14f60 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
14f70 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f  if( objc!=5 ) go
14f80 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70  to bad_args;.  p
14f90 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
14fa0 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66  p = interp;.  if
14fb0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
14fc0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
14fd0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
14fe0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
14ff0 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54  _ERROR;..  if( T
15000 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
15010 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
15020 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
15030 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
15040 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
15050 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
15060 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  llation(db, "tes
15070 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49  t_collate", SQLI
15080 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
15090 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49      (void *)SQLI
150a0 54 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73  TE_UTF8, val?tes
150b0 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30  t_collate_func:0
150c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
150d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
150e0 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36  nst void *zUtf16
150f0 3b 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b  ;.    if( TCL_OK
15100 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
15110 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
15120 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
15130 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15140 52 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  R;.    rc = sqli
15150 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
15160 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
15170 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
15180 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20  UTF16LE, .      
15190 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51        (void *)SQ
151a0 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61  LITE_UTF16LE, va
151b0 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66  l?test_collate_f
151c0 75 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20  unc:0);.    if( 
151d0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
151e0 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
151f0 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
15200 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
15210 4c 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a  L_ERROR;..#if 0.
15220 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
15230 69 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b  iMallocFail>0 ){
15240 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
15250 4d 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20  MallocFail++;.  
15260 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73    }.#endif.    s
15270 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15280 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
15290 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
152a0 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
152b0 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
152c0 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
152d0 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20  "test_collate", 
152e0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
152f0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
15300 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74 65   zUtf16 = sqlite
15310 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c  3ValueText(pVal,
15320 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
15330 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62  IVE);.    if( db
15340 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15350 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15360 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
15370 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
15380 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
15390 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20  collation16(db, 
153a0 7a 55 74 66 31 36 2c 20 53 51 4c 49 54 45 5f 55  zUtf16, SQLITE_U
153b0 54 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20  TF16BE, .       
153c0 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
153d0 45 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74  E_UTF16BE, val?t
153e0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
153f0 3a 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  :0);.    }.    s
15400 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
15410 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74  pVal);.    sqlit
15420 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
15430 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  b->mutex);.  }. 
15440 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
15450 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
15460 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
15470 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20   TCL_ERROR;.  . 
15480 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15490 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
154a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
154b0 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  p, sqlite3ErrNam
154c0 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
154d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
154e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
154f0 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
15500 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
15510 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
15520 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
15530 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
15540 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
15550 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
15560 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20  , " <DB> <utf8> 
15570 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
15580 62 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75  be>", 0);.  retu
15590 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
155a0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
155b0 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f  d_test_utf16bin_
155c0 63 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e  collate <db ptr>
155d0 0a 2a 2a 0a 2a 2a 20 41 64 64 20 61 20 75 74 66  .**.** Add a utf
155e0 2d 31 36 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  -16 collation se
155f0 71 75 65 6e 63 65 20 6e 61 6d 65 64 20 22 75 74  quence named "ut
15600 66 31 36 62 69 6e 22 20 74 6f 20 74 68 65 20 64  f16bin" to the d
15610 61 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64 6c  atabase.** handl
15620 65 2e 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f  e. This collatio
15630 6e 20 73 65 71 75 65 6e 63 65 20 63 6f 6d 70 61  n sequence compa
15640 72 65 73 20 61 72 67 75 6d 65 6e 74 73 20 69 6e  res arguments in
15650 20 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73   the same way as
15660 20 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69 6e   the.** built-in
15670 20 63 6f 6c 6c 61 74 69 6f 6e 20 22 62 69 6e 61   collation "bina
15680 72 79 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ry"..*/.static i
15690 6e 74 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e  nt test_utf16bin
156a0 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20  _collate_func(. 
156b0 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
156c0 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f  int nA, const vo
156d0 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42  id *zA,.  int nB
156e0 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42  , const void *zB
156f0 0a 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d  .){.  int nCmp =
15700 20 28 6e 41 3e 6e 42 20 3f 20 6e 42 20 3a 20 6e   (nA>nB ? nB : n
15710 41 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20  A);.  int res = 
15720 6d 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e  memcmp(zA, zB, n
15730 43 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73 3d  Cmp);.  if( res=
15740 3d 30 20 29 20 72 65 73 20 3d 20 6e 41 20 2d 20  =0 ) res = nA - 
15750 6e 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73  nB;.  return res
15760 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53  ;.}.static int S
15770 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
15780 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61  t_utf16bin_colla
15790 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  te(.  void * cli
157a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
157b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
157c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
157d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
157e0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
157f0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
15800 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20    if( objc!=2 ) 
15810 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
15820 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
15830 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
15840 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
15850 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
15860 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
15870 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
15880 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  e_collation(db, 
15890 22 75 74 66 31 36 62 69 6e 22 2c 20 53 51 4c 49  "utf16bin", SQLI
158a0 54 45 5f 55 54 46 31 36 2c 20 30 2c 20 0a 20 20  TE_UTF16, 0, .  
158b0 20 20 20 20 74 65 73 74 5f 75 74 66 31 36 62 69      test_utf16bi
158c0 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 0a 20  n_collate_func. 
158d0 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   );.  if( sqlite
158e0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
158f0 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
15900 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15910 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
15920 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54  ;..bad_args:.  T
15930 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
15940 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
15950 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e   "DB");.  return
15960 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f   TCL_ERROR;.}../
15970 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63 6f  *.** When the co
15980 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 63  llation needed c
15990 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b  allback is invok
159a0 65 64 2c 20 72 65 63 6f 72 64 20 74 68 65 20 6e  ed, record the n
159b0 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72  ame of .** the r
159c0 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69  equested collati
159d0 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  ng function here
159e0 2e 20 20 54 68 65 20 72 65 63 6f 72 64 65 64 20  .  The recorded 
159f0 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a  name is linked.*
15a00 2a 20 74 6f 20 61 20 54 43 4c 20 76 61 72 69 61  * to a TCL varia
15a10 62 6c 65 20 61 6e 64 20 75 73 65 64 20 74 6f 20  ble and used to 
15a20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74  make sure that t
15a30 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f 6c  he requested col
15a40 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69  lation.** name i
15a50 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74  s correct..*/.st
15a60 61 74 69 63 20 63 68 61 72 20 7a 4e 65 65 64 65  atic char zNeede
15a70 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b  dCollation[200];
15a80 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70 7a  .static char *pz
15a90 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20  NeededCollation 
15aa0 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  = zNeededCollati
15ab0 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  on;.../*.** Call
15ac0 65 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74  ed when a collat
15ad0 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
15ae0 6e 65 65 64 65 64 2e 20 20 52 65 67 69 73 74 65  needed.  Registe
15af0 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c  red using.** sql
15b00 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
15b10 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74  eeded16()..*/.st
15b20 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 63  atic void test_c
15b30 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63 62  ollate_needed_cb
15b40 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
15b50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
15b60 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a    int eTextRep,.
15b70 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e    const void *pN
15b80 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63  ame.){.  int enc
15b90 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e   = ENC(db);.  in
15ba0 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  t i;.  char *z;.
15bb0 20 20 66 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a    for(z = (char*
15bc0 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20  )pName, i=0; *z 
15bd0 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20  || z[1]; z++){. 
15be0 20 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65     if( *z ) zNee
15bf0 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b  dedCollation[i++
15c00 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e  ] = *z;.  }.  zN
15c10 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69  eededCollation[i
15c20 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
15c30 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
15c40 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 74 65  n(.      db, "te
15c50 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43  st_collate", ENC
15c60 28 64 62 29 2c 20 53 51 4c 49 54 45 5f 49 4e 54  (db), SQLITE_INT
15c70 5f 54 4f 5f 50 54 52 28 65 6e 63 29 2c 20 74 65  _TO_PTR(enc), te
15c80 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29  st_collate_func)
15c90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
15ca0 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61  : add_test_colla
15cb0 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a  te_needed DB.*/.
15cc0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
15cd0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f  E_TCLAPI test_co
15ce0 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28 0a 20 20  llate_needed(.  
15cf0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
15d00 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
15d10 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
15d20 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
15d30 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
15d40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
15d50 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
15d60 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20 62  objc!=2 ) goto b
15d70 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67  ad_args;.  if( g
15d80 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
15d90 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
15da0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
15db0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15dc0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
15dd0 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
15de0 65 64 65 64 31 36 28 64 62 2c 20 30 2c 20 74 65  eded16(db, 0, te
15df0 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
15e00 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64  d_cb);.  zNeeded
15e10 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30  Collation[0] = 0
15e20 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
15e30 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
15e40 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
15e50 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15e60 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
15e70 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c  .bad_args:.  Tcl
15e80 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
15e90 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
15ea0 44 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  DB");.  return T
15eb0 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
15ec0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 61 64 64  ** tclcmd:   add
15ed0 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
15ee0 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a  collations  DB.*
15ef0 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20 6e 65 77  *.** Add two new
15f00 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
15f10 6e 63 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  nces to the data
15f20 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20  base DB.**.**   
15f30 20 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a    utf16_aligned.
15f40 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 75 6e 61  **     utf16_una
15f50 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74  ligned.**.** Bot
15f60 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  h collating sequ
15f70 65 6e 63 65 73 20 75 73 65 20 74 68 65 20 73 61  ences use the sa
15f80 6d 65 20 73 6f 72 74 20 6f 72 64 65 72 20 61 73  me sort order as
15f90 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20   BINARY..** The 
15fa0 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e 63 65 20  only difference 
15fb0 69 73 20 74 68 61 74 20 74 68 65 20 75 74 66 31  is that the utf1
15fc0 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74  6_aligned collat
15fd0 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20  ing.** sequence 
15fe0 69 73 20 64 65 63 6c 61 72 65 64 20 77 69 74 68  is declared with
15ff0 20 74 68 65 20 53 51 4c 49 54 45 5f 55 54 46 31   the SQLITE_UTF1
16000 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a  6_ALIGNED flag..
16010 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e  ** Both collatin
16020 67 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72  g functions incr
16030 65 6d 65 6e 74 20 74 68 65 20 75 6e 61 6c 69 67  ement the unalig
16040 6e 65 64 20 75 74 66 31 36 20 63 6f 75 6e 74 65  ned utf16 counte
16050 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72 20 74 68  r.** whenever th
16060 65 79 20 73 65 65 20 61 20 73 74 72 69 6e 67 20  ey see a string 
16070 74 68 61 74 20 62 65 67 69 6e 73 20 6f 6e 20 61  that begins on a
16080 6e 20 6f 64 64 20 62 79 74 65 20 62 6f 75 6e 64  n odd byte bound
16090 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ary..*/.static i
160a0 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72  nt unaligned_str
160b0 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b  ing_counter = 0;
160c0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c 69 67  .static int alig
160d0 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20  nmentCollFunc(. 
160e0 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
160f0 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
16100 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
16110 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
16120 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
16130 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
16140 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
16150 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
16160 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31 3e 30 20  ;.  if( nKey1>0 
16170 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45  && 1==(1&(SQLITE
16180 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79  _PTR_TO_INT(pKey
16190 31 29 29 29 20 29 20 75 6e 61 6c 69 67 6e 65 64  1))) ) unaligned
161a0 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b  _string_counter+
161b0 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79 32 3e 30  +;.  if( nKey2>0
161c0 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c 49 54   && 1==(1&(SQLIT
161d0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65  E_PTR_TO_INT(pKe
161e0 79 32 29 29 29 20 29 20 75 6e 61 6c 69 67 6e 65  y2))) ) unaligne
161f0 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
16200 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  ++;.  rc = memcm
16210 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
16220 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
16230 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  ){.    rc = nKey
16240 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  1 - nKey2;.  }. 
16250 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74   return rc;.}.st
16260 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
16270 54 43 4c 41 50 49 20 61 64 64 5f 61 6c 69 67 6e  TCLAPI add_align
16280 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  ment_test_collat
16290 69 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20 63  ions(.  void * c
162a0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
162b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
162c0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
162d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
162e0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
162f0 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a  3 *db;.  if( obj
16300 63 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=2 ){.    if( 
16310 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
16320 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
16330 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
16340 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16350 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65  RROR;.    sqlite
16360 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
16370 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 75 6e  on(db, "utf16_un
16380 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45  aligned", SQLITE
16390 5f 55 54 46 31 36 2c 20 0a 20 20 20 20 20 20 20  _UTF16, .       
163a0 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c   0, alignmentCol
163b0 6c 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69  lFunc);.    sqli
163c0 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
163d0 74 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f  tion(db, "utf16_
163e0 61 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45  aligned", SQLITE
163f0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20  _UTF16_ALIGNED, 
16400 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
16410 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
16420 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
16430 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
16440 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
16450 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20  ITE_OMIT_UTF16) 
16460 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  */../*.** Usage:
16470 20 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69   add_test_functi
16480 6f 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66  on <db ptr> <utf
16490 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
164a0 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69  f16be>.**.** Thi
164b0 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  s function is us
164c0 65 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20  ed to test that 
164d0 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74  SQLite selects t
164e0 68 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a  he correct user.
164f0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ** function call
16500 62 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70  back when multip
16510 6c 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72  le versions (for
16520 20 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20   different text 
16530 65 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72  encodings).** ar
16540 65 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a  e available..**.
16550 2a 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20  ** Calling this 
16560 72 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72  routine register
16570 73 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65  s up to three ve
16580 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73  rsions of the us
16590 65 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  er function.** "
165a0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77  test_function" w
165b0 69 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e  ith database han
165c0 64 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68  dle <db>.  If th
165d0 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
165e0 74 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68  t is.** true, th
165f0 65 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20  en a version of 
16600 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73  test_function is
16610 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20   registered for 
16620 55 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a  UTF-8, if the.**
16630 20 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20   third is true, 
16640 61 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67  a version is reg
16650 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d  istered for UTF-
16660 31 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75  16le, if the fou
16670 72 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20  rth is.** true, 
16680 61 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69  a UTF-16be versi
16690 6f 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e  on is available.
166a0 20 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69    Previous versi
166b0 6f 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66  ons of.** test_f
166c0 75 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65  unction are dele
166d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75  ted..**.** The u
166e0 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ser function is 
166f0 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63  implemented by c
16700 61 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f  alling the follo
16710 77 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a  wing TCL script:
16720 0a 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66  .**.**   "test_f
16730 75 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61  unction <enc> <a
16740 72 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65  rg>".**.** Where
16750 20 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66   <enc> is one of
16760 20 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45   UTF-8, UTF-16LE
16770 20 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64   or UTF16BE, and
16780 20 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a   <arg> is the.**
16790 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74   single argument
167a0 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53   passed to the S
167b0 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65  QL function. The
167c0 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
167d0 62 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63  by.** the TCL sc
167e0 72 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20  ript is used as 
167f0 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
16800 20 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63   of the SQL func
16810 74 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70  tion. It.** is p
16820 61 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20  assed to SQLite 
16830 75 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66  using UTF-16BE f
16840 6f 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f  or a UTF-8 test_
16850 66 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d  function(), UTF-
16860 38 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31  8.** for a UTF-1
16870 36 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  6LE test_functio
16880 6e 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c  n(), and UTF-16L
16890 45 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65  E for an impleme
168a0 6e 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20  ntation that.** 
168b0 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45  prefers UTF-16BE
168c0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
168d0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73  ITE_OMIT_UTF16.s
168e0 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
168f0 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20  function_utf8(. 
16900 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
16910 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
16920 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
16930 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
16940 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16950 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
16960 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
16970 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
16980 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
16990 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
169a0 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
169b0 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
169c0 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
169d0 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
169e0 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
169f0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
16a00 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
16a10 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
16a20 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
16a30 38 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  8", -1));.  Tcl_
16a40 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
16a50 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
16a60 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53   .      Tcl_NewS
16a70 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
16a80 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
16a90 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29  xt(argv[0]), -1)
16aa0 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a  );.  Tcl_EvalObj
16ab0 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30  Ex(interp, pX, 0
16ac0 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
16ad0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c  Count(pX);.  sql
16ae0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
16af0 28 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74  (pCtx, Tcl_GetSt
16b00 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
16b10 70 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  p), -1, SQLITE_T
16b20 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61  RANSIENT);.  pVa
16b30 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
16b40 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
16b50 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
16b60 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74  l, -1, Tcl_GetSt
16b70 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72  ringResult(inter
16b80 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54  p), .      SQLIT
16b90 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
16ba0 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65  TATIC);.  sqlite
16bb0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62  3_result_text16b
16bc0 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
16bd0 76 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70  value_text16be(p
16be0 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
16bf0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
16c00 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
16c10 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73  eFree(pVal);.}.s
16c20 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
16c30 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65  function_utf16le
16c40 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
16c50 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  ext *pCtx, .  in
16c60 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65  t nArg,.  sqlite
16c70 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29  3_value **argv.)
16c80 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
16c90 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62  interp;.  Tcl_Ob
16ca0 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33  j *pX;.  sqlite3
16cb0 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20  _value *pVal;.  
16cc0 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e  interp = (Tcl_In
16cd0 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75  terp *)sqlite3_u
16ce0 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a  ser_data(pCtx);.
16cf0 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
16d00 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75  ringObj("test_fu
16d10 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20  nction", -1);.  
16d20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
16d30 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  (pX);.  Tcl_List
16d40 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
16d50 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c  (interp, pX, Tcl
16d60 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
16d70 54 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a  TF-16LE", -1));.
16d80 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
16d90 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
16da0 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63  p, pX, .      Tc
16db0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
16dc0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
16dd0 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
16de0 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  ), -1));.  Tcl_E
16df0 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
16e00 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
16e10 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
16e20 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
16e30 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
16e40 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
16e50 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c  tr(pVal, -1, Tcl
16e60 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
16e70 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20  (interp), .     
16e80 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
16e90 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
16ea0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
16eb0 65 78 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29  ext(pCtx,(char*)
16ec0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
16ed0 78 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49  xt(pVal),-1,SQLI
16ee0 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
16ef0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
16f00 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69  e(pVal);.}.stati
16f10 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63  c void test_func
16f20 74 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20  tion_utf16be(.  
16f30 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
16f40 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
16f50 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
16f60 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
16f70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16f80 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
16f90 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  X;.  sqlite3_val
16fa0 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65  ue *pVal;.  inte
16fb0 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
16fc0 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
16fd0 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58  data(pCtx);.  pX
16fe0 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
16ff0 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69  Obj("test_functi
17000 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  on", -1);.  Tcl_
17010 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
17020 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
17030 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
17040 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77  erp, pX, Tcl_New
17050 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31  StringObj("UTF-1
17060 36 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  6BE", -1));.  Tc
17070 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
17080 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
17090 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65  X, .      Tcl_Ne
170a0 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72  wStringObj((char
170b0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
170c0 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d  text(argv[0]), -
170d0 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f  1));.  Tcl_EvalO
170e0 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c  bjEx(interp, pX,
170f0 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
17100 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70  efCount(pX);.  p
17110 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
17120 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
17130 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
17140 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74  Val, -1, Tcl_Get
17150 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74  StringResult(int
17160 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c  erp), .      SQL
17170 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
17180 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69  _STATIC);.  sqli
17190 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31  te3_result_text1
171a0 36 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  6(pCtx, sqlite3_
171b0 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70  value_text16le(p
171c0 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
171d0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
171e0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
171f0 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43 74  ult_text16be(pCt
17200 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
17210 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c  _text16le(pVal),
17220 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54  .      -1, SQLIT
17230 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
17240 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
17250 65 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73 71  ext16le(pCtx, sq
17260 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
17270 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20  16le(pVal),.    
17280 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41    -1, SQLITE_TRA
17290 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
172a0 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
172b0 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
172c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
172d0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53   */.static int S
172e0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
172f0 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f  t_function(.  vo
17300 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
17310 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
17320 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
17330 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
17340 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
17350 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17360 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65  T_UTF16.  sqlite
17370 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c  3 *db;.  int val
17380 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
17390 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73   ) goto bad_args
173a0 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
173b0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
173c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
173d0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
173e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
173f0 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
17400 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
17410 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
17420 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
17430 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17440 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73  if( val ){.    s
17450 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
17460 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  nction(db, "test
17470 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53  _function", 1, S
17480 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
17490 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73       interp, tes
174a0 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c  t_function_utf8,
174b0 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
174c0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
174d0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
174e0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
174f0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
17500 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
17510 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
17520 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
17530 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
17540 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
17550 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20 20  TE_UTF16LE, .   
17560 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73       interp, tes
17570 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
17580 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20  le, 0, 0);.  }. 
17590 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
175a0 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
175b0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
175c0 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  4], &val) ) retu
175d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
175e0 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73  if( val ){.    s
175f0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
17600 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  nction(db, "test
17610 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53  _function", 1, S
17620 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a  QLITE_UTF16BE, .
17630 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20          interp, 
17640 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
17650 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20  f16be, 0, 0);.  
17660 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
17670 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  OK;.bad_args:.  
17680 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
17690 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
176a0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
176b0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c  e \"",.      Tcl
176c0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
176d0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
176e0 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74   <DB> <utf8> <ut
176f0 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e  f16le> <utf16be>
17700 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  ", 0);.#endif /*
17710 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
17720 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
17730 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  CL_ERROR;.}../*.
17740 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ** Usage:       
17750 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 65    sqlite3_test_e
17760 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65 3e  rrstr <err code>
17770 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61 74  .**.** Test that
17780 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e   the english lan
17790 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71 75  guage string equ
177a0 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71 6c  ivalents for sql
177b0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73 0a  ite error codes.
177c0 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68 65  ** are sane. The
177d0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e   parameter is an
177e0 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73 65   integer represe
177f0 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65 20  nting an sqlite 
17800 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 54  error code..** T
17810 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20 6c  he result is a l
17820 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65  ist of two eleme
17830 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67 20  nts, the string 
17840 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
17850 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63  f the.** error c
17860 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67 6c  ode and the engl
17870 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
17880 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  lanation..*/.sta
17890 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
178a0 43 4c 41 50 49 20 74 65 73 74 5f 65 72 72 73 74  CLAPI test_errst
178b0 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  r(.  void * clie
178c0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
178d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
178e0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
178f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17900 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  ].){.  char *zCo
17910 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  de;.  int i;.  i
17920 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
17930 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17940 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17950 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63 6f 64 65  jv, "<error code
17960 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64  >");.  }..  zCod
17970 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
17980 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f  g(objv[1]);.  fo
17990 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b 20 69 2b  r(i=0; i<200; i+
179a0 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73  +){.    if( 0==s
179b0 74 72 63 6d 70 28 74 31 45 72 72 6f 72 4e 61 6d  trcmp(t1ErrorNam
179c0 65 28 69 29 2c 20 7a 43 6f 64 65 29 20 29 20 62  e(i), zCode) ) b
179d0 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  reak;.  }.  Tcl_
179e0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
179f0 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
17a00 33 45 72 72 53 74 72 28 69 29 2c 20 30 29 3b 0a  3ErrStr(i), 0);.
17a10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
17a30 20 20 20 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a      breakpoint.*
17a40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
17a50 65 20 65 78 69 73 74 73 20 66 6f 72 20 6f 6e 65  e exists for one
17a60 20 70 75 72 70 6f 73 65 20 2d 20 74 6f 20 70 72   purpose - to pr
17a70 6f 76 69 64 65 20 61 20 70 6c 61 63 65 20 74 6f  ovide a place to
17a80 20 70 75 74 20 61 0a 2a 2a 20 62 72 65 61 6b 70   put a.** breakp
17a90 6f 69 6e 74 20 77 69 74 68 20 47 44 42 20 74 68  oint with GDB th
17aa0 61 74 20 63 61 6e 20 62 65 20 74 72 69 67 67 65  at can be trigge
17ab0 72 65 64 20 75 73 69 6e 67 20 54 43 4c 20 63 6f  red using TCL co
17ac0 64 65 2e 20 20 54 68 65 20 75 73 65 0a 2a 2a 20  de.  The use.** 
17ad0 66 6f 72 20 74 68 69 73 20 69 73 20 77 68 65 6e  for this is when
17ae0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 74 65   a particular te
17af0 73 74 20 66 61 69 6c 73 20 6f 6e 20 28 73 61 79  st fails on (say
17b00 29 20 74 68 65 20 31 34 38 35 74 68 20 69 74 65  ) the 1485th ite
17b10 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68  ration..** In th
17b20 65 20 54 43 4c 20 74 65 73 74 20 73 63 72 69 70  e TCL test scrip
17b30 74 2c 20 77 65 20 63 61 6e 20 61 64 64 20 63 6f  t, we can add co
17b40 64 65 20 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a  de like this:.**
17b50 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24 69 3d 3d  .**     if {$i==
17b60 31 34 38 35 7d 20 62 72 65 61 6b 70 6f 69 6e 74  1485} breakpoint
17b70 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72 75 6e 20  .**.** Then run 
17b80 74 65 73 74 66 69 78 74 75 72 65 20 69 6e 20 74  testfixture in t
17b90 68 65 20 64 65 62 75 67 67 65 72 20 61 6e 64 20  he debugger and 
17ba0 77 61 69 74 20 66 6f 72 20 74 68 65 20 62 72 65  wait for the bre
17bb0 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66 69  akpoint to.** fi
17bc0 72 65 2e 20 20 54 68 65 6e 20 61 64 64 69 74 69  re.  Then additi
17bd0 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69 6e 74 73  onal breakpoints
17be0 20 63 61 6e 20 62 65 20 73 65 74 20 74 6f 20 74   can be set to t
17bf0 72 61 63 65 20 64 6f 77 6e 20 74 68 65 20 62 75  race down the bu
17c00 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
17c10 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
17c20 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a  est_breakpoint(.
17c30 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
17c40 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
17c50 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
17c60 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
17c70 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
17c80 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
17c90 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
17ca0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
17cb0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
17cc0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
17cd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
17ce0 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
17cf0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  nt */.){.  retur
17d00 6e 20 54 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20  n TCL_OK;       
17d10 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20    /* Do nothing 
17d20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  */.}../*.** Usag
17d30 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
17d40 64 5f 7a 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54  d_zeroblob  STMT
17d50 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73   IDX N.**.** Tes
17d60 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
17d70 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65  nd_zeroblob inte
17d80 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
17d90 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
17da0 6d 65 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20  ment..** IDX is 
17db0 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
17dc0 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
17dd0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
17de0 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
17df0 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79  .** binds a N-by
17e00 74 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42  te zero-filled B
17e10 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63  LOB to the wildc
17e20 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
17e30 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
17e40 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
17e50 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
17e60 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
17e70 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
17e80 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
17e90 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
17ea0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
17eb0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
17ec0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e  int idx;.  int n
17ed0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
17ee0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
17ef0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17f00 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17f10 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22  jv, "STMT IDX N"
17f20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17f30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17f40 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
17f50 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
17f60 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
17f70 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
17f80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17f90 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17fa0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17fb0 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
17fc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17fd0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
17fe0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
17ff0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29  , objv[3], &n) )
18000 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18010 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
18020 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
18030 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b  (pStmt, idx, n);
18040 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
18050 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
18060 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
18070 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
18080 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
18090 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
180a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
180b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
180c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
180d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
180e0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
180f0 6f 62 6c 6f 62 36 34 20 20 53 54 4d 54 20 49 44  oblob64  STMT ID
18100 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  X N.**.** Test t
18110 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
18120 7a 65 72 6f 62 6c 6f 62 36 34 20 69 6e 74 65 72  zeroblob64 inter
18130 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
18140 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
18150 65 6e 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74  ent..** IDX is t
18160 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
18170 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
18180 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18190 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
181a0 2a 2a 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74  ** binds a N-byt
181b0 65 20 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c  e zero-filled BL
181c0 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  OB to the wildca
181d0 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rd..*/.static in
181e0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
181f0 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  test_bind_zerobl
18200 6f 62 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  ob64(.  void * c
18210 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
18220 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18230 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18240 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18250 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
18260 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
18270 20 69 6e 74 20 69 64 78 3b 0a 20 20 54 63 6c 5f   int idx;.  Tcl_
18280 57 69 64 65 49 6e 74 20 6e 3b 0a 20 20 69 6e 74  WideInt n;.  int
18290 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
182a0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
182b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
182c0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
182d0 4d 54 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20  MT IDX N");.    
182e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
182f0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
18300 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
18310 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18320 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
18330 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
18340 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
18350 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
18360 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
18370 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
18380 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
18390 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
183a0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
183b0 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65  bjv[3], &n) ) re
183c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
183d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
183e0 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 28  bind_zeroblob64(
183f0 70 53 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a  pStmt, idx, n);.
18400 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
18410 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
18420 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
18430 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
18440 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
18450 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18460 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18470 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
18480 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
18490 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
184a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
184b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
184c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
184d0 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
184e0 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20 56 41 4c  _int  STMT N VAL
184f0 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  UE.**.** Test th
18500 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69  e sqlite3_bind_i
18510 6e 74 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  nt interface.  S
18520 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
18530 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
18540 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
18550 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
18560 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
18570 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
18580 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
18590 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
185a0 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
185b0 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
185c0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
185d0 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e  API test_bind_in
185e0 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
185f0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
18600 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18610 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18620 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18630 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
18640 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
18650 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c  t idx;.  int val
18660 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
18670 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
18680 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
18690 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
186a0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
186b0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
186c0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
186d0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
186e0 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
186f0 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
18700 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18710 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
18720 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
18730 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
18740 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
18750 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18760 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
18770 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
18780 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
18790 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
187a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
187b0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
187c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
187d0 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75  , &value) ) retu
187e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
187f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
18800 6e 64 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 64  nd_int(pStmt, id
18810 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
18820 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
18830 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
18840 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
18850 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18860 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
18870 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18880 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18890 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
188a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
188b0 2a 20 55 73 61 67 65 3a 20 20 20 69 6e 74 61 72  * Usage:   intar
188c0 72 61 79 5f 61 64 64 72 20 20 49 4e 54 20 20 2e  ray_addr  INT  .
188d0 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ...**.** Return 
188e0 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 61  the address of a
188f0 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72 72 61   C-language arra
18900 79 20 6f 66 20 33 32 2d 62 69 74 20 69 6e 74 65  y of 32-bit inte
18910 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  gers..**.** Spac
18920 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 72  e to hold the ar
18930 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ray is obtained 
18940 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20  from malloc().  
18950 43 61 6c 6c 20 74 68 69 73 20 70 72 6f 63 65 64  Call this proced
18960 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77 69 74 68  ure once.** with
18970 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 69 6e   no arguments in
18980 20 6f 72 64 65 72 20 74 6f 20 72 65 6c 65 61 73   order to releas
18990 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61 63 68 20  e memory.  Each 
189a0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 70 72 6f  call to this pro
189b0 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65 72 77 72  cedure.** overwr
189c0 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
189d0 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  s array..*/.stat
189e0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
189f0 4c 41 50 49 20 74 65 73 74 5f 69 6e 74 61 72 72  LAPI test_intarr
18a00 61 79 5f 61 64 64 72 28 0a 20 20 76 6f 69 64 20  ay_addr(.  void 
18a10 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
18a20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
18a30 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
18a40 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
18a50 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
18a60 20 69 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74   i;.  static int
18a70 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69   *p = 0;..  sqli
18a80 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
18a90 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63   = 0;.  if( objc
18aa0 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  >1 ){.    p = sq
18ab0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
18ac0 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63  zeof(p[0])*(objc
18ad0 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
18ae0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
18af0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28  _ERROR;.    for(
18b00 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69  i=0; i<objc-1; i
18b10 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 54  ++){.      if( T
18b20 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
18b30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b  (interp, objv[1+
18b40 69 5d 2c 20 26 70 5b 69 5d 29 20 29 7b 0a 20 20  i], &p[i]) ){.  
18b50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
18b60 65 65 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70  ee(p);.        p
18b70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65   = 0;.        re
18b80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18b90 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
18ba0 7d 20 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  }  .  Tcl_SetObj
18bb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18bc0 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
18bd0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
18be0 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  p));.  return TC
18bf0 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73  L_OK;.}./*.** Us
18c00 61 67 65 3a 20 20 20 69 6e 74 61 72 72 61 79 5f  age:   intarray_
18c10 61 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a  addr  INT  ....*
18c20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18c30 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c  address of a C-l
18c40 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66  anguage array of
18c50 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 73   32-bit integers
18c60 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f  ..**.** Space to
18c70 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20   hold the array 
18c80 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
18c90 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c   malloc().  Call
18ca0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20   this procedure 
18cb0 6f 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20  once.** with no 
18cc0 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64  arguments in ord
18cd0 65 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65  er to release me
18ce0 6d 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c 6c  mory.  Each call
18cf0 20 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64 75   to this procedu
18d00 72 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73  re.** overwrites
18d10 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 61 72   the previous ar
18d20 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ray..*/.static i
18d30 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
18d40 20 74 65 73 74 5f 69 6e 74 36 34 61 72 72 61 79   test_int64array
18d50 5f 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20  _addr(.  void * 
18d60 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18d70 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18d80 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18d90 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18da0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69  bjv[].){.  int i
18db0 3b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  ;.  static sqlit
18dc0 65 33 5f 69 6e 74 36 34 20 2a 70 20 3d 20 30 3b  e3_int64 *p = 0;
18dd0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
18de0 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20  (p);.  p = 0;.  
18df0 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20  if( objc>1 ){.  
18e00 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
18e10 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30  lloc( sizeof(p[0
18e20 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20  ])*(objc-1) );. 
18e30 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
18e40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18e50 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f      for(i=0; i<o
18e60 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  bjc-1; i++){.   
18e70 20 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76     Tcl_WideInt v
18e80 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  ;.      if( Tcl_
18e90 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
18ea0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
18eb0 2b 69 5d 2c 20 26 76 29 20 29 7b 0a 20 20 20 20  +i], &v) ){.    
18ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
18ed0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d  (p);.        p =
18ee0 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
18ef0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
18f00 20 20 20 20 7d 0a 20 20 20 20 20 20 70 5b 69 5d      }.      p[i]
18f10 20 3d 20 76 3b 0a 20 20 20 20 7d 0a 20 20 7d 20   = v;.    }.  } 
18f20 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65   .  Tcl_SetObjRe
18f30 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
18f40 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28  _NewWideIntObj((
18f50 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 29  sqlite3_int64)p)
18f60 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
18f70 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67  OK;.}./*.** Usag
18f80 65 3a 20 20 20 64 6f 75 62 6c 65 61 72 72 61 79  e:   doublearray
18f90 5f 61 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a  _addr  INT  ....
18fa0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
18fb0 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d   address of a C-
18fc0 6c 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f  language array o
18fd0 66 20 64 6f 75 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  f doubles..**.**
18fe0 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74   Space to hold t
18ff0 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61  he array is obta
19000 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
19010 28 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70  ().  Call this p
19020 72 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a  rocedure once.**
19030 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
19040 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72  ts in order to r
19050 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20  elease memory.  
19060 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69  Each call to thi
19070 73 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f  s procedure.** o
19080 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72  verwrites the pr
19090 65 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f  evious array..*/
190a0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
190b0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64  TE_TCLAPI test_d
190c0 6f 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72 28  oublearray_addr(
190d0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
190e0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
190f0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19100 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19110 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19120 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
19130 61 74 69 63 20 64 6f 75 62 6c 65 20 2a 70 20 3d  atic double *p =
19140 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66   0;..  sqlite3_f
19150 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b  ree(p);.  p = 0;
19160 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b  .  if( objc>1 ){
19170 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
19180 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
19190 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29  p[0])*(objc-1) )
191a0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
191b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
191c0 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  R;.    for(i=0; 
191d0 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a  i<objc-1; i++){.
191e0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
191f0 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69  tDoubleFromObj(i
19200 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69 5d  nterp, objv[1+i]
19210 2c 20 26 70 5b 69 5d 29 20 29 7b 0a 20 20 20 20  , &p[i]) ){.    
19220 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
19230 28 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d  (p);.        p =
19240 20 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   0;.        retu
19250 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19260 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
19270 20 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65   .  Tcl_SetObjRe
19280 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
19290 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28  _NewWideIntObj((
192a0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 29  sqlite3_int64)p)
192b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
192c0 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67  OK;.}./*.** Usag
192d0 65 3a 20 20 20 74 65 78 74 61 72 72 61 79 5f 61  e:   textarray_a
192e0 64 64 72 20 20 54 45 58 54 20 2e 2e 2e 0a 2a 2a  ddr  TEXT ....**
192f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61  .** Return the a
19300 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c 61  ddress of a C-la
19310 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f 66 20  nguage array of 
19320 73 74 72 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 53  strings..**.** S
19330 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65  pace to hold the
19340 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e   array is obtain
19350 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
19360 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72 6f  .  Call this pro
19370 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77  cedure once.** w
19380 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  ith no arguments
19390 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 6c   in order to rel
193a0 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61  ease memory.  Ea
193b0 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  ch call to this 
193c0 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65  procedure.** ove
193d0 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76  rwrites the prev
193e0 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73  ious array..*/.s
193f0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
19400 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74 65 78  _TCLAPI test_tex
19410 74 61 72 72 61 79 5f 61 64 64 72 28 0a 20 20 76  tarray_addr(.  v
19420 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
19430 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
19440 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
19450 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
19460 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
19470 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
19480 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20 20 73 74   int n = 0;.  st
19490 61 74 69 63 20 63 68 61 72 20 2a 2a 70 20 3d 20  atic char **p = 
194a0 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
194b0 3c 6e 3b 20 69 2b 2b 29 20 73 71 6c 69 74 65 33  <n; i++) sqlite3
194c0 5f 66 72 65 65 28 70 5b 69 5d 29 3b 0a 20 20 73  _free(p[i]);.  s
194d0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
194e0 20 20 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f    p = 0;.  if( o
194f0 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d  bjc>1 ){.    p =
19500 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
19510 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f   sizeof(p[0])*(o
19520 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20 20 69 66  bjc-1) );.    if
19530 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
19540 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66  TCL_ERROR;.    f
19550 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31  or(i=0; i<objc-1
19560 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 70 5b  ; i++){.      p[
19570 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  i] = sqlite3_mpr
19580 69 6e 74 66 28 22 25 73 22 2c 20 54 63 6c 5f 47  intf("%s", Tcl_G
19590 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 2b  etString(objv[1+
195a0 69 5d 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  i]));.    }.  }.
195b0 20 20 6e 20 3d 20 6f 62 6a 63 2d 31 3b 0a 20 20    n = objc-1;.  
195c0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
195d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
195e0 57 69 64 65 49 6e 74 4f 62 6a 28 28 73 71 6c 69  WideIntObj((sqli
195f0 74 65 33 5f 69 6e 74 36 34 29 70 29 29 3b 0a 20  te3_int64)p));. 
19600 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19610 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
19620 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
19630 69 6e 74 36 34 20 20 53 54 4d 54 20 4e 20 56 41  int64  STMT N VA
19640 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  LUE.**.** Test t
19650 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
19660 69 6e 74 36 34 20 69 6e 74 65 72 66 61 63 65 2e  int64 interface.
19670 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
19680 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
19690 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
196a0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
196b0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
196c0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
196d0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
196e0 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67  s a 64-bit integ
196f0 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74  er VALUE to that
19700 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
19710 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
19720 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
19730 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a  _int64(.  void *
19740 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
19750 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
19760 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
19770 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
19780 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
19790 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
197a0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 54 63  .  int idx;.  Tc
197b0 6c 5f 57 69 64 65 49 6e 74 20 76 61 6c 75 65 3b  l_WideInt value;
197c0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
197d0 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
197e0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
197f0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
19800 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
19810 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
19820 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
19830 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
19840 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
19850 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
19860 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19870 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
19880 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
19890 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
198a0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
198b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
198c0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
198d0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
198e0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
198f0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19900 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
19910 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62  GetWideIntFromOb
19920 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
19930 5d 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74  ], &value) ) ret
19940 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
19950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
19960 69 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  ind_int64(pStmt,
19970 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20   idx, value);.  
19980 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
19990 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
199a0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
199b0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
199c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
199d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
199e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
199f0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
19a00 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
19a10 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
19a20 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
19a30 65 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  e  STMT N VALUE.
19a40 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
19a50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62  qlite3_bind_doub
19a60 6c 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  le interface.  S
19a70 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
19a80 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
19a90 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
19aa0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
19ab0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
19ac0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
19ad0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
19ae0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
19af0 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
19b00 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
19b10 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
19b20 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f  API test_bind_do
19b30 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  uble(.  void * c
19b40 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
19b50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
19b60 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
19b70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
19b80 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
19b90 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
19ba0 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75 62   int idx;.  doub
19bb0 6c 65 20 76 61 6c 75 65 20 3d 20 30 3b 0a 20 20  le value = 0;.  
19bc0 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
19bd0 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e  char *zVal;.  in
19be0 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 63 6f  t i;.  static co
19bf0 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
19c00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
19c10 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  me;     /* Name 
19c20 6f 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 66  of the special f
19c30 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
19c40 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67  lue */.    unsig
19c50 6e 65 64 20 69 6e 74 20 69 55 70 70 65 72 3b 20  ned int iUpper; 
19c60 20 20 2f 2a 20 55 70 70 65 72 20 33 32 20 62 69    /* Upper 32 bi
19c70 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e  ts */.    unsign
19c80 65 64 20 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20  ed int iLower;  
19c90 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20 62 69 74   /* Lower 32 bit
19ca0 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65 63 69 61  s */.  } aSpecia
19cb0 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  lFp[] = {.    { 
19cc0 20 22 4e 61 4e 22 2c 20 20 20 20 20 20 30 78 37   "NaN",      0x7
19cd0 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66  fffffff, 0xfffff
19ce0 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53  fff },.    {  "S
19cf0 4e 61 4e 22 2c 20 20 20 20 20 30 78 37 66 66 37  NaN",     0x7ff7
19d00 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
19d10 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e   },.    {  "-NaN
19d20 22 2c 20 20 20 20 20 30 78 66 66 66 66 66 66 66  ",     0xfffffff
19d30 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
19d40 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c  .    {  "-SNaN",
19d50 20 20 20 20 30 78 66 66 66 37 66 66 66 66 2c 20      0xfff7ffff, 
19d60 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
19d70 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20 20 20 20    {  "+Inf",    
19d80 20 30 78 37 66 66 30 30 30 30 30 2c 20 30 78 30   0x7ff00000, 0x0
19d90 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  0000000 },.    {
19da0 20 20 22 2d 49 6e 66 22 2c 20 20 20 20 20 30 78    "-Inf",     0x
19db0 66 66 66 30 30 30 30 30 2c 20 30 78 30 30 30 30  fff00000, 0x0000
19dc0 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0000 },.    {  "
19dd0 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30  Epsilon",  0x000
19de0 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
19df0 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70  1 },.    {  "-Ep
19e00 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30 30 30 30  silon", 0x800000
19e10 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d  00, 0x00000001 }
19e20 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c  ,.    {  "NaN0",
19e30 20 20 20 20 20 30 78 37 66 66 38 30 30 30 30 2c       0x7ff80000,
19e40 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
19e50 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20     {  "-NaN0",  
19e60 20 20 30 78 66 66 66 38 30 30 30 30 2c 20 30 78    0xfff80000, 0x
19e70 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b  00000000 },.  };
19e80 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
19e90 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
19ea0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19eb0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19ec0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
19ed0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19ee0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
19ef0 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
19f00 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
19f10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19f20 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
19f30 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
19f40 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
19f50 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
19f60 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
19f70 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
19f80 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
19f90 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
19fa0 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
19fb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f   TCL_ERROR;..  /
19fc0 2a 20 49 6e 74 65 72 63 65 70 74 20 74 68 65 20  * Intercept the 
19fd0 73 74 72 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64  string "NaN" and
19fe0 20 67 65 6e 65 72 61 74 65 20 61 20 4e 61 4e 20   generate a NaN 
19ff0 76 61 6c 75 65 20 66 6f 72 20 69 74 2e 0a 20 20  value for it..  
1a000 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20 73 74 72  ** All other str
1a010 69 6e 67 73 20 61 72 65 20 70 61 73 73 65 64 20  ings are passed 
1a020 74 68 72 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47  through to Tcl_G
1a030 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
1a040 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44  )..  ** Tcl_GetD
1a050 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73  oubleFromObj() s
1a060 68 6f 75 6c 64 20 75 6e 64 65 72 73 74 61 6e 64  hould understand
1a070 20 22 4e 61 4e 22 20 62 75 74 20 73 6f 6d 65 20   "NaN" but some 
1a080 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f  versions.  ** co
1a090 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a  ntain a bug..  *
1a0a0 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47  /.  zVal = Tcl_G
1a0b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
1a0c0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
1a0d0 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
1a0e0 70 29 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69  p)/sizeof(aSpeci
1a0f0 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  alFp[0]); i++){.
1a100 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
1a110 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61  SpecialFp[i].zNa
1a120 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a  me, zVal)==0 ){.
1a130 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69        sqlite3_ui
1a140 6e 74 36 34 20 78 3b 0a 20 20 20 20 20 20 78 20  nt64 x;.      x 
1a150 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e  = aSpecialFp[i].
1a160 69 55 70 70 65 72 3b 0a 20 20 20 20 20 20 78 20  iUpper;.      x 
1a170 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20 20 78 20  <<= 32;.      x 
1a180 7c 3d 20 61 53 70 65 63 69 61 6c 46 70 5b 69 5d  |= aSpecialFp[i]
1a190 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20 20 20 61  .iLower;.      a
1a1a0 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 76 61  ssert( sizeof(va
1a1b0 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20  lue)==8 );.     
1a1c0 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
1a1d0 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d  x)==8 );.      m
1a1e0 65 6d 63 70 79 28 26 76 61 6c 75 65 2c 20 26 78  emcpy(&value, &x
1a1f0 2c 20 38 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 8);.      brea
1a200 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
1a210 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70  f( i>=sizeof(aSp
1a220 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28  ecialFp)/sizeof(
1a230 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 20 26  aSpecialFp[0]) &
1a240 26 0a 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47  &.         Tcl_G
1a250 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
1a260 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
1a270 20 26 76 61 6c 75 65 29 20 29 7b 0a 20 20 20 20   &value) ){.    
1a280 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a290 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1a2a0 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
1a2b0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c  (pStmt, idx, val
1a2c0 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ue);.  if( sqlit
1a2d0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1a2e0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
1a2f0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
1a300 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a310 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a320 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1a330 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1a340 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a350 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1a360 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
1a370 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a  _null  STMT N.**
1a380 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
1a390 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69  ite3_bind_null i
1a3a0 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
1a3b0 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
1a3c0 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
1a3d0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
1a3e0 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
1a3f0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1a400 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
1a410 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c  d.** binds a NUL
1a420 4c 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  L to the wildcar
1a430 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1a440 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1a450 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20  est_bind_null(. 
1a460 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1a470 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1a480 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1a490 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1a4a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1a4b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a4c0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64  *pStmt;.  int id
1a4d0 78 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  x;.  int rc;..  
1a4e0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1a4f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a500 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1a510 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a520 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
1a530 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
1a540 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
1a550 30 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20 30  0), " STMT N", 0
1a560 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a570 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1a580 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1a590 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1a5a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1a5b0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1a5c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a5d0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1a5e0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1a5f0 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
1a600 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a610 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1a620 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d  3_bind_null(pStm
1a630 74 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 73  t, idx);.  if( s
1a640 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
1a650 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
1a660 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
1a670 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a680 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
1a690 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
1a6a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a6b0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
1a6c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1a6d0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1a6e0 62 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54 20  bind_text  STMT 
1a6f0 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a  N STRING BYTES.*
1a700 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
1a710 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
1a720 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
1a730 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
1a740 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
1a750 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
1a760 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
1a770 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1a780 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
1a790 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54  nd.** binds a UT
1a7a0 46 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49 4e  F-8 string STRIN
1a7b0 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  G to the wildcar
1a7c0 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  d.  The string i
1a7d0 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a  s BYTES bytes.**
1a7e0 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
1a7f0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1a800 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78  PI test_bind_tex
1a810 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
1a820 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a830 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a840 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1a850 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1a860 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1a870 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1a880 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74  t idx;.  int byt
1a890 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75  es;.  char *valu
1a8a0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
1a8b0 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
1a8c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a8d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1a8e0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a8f0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
1a900 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
1a910 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
1a920 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
1a930 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  UE BYTES", 0);. 
1a940 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1a950 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1a960 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1a970 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1a980 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1a990 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1a9a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1a9b0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1a9c0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1a9d0 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
1a9e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a9f0 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29 54  value = (char*)T
1aa00 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
1aa10 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
1aa20 26 62 79 74 65 73 29 3b 0a 20 20 69 66 28 20 54  &bytes);.  if( T
1aa30 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1aa40 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1aa50 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1aa60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1aa70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
1aa80 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
1aa90 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65 73  dx, value, bytes
1aaa0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
1aab0 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  NT);.  if( sqlit
1aac0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1aad0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
1aae0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
1aaf0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ab00 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1ab10 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
1ab20 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ab30 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  p, sqlite3ErrNam
1ab40 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72  e(rc), 0);.    r
1ab50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ab60 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
1ab70 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1ab80 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
1ab90 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d 73  _bind_text16 ?-s
1aba0 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 53 54  tatic? STMT N ST
1abb0 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a  RING BYTES.**.**
1abc0 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
1abd0 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69 6e  3_bind_text16 in
1abe0 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
1abf0 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
1ac00 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
1ac10 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
1ac20 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
1ac30 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
1ac40 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
1ac50 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d  .** binds a UTF-
1ac60 31 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47  16 string STRING
1ac70 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
1ac80 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
1ac90 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20   BYTES bytes.** 
1aca0 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  long..*/.static 
1acb0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1acc0 49 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74  I test_bind_text
1acd0 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
1ace0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1acf0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ad00 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1ad10 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ad20 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1ad30 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1ad40 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1ad50 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
1ad60 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20  ;.  int bytes;. 
1ad70 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20   char *value;.  
1ad80 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20  int rc;..  void 
1ad90 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 20 3d  (*xDel)(void*) =
1ada0 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45   (objc==6?SQLITE
1adb0 5f 53 54 41 54 49 43 3a 53 51 4c 49 54 45 5f 54  _STATIC:SQLITE_T
1adc0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c  RANSIENT);.  Tcl
1add0 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d  _Obj *oStmt    =
1ade0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20   objv[objc-4];. 
1adf0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20   Tcl_Obj *oN    
1ae00 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33     = objv[objc-3
1ae10 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53  ];.  Tcl_Obj *oS
1ae20 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62  tring  = objv[ob
1ae30 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  jc-2];.  Tcl_Obj
1ae40 20 2a 6f 42 79 74 65 73 20 20 20 3d 20 6f 62 6a   *oBytes   = obj
1ae50 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66  v[objc-1];..  if
1ae60 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
1ae70 63 21 3d 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c!=6){.    Tcl_A
1ae80 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ae90 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1aea0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1aeb0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
1aec0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
1aed0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
1aee0 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
1aef0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1af00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1af10 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1af20 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1af30 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 53 74  cl_GetString(oSt
1af40 6d 74 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  mt), &pStmt) ) r
1af50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1af60 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1af70 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1af80 20 6f 4e 2c 20 26 69 64 78 29 20 29 20 72 65 74   oN, &idx) ) ret
1af90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1afa0 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
1afb0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1afc0 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c  FromObj(oString,
1afd0 20 30 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47   0);.  if( Tcl_G
1afe0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1aff0 65 72 70 2c 20 6f 42 79 74 65 73 2c 20 26 62 79  erp, oBytes, &by
1b000 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
1b010 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
1b020 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
1b030 78 74 31 36 28 70 53 74 6d 74 2c 20 69 64 78 2c  xt16(pStmt, idx,
1b040 20 28 76 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20   (void *)value, 
1b050 62 79 74 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20  bytes, xDel);.  
1b060 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
1b070 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
1b080 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
1b090 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
1b0a0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
1b0b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b0c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1b0d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
1b0e0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
1b0f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b100 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23  CL_ERROR;.  }..#
1b110 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b120 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
1b130 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1b140 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1b150 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
1b160 6f 62 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d  ob ?-static? STM
1b170 54 20 4e 20 44 41 54 41 20 42 59 54 45 53 0a 2a  T N DATA BYTES.*
1b180 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
1b190 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20  lite3_bind_blob 
1b1a0 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
1b1b0 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
1b1c0 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
1b1d0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
1b1e0 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
1b1f0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1b200 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
1b210 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c  nd.** binds a BL
1b220 4f 42 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61  OB to the wildca
1b230 72 64 2e 20 20 54 68 65 20 42 4c 4f 42 20 69 73  rd.  The BLOB is
1b240 20 42 59 54 45 53 20 62 79 74 65 73 20 69 6e 20   BYTES bytes in 
1b250 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  size..*/.static 
1b260 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1b270 49 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62  I test_bind_blob
1b280 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b290 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b2a0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b2b0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b2c0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b2d0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1b2e0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1b2f0 20 6c 65 6e 2c 20 69 64 78 3b 0a 20 20 69 6e 74   len, idx;.  int
1b300 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
1b310 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
1b320 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74 72  .  sqlite3_destr
1b330 75 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73 74  uctor_type xDest
1b340 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f  ructor = SQLITE_
1b350 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66  TRANSIENT;..  if
1b360 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
1b370 63 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=6 ){.    Tcl_
1b380 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1b390 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1b3a0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1b3b0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
1b3c0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
1b3d0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
1b3e0 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53  TMT N DATA BYTES
1b3f0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1b400 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b410 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20  ..  if( objc==6 
1b420 29 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63 74  ){.    xDestruct
1b430 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41 54  or = SQLITE_STAT
1b440 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a  IC;.    objv++;.
1b450 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1b460 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1b470 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1b480 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1b490 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b4a0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1b4b0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1b4c0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1b4d0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
1b4e0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 76 61 6c 75  L_ERROR;..  valu
1b4f0 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47  e = (char*)Tcl_G
1b500 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
1b510 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e  bj(objv[3], &len
1b520 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
1b530 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1b540 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74  p, objv[4], &byt
1b550 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
1b560 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 62  _ERROR;..  if( b
1b570 79 74 65 73 3e 6c 65 6e 20 29 7b 0a 20 20 20 20  ytes>len ){.    
1b580 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a  char zBuf[200];.
1b590 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
1b5a0 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
1b5b0 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20 20  ), zBuf,.       
1b5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
1b5d0 61 6e 6e 6f 74 20 75 73 65 20 25 64 20 62 6c 6f  annot use %d blo
1b5e0 62 20 62 79 74 65 73 2c 20 68 61 76 65 20 25 64  b bytes, have %d
1b5f0 22 2c 20 62 79 74 65 73 2c 20 6c 65 6e 29 3b 0a  ", bytes, len);.
1b600 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1b610 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1b620 66 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75  f, -1);.    retu
1b630 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b640 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
1b650 33 5f 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d  3_bind_blob(pStm
1b660 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62  t, idx, value, b
1b670 79 74 65 73 2c 20 78 44 65 73 74 72 75 63 74 6f  ytes, xDestructo
1b680 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
1b690 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1b6a0 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
1b6b0 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
1b6c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b6d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b6e0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
1b6f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1b700 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b710 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1b720 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1b730 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20  parameter_count 
1b740 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
1b750 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1b760 20 77 69 6c 64 63 61 72 64 73 20 69 6e 20 74 68   wildcards in th
1b770 65 20 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e  e given statemen
1b780 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1b790 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1b7a0 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
1b7b0 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  er_count(.  void
1b7c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1b7d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1b7e0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1b7f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1b800 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1b810 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1b820 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
1b830 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1b840 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1b850 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
1b860 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1b870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1b880 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1b890 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1b8a0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1b8b0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1b8c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b8d0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1b8e0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1b8f0 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
1b900 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
1b910 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20  ount(pStmt)));. 
1b920 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1b930 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1b940 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
1b950 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53  arameter_name  S
1b960 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74  TMT  N.**.** Ret
1b970 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
1b980 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72 64  the Nth wildcard
1b990 2e 20 20 54 68 65 20 66 69 72 73 74 20 77 69 6c  .  The first wil
1b9a0 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41  dcard is 1..** A
1b9b0 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
1b9c0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e 20  s returned if N 
1b9d0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
1b9e0 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
1b9f0 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73  rd.** is nameles
1ba00 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
1ba10 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1ba20 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
1ba30 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20  er_name(.  void 
1ba40 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1ba50 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ba60 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1ba70 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1ba80 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1ba90 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1baa0 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66  ;.  int i;..  if
1bab0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1bac0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1bad0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1bae0 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a 20 20  v, "STMT N");.  
1baf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1bb00 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1bb10 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1bb20 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1bb30 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1bb40 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1bb50 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
1bb60 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1bb70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1bb80 2c 20 26 69 29 20 29 20 72 65 74 75 72 6e 20 54  , &i) ) return T
1bb90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
1bba0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1bbb0 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e  erp, .     Tcl_N
1bbc0 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
1bbd0 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
1bbe0 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  er_name(pStmt,i)
1bbf0 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65 74 75  ,-1).  );.  retu
1bc00 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1bc10 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
1bc20 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
1bc30 74 65 72 5f 69 6e 64 65 78 20 20 53 54 4d 54 20  ter_index  STMT 
1bc40 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75   NAME.**.** Retu
1bc50 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  rn the index of 
1bc60 74 68 65 20 77 69 6c 64 63 61 72 64 20 63 61 6c  the wildcard cal
1bc70 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65 74 75 72  led NAME.  Retur
1bc80 6e 20 30 20 69 66 20 74 68 65 72 65 20 69 73 0a  n 0 if there is.
1bc90 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c 64 63  ** no such wildc
1bca0 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
1bcb0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1bcc0 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
1bcd0 65 74 65 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f  eter_index(.  vo
1bce0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1bcf0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1bd00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1bd10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1bd20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1bd30 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1bd40 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
1bd50 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
1bd60 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1bd70 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
1bd80 4d 54 20 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72  MT NAME");.    r
1bd90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bda0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
1bdb0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1bdc0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1bdd0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1bde0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1bdf0 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
1be00 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1be10 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e   .     Tcl_NewIn
1be20 74 4f 62 6a 28 0a 20 20 20 20 20 20 20 73 71 6c  tObj(.       sql
1be30 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
1be40 74 65 72 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c  ter_index(pStmt,
1be50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1be60 6a 76 5b 32 5d 29 29 0a 20 20 20 20 20 29 0a 20  jv[2])).     ). 
1be70 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   );.  return TCL
1be80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1be90 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 63  age:   sqlite3_c
1bea0 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 53 54  lear_bindings ST
1beb0 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  MT.**.*/.static 
1bec0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1bed0 49 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e  I test_clear_bin
1bee0 64 69 6e 67 73 28 0a 20 20 76 6f 69 64 20 2a 20  dings(.  void * 
1bef0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1bf00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1bf10 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1bf20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1bf30 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1bf40 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1bf50 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1bf60 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1bf70 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1bf80 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
1bf90 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1bfa0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1bfb0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1bfc0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1bfd0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1bfe0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1bff0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1c000 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1c010 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1c020 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65  tObj(sqlite3_cle
1c030 61 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d  ar_bindings(pStm
1c040 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
1c050 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1c060 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
1c070 5f 73 6c 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f  _sleep MILLISECO
1c080 4e 44 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  NDS.*/.static in
1c090 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1c0a0 74 65 73 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f  test_sleep(.  vo
1c0b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c0c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c0d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c0e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c0f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1c100 69 6e 74 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f  int ms;..  if( o
1c110 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1c120 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1c130 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1c140 22 4d 49 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b  "MILLISECONDS");
1c150 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c160 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1c170 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1c180 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1c190 31 5d 2c 20 26 6d 73 29 20 29 7b 0a 20 20 20 20  1], &ms) ){.    
1c1a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c1b0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f  ;.  }.  Tcl_SetO
1c1c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1c1d0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
1c1e0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 6d 73 29  qlite3_sleep(ms)
1c1f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1c200 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1c210 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74  age: sqlite3_ext
1c220 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 20 44 42  ended_errcode DB
1c230 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1c240 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  e string represe
1c250 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  ntation of the m
1c260 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74  ost recent sqlit
1c270 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f  e3_* API.** erro
1c280 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51  r code. e.g. "SQ
1c290 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a  LITE_ERROR"..*/.
1c2a0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1c2b0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78  E_TCLAPI test_ex
1c2c0 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64  _errcode(.  void
1c2d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c2e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c2f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1c300 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1c310 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1c320 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
1c330 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1c340 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1c350 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1c360 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1c370 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1c380 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1c390 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1c3a0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
1c3b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c3c0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1c3d0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1c3e0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1c3f0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1c400 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c410 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
1c420 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1c430 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70  de(db);.  Tcl_Ap
1c440 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1c450 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
1c460 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1c470 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c480 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
1c490 3a 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  : sqlite3_errcod
1c4a0 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  e DB.**.** Retur
1c4b0 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  n the string rep
1c4c0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
1c4d0 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  he most recent s
1c4e0 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20  qlite3_* API.** 
1c4f0 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e  error code. e.g.
1c500 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e   "SQLITE_ERROR".
1c510 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1c520 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1c530 74 5f 65 72 72 63 6f 64 65 28 0a 20 20 76 6f 69  t_errcode(.  voi
1c540 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c550 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c560 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c570 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c580 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c590 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
1c5a0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
1c5b0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1c5c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c5d0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1c5e0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1c5f0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1c600 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1c610 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
1c620 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1c630 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1c640 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1c650 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1c660 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1c670 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c680 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1c690 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
1c6a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c6b0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1c6c0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1c6d0 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
1c6e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1c6f0 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
1c700 65 33 5f 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a  e3_errmsg DB.**.
1c710 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 55  ** Returns the U
1c720 54 46 2d 38 20 72 65 70 72 65 73 65 6e 74 61 74  TF-8 representat
1c730 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72 6f 72  ion of the error
1c740 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e 67 20   message string 
1c750 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20  for the.** most 
1c760 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
1c770 20 41 50 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74   API call..*/.st
1c780 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1c790 54 43 4c 41 50 49 20 74 65 73 74 5f 65 72 72 6d  TCLAPI test_errm
1c7a0 73 67 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  sg(.  void * cli
1c7b0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c7c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c7d0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c7e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c7f0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
1c800 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
1c810 72 20 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20  r *zErr;..  if( 
1c820 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1c830 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c840 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1c850 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1c860 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1c870 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c880 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
1c890 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1c8a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1c8b0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1c8c0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1c8d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1c8e0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1c8f0 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
1c900 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1c910 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  db);.  Tcl_SetOb
1c920 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c930 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1c940 28 7a 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72  (zErr, -1));.  r
1c950 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c960 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1c970 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42  test_errmsg16 DB
1c980 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74  .**.** Returns t
1c990 68 65 20 55 54 46 2d 31 36 20 72 65 70 72 65 73  he UTF-16 repres
1c9a0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1c9b0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74  error message st
1c9c0 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20  ring for the.** 
1c9d0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
1c9e0 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20  te3_* API call. 
1c9f0 54 68 69 73 20 69 73 20 61 20 62 79 74 65 20 61  This is a byte a
1ca00 72 72 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74  rray object at t
1ca10 68 65 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c  he TCL .** level
1ca20 2c 20 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65  , and it include
1ca30 73 20 74 68 65 20 30 78 30 30 20 30 78 30 30 20  s the 0x00 0x00 
1ca40 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73  terminator bytes
1ca50 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74   at the end of t
1ca60 68 65 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72  he.** UTF-16 str
1ca70 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
1ca80 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1ca90 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28 0a   test_errmsg16(.
1caa0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1cab0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1cac0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1cad0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1cae0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1caf0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1cb00 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
1cb10 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
1cb20 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20  st void *zErr;. 
1cb30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
1cb40 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30 3b    int bytes = 0;
1cb50 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1cb60 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1cb70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1cb80 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1cb90 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1cba0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1cbb0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1cbc0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1cbd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1cbe0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1cbf0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1cc00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1cc10 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1cc20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1cc30 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
1cc40 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20  _errmsg16(db);. 
1cc50 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
1cc60 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20 20 66   z = zErr;.    f
1cc70 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b 62 79  or(bytes=0; z[by
1cc80 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65 73 2b  tes] || z[bytes+
1cc90 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b 7d 0a  1]; bytes+=2){}.
1cca0 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
1ccb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1ccc0 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
1ccd0 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29 29  bj(zErr, bytes))
1cce0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1ccf0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1cd00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1cd10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1cd20 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
1cd30 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  e DB sql bytes ?
1cd40 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43  tailvar?.**.** C
1cd50 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
1cd60 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
1cd70 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
1cd80 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
1cd90 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
1cda0 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
1cdb0 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
1cdc0 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
1cdd0 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
1cde0 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
1cdf0 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
1ce00 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
1ce10 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
1ce20 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
1ce30 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1ce40 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1ce50 43 4c 41 50 49 20 74 65 73 74 5f 70 72 65 70 61  CLAPI test_prepa
1ce60 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  re(.  void * cli
1ce70 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1ce80 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ce90 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1cea0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ceb0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
1cec0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
1ced0 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62  r *zSql;.  int b
1cee0 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  ytes;.  const ch
1cef0 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20  ar *zTail = 0;. 
1cf00 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1cf10 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1cf20 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74   zBuf[50];.  int
1cf30 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1cf40 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
1cf50 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1cf60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1cf70 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1cf80 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1cf90 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1cfa0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1cfb0 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
1cfc0 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20  lvar?", 0);.    
1cfd0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cfe0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1cff0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1d000 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d010 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1d020 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d030 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
1d040 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
1d050 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
1d060 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1d070 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
1d080 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
1d090 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
1d0a0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 28  sqlite3_prepare(
1d0b0 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c  db, zSql, bytes,
1d0c0 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35   &pStmt, objc>=5
1d0d0 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a   ? &zTail : 0);.
1d0e0 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
1d0f0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66 28  t(interp);.  if(
1d100 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1d110 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
1d120 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
1d130 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54  _ERROR;.  if( zT
1d140 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29  ail && objc>=5 )
1d150 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65 73 3e  {.    if( bytes>
1d160 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65  =0 ){.      byte
1d170 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69 6e 74  s = bytes - (int
1d180 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20  )(zTail-zSql);. 
1d190 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28 69 6e     }.    if( (in
1d1a0 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3c  t)strlen(zTail)<
1d1b0 62 79 74 65 73 20 29 7b 0a 20 20 20 20 20 20 62  bytes ){.      b
1d1c0 79 74 65 73 20 3d 20 28 69 6e 74 29 73 74 72 6c  ytes = (int)strl
1d1d0 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20 20 20 7d  en(zTail);.    }
1d1e0 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56  .    Tcl_ObjSetV
1d1f0 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  ar2(interp, objv
1d200 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53  [4], 0, Tcl_NewS
1d210 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20  tringObj(zTail, 
1d220 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a  bytes), 0);.  }.
1d230 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d240 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1d250 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t( pStmt==0 );. 
1d260 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1d270 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
1d280 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  , zBuf, "(%d) ",
1d290 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
1d2a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d2b0 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
1d2c0 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
1d2d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d2e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1d2f0 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
1d300 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1d310 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1d320 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
1d330 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d340 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
1d350 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d360 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
1d370 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d380 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1d390 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
1d3a0 65 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65  e_v2 DB sql byte
1d3b0 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a  s ?tailvar?.**.*
1d3c0 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
1d3d0 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
1d3e0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
1d3f0 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
1d400 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
1d410 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
1d420 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
1d430 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
1d440 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
1d450 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
1d460 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
1d470 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
1d480 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
1d490 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
1d4a0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1d4b0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1d4c0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72  E_TCLAPI test_pr
1d4d0 65 70 61 72 65 5f 76 32 28 0a 20 20 76 6f 69 64  epare_v2(.  void
1d4e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1d4f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1d500 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1d510 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1d520 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1d530 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
1d540 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
1d550 20 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 30   char *zCopy = 0
1d560 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1d570 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29 20 63 6f 70   /* malloc() cop
1d580 79 20 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 69  y of zSql */.  i
1d590 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73  nt bytes;.  cons
1d5a0 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20  t char *zTail = 
1d5b0 30 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  0;.  const char 
1d5c0 2a 2a 70 7a 54 61 69 6c 3b 0a 20 20 73 71 6c 69  **pzTail;.  sqli
1d5d0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20  te3_stmt *pStmt 
1d5e0 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  = 0;.  char zBuf
1d5f0 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  [50];.  int rc;.
1d600 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26  .  if( objc!=5 &
1d610 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
1d620 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1d630 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1d640 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1d650 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1d660 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1d670 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c  jv[0]), " DB sql
1d680 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c   bytes tailvar",
1d690 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1d6a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1d6b0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1d6c0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1d6d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1d6e0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1d6f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71  TCL_ERROR;.  zSq
1d700 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  l = Tcl_GetStrin
1d710 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
1d720 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1d730 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1d740 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
1d750 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d760 0a 0a 20 20 2f 2a 20 49 6e 73 74 65 61 64 20 6f  ..  /* Instead o
1d770 66 20 75 73 69 6e 67 20 7a 53 71 6c 20 64 69 72  f using zSql dir
1d780 65 63 74 6c 79 2c 20 6d 61 6b 65 20 61 20 63 6f  ectly, make a co
1d790 70 79 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  py into a buffer
1d7a0 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 64   obtained.  ** d
1d7b0 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 6d 61 6c  irectly from mal
1d7c0 6c 6f 63 28 29 2e 20 54 68 65 20 69 64 65 61 20  loc(). The idea 
1d7d0 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61  is to make it ea
1d7e0 73 69 65 72 20 66 6f 72 20 76 61 6c 67 72 69 6e  sier for valgrin
1d7f0 64 0a 20 20 2a 2a 20 74 6f 20 73 70 6f 74 20 62  d.  ** to spot b
1d800 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2e  uffer overreads.
1d810 20 20 2a 2f 0a 20 20 69 66 28 20 62 79 74 65 73    */.  if( bytes
1d820 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 43 6f 70 79  >=0 ){.    zCopy
1d830 20 3d 20 6d 61 6c 6c 6f 63 28 62 79 74 65 73 29   = malloc(bytes)
1d840 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
1d850 70 79 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 29  py, zSql, bytes)
1d860 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1d870 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  nt n = (int)strl
1d880 65 6e 28 7a 53 71 6c 29 20 2b 20 31 3b 0a 20 20  en(zSql) + 1;.  
1d890 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63    zCopy = malloc
1d8a0 28 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (n);.    memcpy(
1d8b0 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 6e 29 3b  zCopy, zSql, n);
1d8c0 0a 20 20 7d 0a 20 20 70 7a 54 61 69 6c 20 3d 20  .  }.  pzTail = 
1d8d0 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c  objc>=5 ? &zTail
1d8e0 20 3a 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   : 0;.  rc = sql
1d8f0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1d900 64 62 2c 20 7a 43 6f 70 79 2c 20 62 79 74 65 73  db, zCopy, bytes
1d910 2c 20 26 70 53 74 6d 74 2c 20 70 7a 54 61 69 6c  , &pStmt, pzTail
1d920 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35  );.  if( objc>=5
1d930 20 29 7b 0a 20 20 20 20 7a 54 61 69 6c 20 3d 20   ){.    zTail = 
1d940 26 7a 53 71 6c 5b 28 7a 54 61 69 6c 20 2d 20 7a  &zSql[(zTail - z
1d950 43 6f 70 79 29 5d 3b 0a 20 20 7d 0a 20 20 66 72  Copy)];.  }.  fr
1d960 65 65 28 7a 43 6f 70 79 29 3b 0a 0a 20 20 61 73  ee(zCopy);..  as
1d970 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
1d980 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b  OK || pStmt==0);
1d990 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
1d9a0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69 66  lt(interp);.  if
1d9b0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
1d9c0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
1d9d0 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
1d9e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
1d9f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
1da00 6f 62 6a 63 3e 3d 35 20 26 26 20 7a 54 61 69 6c  objc>=5 && zTail
1da10 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
1da20 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
1da30 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69  tes = bytes - (i
1da40 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b  nt)(zTail-zSql);
1da50 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
1da60 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
1da70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
1da80 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
1da90 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
1daa0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
1dab0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dac0 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
1dad0 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1dae0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1daf0 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28  (zBuf), zBuf, "(
1db00 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
1db10 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1db20 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
1db30 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
1db40 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
1db50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1db60 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
1db70 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1db80 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1db90 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1dba0 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
1dbb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1dbc0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1dbd0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1dbe0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1dbf0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1dc00 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1dc10 70 72 65 70 61 72 65 5f 76 33 20 44 42 20 73 71  prepare_v3 DB sq
1dc20 6c 20 62 79 74 65 73 20 66 6c 61 67 73 20 3f 74  l bytes flags ?t
1dc30 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f  ailvar?.**.** Co
1dc40 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74  mpile up to <byt
1dc50 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65  es> bytes of the
1dc60 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74   supplied SQL st
1dc70 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67  ring <sql> using
1dc80 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e  .** database han
1dc90 64 6c 65 20 3c 44 42 3e 20 61 6e 64 20 66 6c 61  dle <DB> and fla
1dca0 67 73 20 3c 66 6c 61 67 73 3e 2e 20 54 68 65 20  gs <flags>. The 
1dcb0 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
1dcc0 61 6c 3e 20 69 73 0a 2a 2a 20 74 68 65 20 6e 61  al> is.** the na
1dcd0 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 20 76  me of a global v
1dce0 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
1dcf0 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
1dd00 64 20 70 6f 72 74 69 6f 6e 20 6f 66 0a 2a 2a 20  d portion of.** 
1dd10 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20  <sql> (if any). 
1dd20 41 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  A STMT handle is
1dd30 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1dd40 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1dd50 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72 65 70  TCLAPI test_prep
1dd60 61 72 65 5f 76 33 28 0a 20 20 76 6f 69 64 20 2a  are_v3(.  void *
1dd70 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1dd80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1dd90 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1dda0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1ddb0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1ddc0 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
1ddd0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63   char *zSql;.  c
1dde0 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 30 3b 20  har *zCopy = 0; 
1ddf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1de00 2a 20 6d 61 6c 6c 6f 63 28 29 20 63 6f 70 79 20  * malloc() copy 
1de10 6f 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 69 6e 74  of zSql */.  int
1de20 20 62 79 74 65 73 2c 20 66 6c 61 67 73 3b 0a 20   bytes, flags;. 
1de30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1de40 69 6c 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  il = 0;.  const 
1de50 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 3b 0a 20  char **pzTail;. 
1de60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1de70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1de80 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74   zBuf[50];.  int
1de90 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1dea0 21 3d 36 20 26 26 20 6f 62 6a 63 21 3d 35 20 29  !=6 && objc!=5 )
1deb0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1dec0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1ded0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1dee0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1def0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1df00 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1df10 42 20 73 71 6c 20 62 79 74 65 73 20 66 6c 61 67  B sql bytes flag
1df20 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a  s tailvar", 0);.
1df30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1df40 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1df50 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1df60 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1df70 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1df80 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1df90 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54  RROR;.  zSql = T
1dfa0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1dfb0 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c  v[2]);.  if( Tcl
1dfc0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1dfd0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
1dfe0 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
1dff0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1e000 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1e010 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1e020 5b 34 5d 2c 20 26 66 6c 61 67 73 29 20 29 20 72  [4], &flags) ) r
1e030 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e040 0a 0a 20 20 2f 2a 20 49 6e 73 74 65 61 64 20 6f  ..  /* Instead o
1e050 66 20 75 73 69 6e 67 20 7a 53 71 6c 20 64 69 72  f using zSql dir
1e060 65 63 74 6c 79 2c 20 6d 61 6b 65 20 61 20 63 6f  ectly, make a co
1e070 70 79 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72  py into a buffer
1e080 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 64   obtained.  ** d
1e090 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 6d 61 6c  irectly from mal
1e0a0 6c 6f 63 28 29 2e 20 54 68 65 20 69 64 65 61 20  loc(). The idea 
1e0b0 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61  is to make it ea
1e0c0 73 69 65 72 20 66 6f 72 20 76 61 6c 67 72 69 6e  sier for valgrin
1e0d0 64 0a 20 20 2a 2a 20 74 6f 20 73 70 6f 74 20 62  d.  ** to spot b
1e0e0 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2e  uffer overreads.
1e0f0 20 20 2a 2f 0a 20 20 69 66 28 20 62 79 74 65 73    */.  if( bytes
1e100 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 43 6f 70 79  >=0 ){.    zCopy
1e110 20 3d 20 6d 61 6c 6c 6f 63 28 62 79 74 65 73 29   = malloc(bytes)
1e120 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
1e130 70 79 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 29  py, zSql, bytes)
1e140 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
1e150 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c  nt n = (int)strl
1e160 65 6e 28 7a 53 71 6c 29 20 2b 20 31 3b 0a 20 20  en(zSql) + 1;.  
1e170 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63    zCopy = malloc
1e180 28 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  (n);.    memcpy(
1e190 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 6e 29 3b  zCopy, zSql, n);
1e1a0 0a 20 20 7d 0a 20 20 70 7a 54 61 69 6c 20 3d 20  .  }.  pzTail = 
1e1b0 6f 62 6a 63 3e 3d 36 20 3f 20 26 7a 54 61 69 6c  objc>=6 ? &zTail
1e1c0 20 3a 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   : 0;.  rc = sql
1e1d0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33 28  ite3_prepare_v3(
1e1e0 64 62 2c 20 7a 43 6f 70 79 2c 20 62 79 74 65 73  db, zCopy, bytes
1e1f0 2c 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29  , (unsigned int)
1e200 66 6c 61 67 73 2c 26 70 53 74 6d 74 2c 70 7a 54  flags,&pStmt,pzT
1e210 61 69 6c 29 3b 0a 20 20 66 72 65 65 28 7a 43 6f  ail);.  free(zCo
1e220 70 79 29 3b 0a 20 20 7a 54 61 69 6c 20 3d 20 26  py);.  zTail = &
1e230 7a 53 71 6c 5b 28 7a 54 61 69 6c 20 2d 20 7a 43  zSql[(zTail - zC
1e240 6f 70 79 29 5d 3b 0a 0a 20 20 61 73 73 65 72 74  opy)];..  assert
1e250 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  (rc==SQLITE_OK |
1e260 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 54  | pStmt==0);.  T
1e270 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1e280 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71  nterp);.  if( sq
1e290 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1e2a0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1e2b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e2c0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ROR;.  if( rc==S
1e2d0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 54 61 69  QLITE_OK && zTai
1e2e0 6c 20 26 26 20 6f 62 6a 63 3e 3d 36 20 29 7b 0a  l && objc>=6 ){.
1e2f0 20 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30      if( bytes>=0
1e300 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20   ){.      bytes 
1e310 3d 20 62 79 74 65 73 20 2d 20 28 69 6e 74 29 28  = bytes - (int)(
1e320 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20  zTail-zSql);.   
1e330 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65   }.    Tcl_ObjSe
1e340 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62  tVar2(interp, ob
1e350 6a 76 5b 35 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65  jv[5], 0, Tcl_Ne
1e360 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c  wStringObj(zTail
1e370 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20  , bytes), 0);.  
1e380 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
1e390 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1e3a0 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
1e3b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1e3c0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1e3d0 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20  f), zBuf, "(%d) 
1e3e0 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
1e3f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e400 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
1e410 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
1e420 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1e430 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1e440 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1e450 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1e460 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1e470 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
1e480 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1e490 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
1e4a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1e4b0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
1e4c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1e4d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1e4e0 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
1e4f0 61 72 65 5f 74 6b 74 33 31 33 34 20 44 42 0a 2a  are_tkt3134 DB.*
1e500 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20  *.** Generate a 
1e510 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
1e520 6e 74 20 66 6f 72 20 61 20 7a 65 72 6f 2d 62 79  nt for a zero-by
1e530 74 65 20 73 74 72 69 6e 67 20 61 73 20 61 20 74  te string as a t
1e540 65 73 74 0a 2a 2a 20 66 6f 72 20 74 69 63 6b 65  est.** for ticke
1e550 74 20 23 33 31 33 34 2e 20 20 54 68 65 20 73 74  t #3134.  The st
1e560 72 69 6e 67 20 73 68 6f 75 6c 64 20 62 65 20 70  ring should be p
1e570 72 65 63 65 64 65 64 20 62 79 20 61 20 7a 65 72  receded by a zer
1e580 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  o byte..*/.stati
1e590 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1e5a0 41 50 49 20 74 65 73 74 5f 70 72 65 70 61 72 65  API test_prepare
1e5b0 5f 74 6b 74 33 31 33 34 28 0a 20 20 76 6f 69 64  _tkt3134(.  void
1e5c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1e5d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e5e0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1e5f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1e600 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1e610 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 74 61  lite3 *db;.  sta
1e620 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 7a  tic const char z
1e630 53 71 6c 5b 5d 20 3d 20 22 5c 30 30 30 53 45 4c  Sql[] = "\000SEL
1e640 45 43 54 20 31 22 3b 0a 20 20 73 71 6c 69 74 65  ECT 1";.  sqlite
1e650 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1e660 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
1e670 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  0];.  int rc;.. 
1e680 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1e690 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e6a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1e6b0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1e6c0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1e6d0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1e6e0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20  (objv[0]), " DB 
1e6f0 73 71 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61  sql bytes tailva
1e700 72 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  r", 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 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1e730 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1e740 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1e750 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1e760 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e770 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1e780 70 61 72 65 5f 76 32 28 64 62 2c 20 26 7a 53 71  pare_v2(db, &zSq
1e790 6c 5b 31 5d 2c 20 30 2c 20 26 70 53 74 6d 74 2c  l[1], 0, &pStmt,
1e7a0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63   0);.  assert(rc
1e7b0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
1e7c0 53 74 6d 74 3d 3d 30 29 3b 0a 20 20 69 66 28 20  Stmt==0);.  if( 
1e7d0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1e7e0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
1e7f0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1e800 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
1e810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e820 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
1e830 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1e840 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1e850 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
1e860 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20  (%d) ", rc);.   
1e870 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e880 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1e890 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1e8a0 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
1e8b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e8c0 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1e8d0 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1e8e0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1e8f0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1e900 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1e910 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1e920 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1e930 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1e940 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1e950 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1e960 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1e970 5f 70 72 65 70 61 72 65 31 36 20 44 42 20 73 71  _prepare16 DB sq
1e980 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a  l bytes tailvar.
1e990 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1e9a0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1e9b0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1e9c0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1e9d0 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1e9e0 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1e9f0 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1ea00 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
1ea10 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
1ea20 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
1ea30 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1ea40 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1ea50 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
1ea60 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
1ea70 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1ea80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1ea90 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1eaa0 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20 76  t_prepare16(.  v
1eab0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1eac0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1ead0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1eae0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1eaf0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1eb00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1eb10 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
1eb20 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
1eb30 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f  void *zSql;.  co
1eb40 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20  nst void *zTail 
1eb50 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  = 0;.  Tcl_Obj *
1eb60 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  pTail = 0;.  sql
1eb70 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1eb80 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
1eb90 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63  f[50]; .  int rc
1eba0 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20  ;.  int bytes;  
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ebc0 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70 65   The integer spe
1ebd0 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33 20  cified as arg 3 
1ebe0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b  */.  int objlen;
1ebf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ec00 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61 79  * The byte-array
1ec10 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32   length of arg 2
1ec20 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
1ec30 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =5 && objc!=4 ){
1ec40 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1ec50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1ec60 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1ec70 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1ec80 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1ec90 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
1eca0 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
1ecb0 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72  var?", 0);.    r
1ecc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ecd0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1ece0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1ecf0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1ed00 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1ed10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ed20 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  .  zSql = Tcl_Ge
1ed30 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
1ed40 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c  j(objv[2], &objl
1ed50 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  en);.  if( Tcl_G
1ed60 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1ed70 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
1ed80 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
1ed90 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
1eda0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1edb0 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  e16(db, zSql, by
1edc0 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
1edd0 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
1ede0 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
1edf0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1ee00 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
1ee10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ee20 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1ee30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ee40 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  R;.  }..  if( ob
1ee50 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28  jc>=5 ){.    if(
1ee60 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20   zTail ){.      
1ee70 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20  objlen = objlen 
1ee80 2d 20 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 54  - (int)((u8 *)zT
1ee90 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b  ail-(u8 *)zSql);
1eea0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1eeb0 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20    objlen = 0;.  
1eec0 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20    }.    pTail = 
1eed0 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
1eee0 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c  Obj((u8 *)zTail,
1eef0 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63   objlen);.    Tc
1ef00 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
1ef10 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f  Tail);.    Tcl_O
1ef20 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
1ef30 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54  , objv[4], 0, pT
1ef40 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  ail, 0);.    Tcl
1ef50 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _DecrRefCount(pT
1ef60 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ail);.  }..  if(
1ef70 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
1ef80 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1ef90 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1efa0 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
1efb0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1efc0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  ROR;.  }.  Tcl_A
1efd0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1efe0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65  rp, zBuf, 0);.#e
1eff0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1f000 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
1f010 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1f020 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1f030 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f  lite3_prepare16_
1f040 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73 20  v2 DB sql bytes 
1f050 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20  ?tailvar?.**.** 
1f060 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62  Compile up to <b
1f070 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74  ytes> bytes of t
1f080 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20  he supplied SQL 
1f090 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69  string <sql> usi
1f0a0 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68  ng.** database h
1f0b0 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20  andle <DB>. The 
1f0c0 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76  parameter <tailv
1f0d0 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  al> is the name 
1f0e0 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76  of a global.** v
1f0f0 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20  ariable that is 
1f100 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65  set to the unuse
1f110 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71  d portion of <sq
1f120 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a  l> (if any). A.*
1f130 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73  * STMT handle is
1f140 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
1f150 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1f160 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72 65 70  TCLAPI test_prep
1f170 61 72 65 31 36 5f 76 32 28 0a 20 20 76 6f 69 64  are16_v2(.  void
1f180 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f190 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f1a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1f1b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1f1c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1f1d0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1f1e0 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20  UTF16.  sqlite3 
1f1f0 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db;.  const voi
1f200 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74  d *zSql;.  const
1f210 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30   void *zTail = 0
1f220 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61  ;.  Tcl_Obj *pTa
1f230 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  il = 0;.  sqlite
1f240 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1f250 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35  0;.  char zBuf[5
1f260 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20  0]; .  int rc;. 
1f270 20 69 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20   int bytes;     
1f280 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
1f290 65 20 69 6e 74 65 67 65 72 20 73 70 65 63 69 66  e integer specif
1f2a0 69 65 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a  ied as arg 3 */.
1f2b0 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20    int objlen;   
1f2c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1f2d0 68 65 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65  he byte-array le
1f2e0 6e 67 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f  ngth of arg 2 */
1f2f0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
1f300 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
1f310 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1f320 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1f330 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1f340 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1f350 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1f360 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
1f370 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
1f380 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
1f390 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f3a0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1f3b0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1f3c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1f3d0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1f3e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f3f0 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79  zSql = Tcl_GetBy
1f400 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
1f410 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29  bjv[2], &objlen)
1f420 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1f430 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1f440 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65  , objv[3], &byte
1f450 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
1f460 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
1f470 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
1f480 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  _v2(db, zSql, by
1f490 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
1f4a0 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
1f4b0 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  0);.  if( sqlite
1f4c0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1f4d0 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
1f4e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f4f0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
1f500 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f510 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  R;.  }..  if( ob
1f520 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28  jc>=5 ){.    if(
1f530 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 20 20   zTail ){.      
1f540 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e 20  objlen = objlen 
1f550 2d 20 28 69 6e 74 29 28 28 75 38 20 2a 29 7a 54  - (int)((u8 *)zT
1f560 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29 3b  ail-(u8 *)zSql);
1f570 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1f580 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20 20    objlen = 0;.  
1f590 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d 20    }.    pTail = 
1f5a0 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
1f5b0 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c 2c  Obj((u8 *)zTail,
1f5c0 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54 63   objlen);.    Tc
1f5d0 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
1f5e0 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 4f  Tail);.    Tcl_O
1f5f0 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
1f600 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70 54  , objv[4], 0, pT
1f610 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63 6c  ail, 0);.    Tcl
1f620 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54  _DecrRefCount(pT
1f630 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ail);.  }..  if(
1f640 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66   pStmt ){.    if
1f650 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1f660 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1f670 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29  rp, zBuf, pStmt)
1f680 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1f690 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41  ROR;.  }.  Tcl_A
1f6a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f6b0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65  rp, zBuf, 0);.#e
1f6c0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1f6d0 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
1f6e0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1f6f0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1f700 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69 6c 65 6e  lite3_open filen
1f710 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d 6c 69 73  ame ?options-lis
1f720 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t?.*/.static int
1f730 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1f740 65 73 74 5f 6f 70 65 6e 28 0a 20 20 76 6f 69 64  est_open(.  void
1f750 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f760 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f770 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1f780 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1f790 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f  T objv[].){.  co
1f7a0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1f7b0 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
1f7c0 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  db;.  char zBuf[
1f7d0 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
1f7e0 63 21 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20  c!=3 && objc!=2 
1f7f0 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  && objc!=1 ){.  
1f800 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1f810 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1f820 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1f830 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1f840 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1f850 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e  bjv[0]), " filen
1f860 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74  ame options-list
1f870 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1f880 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f890 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  ..  zFilename = 
1f8a0 6f 62 6a 63 3e 31 20 3f 20 54 63 6c 5f 47 65 74  objc>1 ? Tcl_Get
1f8b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 20  String(objv[1]) 
1f8c0 3a 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f  : 0;.  sqlite3_o
1f8d0 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  pen(zFilename, &
1f8e0 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71  db);.  .  if( sq
1f8f0 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1f900 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1f910 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75  zBuf, db) ) retu
1f920 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f930 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1f940 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1f950 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1f960 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1f970 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ge: sqlite3_open
1f980 5f 76 32 20 46 49 4c 45 4e 41 4d 45 20 46 4c 41  _v2 FILENAME FLA
1f990 47 53 20 56 46 53 0a 2a 2f 0a 73 74 61 74 69 63  GS VFS.*/.static
1f9a0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1f9b0 50 49 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32 28  PI test_open_v2(
1f9c0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1f9d0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1f9e0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1f9f0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1fa00 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1fa10 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1fa20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 6f  *zFilename;.  co
1fa30 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b 0a  nst char *zVfs;.
1fa40 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 30 3b    int flags = 0;
1fa50 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1fa60 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
1fa70 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
1fa80 6e 74 20 6e 46 6c 61 67 3b 0a 20 20 54 63 6c 5f  nt nFlag;.  Tcl_
1fa90 4f 62 6a 20 2a 2a 61 70 46 6c 61 67 3b 0a 20 20  Obj **apFlag;.  
1faa0 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f 62  int i;..  if( ob
1fab0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
1fac0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1fad0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1fae0 46 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20 56  FILENAME FLAGS V
1faf0 46 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  FS");.    return
1fb00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1fb10 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63    zFilename = Tc
1fb20 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1fb30 5b 31 5d 29 3b 0a 20 20 7a 56 66 73 20 3d 20 54  [1]);.  zVfs = T
1fb40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1fb50 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20 7a 56 66  v[3]);.  if( zVf
1fb60 73 5b 30 5d 3d 3d 30 78 30 30 20 29 20 7a 56 66  s[0]==0x00 ) zVf
1fb70 73 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 54  s = 0;..  rc = T
1fb80 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  cl_ListObjGetEle
1fb90 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62  ments(interp, ob
1fba0 6a 76 5b 32 5d 2c 20 26 6e 46 6c 61 67 2c 20 26  jv[2], &nFlag, &
1fbb0 61 70 46 6c 61 67 29 3b 0a 20 20 69 66 28 20 72  apFlag);.  if( r
1fbc0 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75  c!=TCL_OK ) retu
1fbd0 72 6e 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  rn rc;.  for(i=0
1fbe0 3b 20 69 3c 6e 46 6c 61 67 3b 20 69 2b 2b 29 7b  ; i<nFlag; i++){
1fbf0 0a 20 20 20 20 69 6e 74 20 69 46 6c 61 67 3b 0a  .    int iFlag;.
1fc00 20 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 46      struct OpenF
1fc10 6c 61 67 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  lag {.      cons
1fc20 74 20 63 68 61 72 20 2a 7a 46 6c 61 67 3b 0a 20  t char *zFlag;. 
1fc30 20 20 20 20 20 69 6e 74 20 66 6c 61 67 3b 0a 20       int flag;. 
1fc40 20 20 20 7d 20 61 46 6c 61 67 5b 5d 20 3d 20 7b     } aFlag[] = {
1fc50 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1fc60 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 22 2c  _OPEN_READONLY",
1fc70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1fc80 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 7b  DONLY },.      {
1fc90 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   "SQLITE_OPEN_RE
1fca0 41 44 57 52 49 54 45 22 2c 20 53 51 4c 49 54 45  ADWRITE", SQLITE
1fcb0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
1fcc0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1fcd0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 22 2c  TE_OPEN_CREATE",
1fce0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
1fcf0 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  ATE },.      { "
1fd00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
1fd10 54 45 4f 4e 43 4c 4f 53 45 22 2c 20 53 51 4c 49  TEONCLOSE", SQLI
1fd20 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
1fd30 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20 20 20 7b  CLOSE },.      {
1fd40 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58   "SQLITE_OPEN_EX
1fd50 43 4c 55 53 49 56 45 22 2c 20 53 51 4c 49 54 45  CLUSIVE", SQLITE
1fd60 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
1fd70 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1fd80 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
1fd90 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y", SQLITE_OPEN_
1fda0 41 55 54 4f 50 52 4f 58 59 20 7d 2c 0a 20 20 20  AUTOPROXY },.   
1fdb0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1fdc0 4e 5f 4d 41 49 4e 5f 44 42 22 2c 20 53 51 4c 49  N_MAIN_DB", SQLI
1fdd0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
1fde0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1fdf0 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 22  TE_OPEN_TEMP_DB"
1fe00 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  , SQLITE_OPEN_TE
1fe10 4d 50 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b  MP_DB },.      {
1fe20 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52   "SQLITE_OPEN_TR
1fe30 41 4e 53 49 45 4e 54 5f 44 42 22 2c 20 53 51 4c  ANSIENT_DB", SQL
1fe40 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
1fe50 4e 54 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b  NT_DB },.      {
1fe60 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41   "SQLITE_OPEN_MA
1fe70 49 4e 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c  IN_JOURNAL", SQL
1fe80 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1fe90 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b  URNAL },.      {
1fea0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45   "SQLITE_OPEN_TE
1feb0 4d 50 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c  MP_JOURNAL", SQL
1fec0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
1fed0 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b  URNAL },.      {
1fee0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55   "SQLITE_OPEN_SU
1fef0 42 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54  BJOURNAL", SQLIT
1ff00 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
1ff10 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  L },.      { "SQ
1ff20 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52  LITE_OPEN_MASTER
1ff30 5f 4a 4f 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54  _JOURNAL", SQLIT
1ff40 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
1ff50 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20 20 7b  URNAL },.      {
1ff60 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f   "SQLITE_OPEN_NO
1ff70 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f  MUTEX", SQLITE_O
1ff80 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7d 2c 0a 20  PEN_NOMUTEX },. 
1ff90 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1ffa0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 22 2c 20  PEN_FULLMUTEX", 
1ffb0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
1ffc0 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b  MUTEX },.      {
1ffd0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48   "SQLITE_OPEN_SH
1ffe0 41 52 45 44 43 41 43 48 45 22 2c 20 53 51 4c 49  AREDCACHE", SQLI
1fff0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
20000 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  CHE },.      { "
20010 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
20020 41 54 45 43 41 43 48 45 22 2c 20 53 51 4c 49 54  ATECACHE", SQLIT
20030 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
20040 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  CHE },.      { "
20050 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 22  SQLITE_OPEN_WAL"
20060 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41  , SQLITE_OPEN_WA
20070 4c 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  L },.      { "SQ
20080 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 22 2c 20  LITE_OPEN_URI", 
20090 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20  SQLITE_OPEN_URI 
200a0 7d 2c 0a 20 20 20 20 20 20 7b 20 30 2c 20 30 20  },.      { 0, 0 
200b0 7d 0a 20 20 20 20 7d 3b 0a 20 20 20 20 72 63 20  }.    };.    rc 
200c0 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  = Tcl_GetIndexFr
200d0 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65  omObjStruct(inte
200e0 72 70 2c 20 61 70 46 6c 61 67 5b 69 5d 2c 20 61  rp, apFlag[i], a
200f0 46 6c 61 67 2c 20 73 69 7a 65 6f 66 28 61 46 6c  Flag, sizeof(aFl
20100 61 67 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20  ag[0]), .       
20110 20 22 66 6c 61 67 22 2c 20 30 2c 20 26 69 46 6c   "flag", 0, &iFl
20120 61 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  ag.    );.    if
20130 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
20140 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 66 6c  eturn rc;.    fl
20150 61 67 73 20 7c 3d 20 61 46 6c 61 67 5b 69 46 6c  ags |= aFlag[iFl
20160 61 67 5d 2e 66 6c 61 67 3b 0a 20 20 7d 0a 0a 20  ag].flag;.  }.. 
20170 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
20180 65 6e 5f 76 32 28 7a 46 69 6c 65 6e 61 6d 65 2c  en_v2(zFilename,
20190 20 26 64 62 2c 20 66 6c 61 67 73 2c 20 7a 56 66   &db, flags, zVf
201a0 73 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  s);.  if( sqlite
201b0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
201c0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
201d0 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54  , db) ) return T
201e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
201f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
20200 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
20210 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
20220 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
20230 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 20 66  sqlite3_open16 f
20240 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 0a  ilename options.
20250 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
20260 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
20270 5f 6f 70 65 6e 31 36 28 0a 20 20 76 6f 69 64 20  _open16(.  void 
20280 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
20290 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
202a0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
202b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
202c0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
202d0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
202e0 54 46 31 36 0a 20 20 63 6f 6e 73 74 20 76 6f 69  TF16.  const voi
202f0 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  d *zFilename;.  
20300 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
20310 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
20320 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
20330 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
20340 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
20350 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
20360 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
20370 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
20380 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 66 69  g(objv[0]), " fi
20390 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73 2d 6c  lename options-l
203a0 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ist", 0);.    re
203b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
203c0 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61 6d 65    }..  zFilename
203d0 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
203e0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
203f0 31 5d 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  1], 0);.  sqlite
20400 33 5f 6f 70 65 6e 31 36 28 7a 46 69 6c 65 6e 61  3_open16(zFilena
20410 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69  me, &db);.  .  i
20420 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
20430 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
20440 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
20450 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
20460 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
20470 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
20480 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  uf, 0);.#endif /
20490 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
204a0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
204b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
204c0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
204d0 63 6f 6d 70 6c 65 74 65 31 36 20 3c 55 54 46 2d  complete16 <UTF-
204e0 31 36 20 73 74 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a  16 string>.**.**
204f0 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
20500 20 73 75 70 70 6c 69 65 64 20 61 72 67 75 6d 65   supplied argume
20510 6e 74 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  nt is a complete
20520 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
20530 6f 72 20 7a 65 72 6f 0a 2a 2a 20 6f 74 68 65 72  or zero.** other
20540 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
20550 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
20560 49 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74 65 31  I test_complete1
20570 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
20580 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
20590 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
205a0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
205b0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
205c0 5d 0a 29 7b 0a 23 69 66 20 21 64 65 66 69 6e 65  ].){.#if !define
205d0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f  d(SQLITE_OMIT_CO
205e0 4d 50 4c 45 54 45 29 20 26 26 20 21 64 65 66 69  MPLETE) && !defi
205f0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
20600 55 54 46 31 36 29 0a 20 20 63 68 61 72 20 2a 7a  UTF16).  char *z
20610 42 75 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  Buf;..  if( objc
20620 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
20630 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
20640 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 75  rp, 1, objv, "<u
20650 74 66 2d 31 36 20 73 71 6c 3e 22 29 3b 0a 20 20  tf-16 sql>");.  
20660 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
20670 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 42 75 66 20  OR;.  }..  zBuf 
20680 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74  = (char*)Tcl_Get
20690 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
206a0 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
206b0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
206c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
206d0 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63  IntObj(sqlite3_c
206e0 6f 6d 70 6c 65 74 65 31 36 28 7a 42 75 66 29 29  omplete16(zBuf))
206f0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
20700 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
20710 45 20 26 26 20 53 51 4c 49 54 45 5f 4f 4d 49 54  E && SQLITE_OMIT
20720 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75  _UTF16 */.  retu
20730 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
20740 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
20750 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 20 53 51 4c  e3_normalize SQL
20760 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
20770 65 20 6e 6f 72 6d 61 6c 69 7a 65 64 20 76 61 6c  e normalized val
20780 75 65 20 66 6f 72 20 61 6e 20 53 51 4c 20 73 74  ue for an SQL st
20790 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
207a0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
207b0 4c 41 50 49 20 74 65 73 74 5f 6e 6f 72 6d 61 6c  LAPI test_normal
207c0 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ize(.  void * cl
207d0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
207e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
207f0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
20800 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
20810 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a  v[].){.  char *z
20820 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 6f  Sql;.  char *zNo
20830 72 6d 3b 0a 20 20 65 78 74 65 72 6e 20 63 68 61  rm;.  extern cha
20840 72 20 2a 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61  r *sqlite3_norma
20850 6c 69 7a 65 28 63 6f 6e 73 74 20 63 68 61 72 2a  lize(const char*
20860 29 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  );..  if( objc!=
20870 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
20880 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
20890 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 51 4c 22  , 1, objv, "SQL"
208a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
208b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
208c0 7a 53 71 6c 20 3d 20 28 63 68 61 72 2a 29 54 63  zSql = (char*)Tc
208d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
208e0 5b 31 5d 29 3b 0a 20 20 7a 4e 6f 72 6d 20 3d 20  [1]);.  zNorm = 
208f0 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a  sqlite3_normaliz
20900 65 28 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a  e(zSql);.  if( z
20910 4e 6f 72 6d 20 29 7b 0a 20 20 20 20 54 63 6c 5f  Norm ){.    Tcl_
20920 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
20930 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
20940 6e 67 4f 62 6a 28 7a 4e 6f 72 6d 2c 20 2d 31 29  ngObj(zNorm, -1)
20950 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
20960 72 65 65 28 7a 4e 6f 72 6d 29 3b 0a 20 20 7d 0a  ree(zNorm);.  }.
20970 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
20980 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
20990 20 73 71 6c 69 74 65 33 5f 73 74 65 70 20 53 54   sqlite3_step ST
209a0 4d 54 0a 2a 2a 0a 2a 2a 20 41 64 76 61 6e 63 65  MT.**.** Advance
209b0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 74   the statement t
209c0 6f 20 74 68 65 20 6e 65 78 74 20 72 6f 77 2e 0a  o the next row..
209d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
209e0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
209f0 5f 73 74 65 70 28 0a 20 20 76 6f 69 64 20 2a 20  _step(.  void * 
20a00 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
20a10 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20a20 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
20a30 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
20a40 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
20a50 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
20a60 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
20a70 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
20a80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
20a90 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
20aa0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
20ab0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
20ac0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
20ad0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 22 2c 20  v[0]), " STMT", 
20ae0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
20af0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
20b00 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
20b10 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
20b20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
20b30 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
20b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20b50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
20b60 74 65 70 28 70 53 74 6d 74 29 3b 0a 0a 20 20 2f  tep(pStmt);..  /
20b70 2a 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45  * if( rc!=SQLITE
20b80 5f 44 4f 4e 45 20 26 26 20 72 63 21 3d 53 51 4c  _DONE && rc!=SQL
20b90 49 54 45 5f 52 4f 57 20 29 20 72 65 74 75 72 6e  ITE_ROW ) return
20ba0 20 54 43 4c 5f 45 52 52 4f 52 3b 20 2a 2f 0a 20   TCL_ERROR; */. 
20bb0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
20bc0 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
20bd0 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
20be0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
20bf0 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
20c00 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
20c10 20 74 65 73 74 5f 73 71 6c 28 0a 20 20 76 6f 69   test_sql(.  voi
20c20 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
20c30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
20c40 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
20c50 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
20c60 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
20c70 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
20c80 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
20c90 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
20ca0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
20cb0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
20cc0 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
20cd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
20ce0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
20cf0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
20d00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
20d10 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
20d20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20d30 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
20d40 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
20d50 29 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74  )sqlite3_sql(pSt
20d60 6d 74 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  mt), TCL_VOLATIL
20d70 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  E);.  return TCL
20d80 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
20d90 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
20da0 74 65 73 74 5f 65 78 5f 73 71 6c 28 0a 20 20 76  test_ex_sql(.  v
20db0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
20dc0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
20dd0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
20de0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
20df0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
20e00 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
20e10 53 74 6d 74 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  Stmt;.  char *z;
20e20 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
20e30 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
20e40 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
20e50 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
20e60 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
20e70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
20e80 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
20e90 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
20ea0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
20eb0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
20ec0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20ed0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 61  z = sqlite3_expa
20ee0 6e 64 65 64 5f 73 71 6c 28 70 53 74 6d 74 29 3b  nded_sql(pStmt);
20ef0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
20f00 28 69 6e 74 65 72 70 2c 20 7a 2c 20 54 43 4c 5f  (interp, z, TCL_
20f10 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 73 71 6c  VOLATILE);.  sql
20f20 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
20f30 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
20f40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
20f50 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a  NABLE_NORMALIZE.
20f60 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
20f70 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6e 6f  E_TCLAPI test_no
20f80 72 6d 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a  rm_sql(.  void *
20f90 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
20fa0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
20fb0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
20fc0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
20fd0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
20fe0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
20ff0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
21000 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
21010 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
21020 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29  1, objv, "STMT")
21030 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
21040 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
21050 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
21060 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
21070 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
21080 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
21090 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
210a0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
210b0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
210c0 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64  lite3_normalized
210d0 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c  _sql(pStmt), TCL
210e0 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65  _VOLATILE);.  re
210f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
21100 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
21110 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45  ENABLE_NORMALIZE
21120 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65   */../*.** Usage
21130 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
21140 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a  _count STMT .**.
21150 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
21160 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
21170 72 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20  returned by the 
21180 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 53 54  sql statement ST
21190 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MT..*/.static in
211a0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
211b0 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  test_column_coun
211c0 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
211d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
211e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
211f0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
21200 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
21210 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
21220 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
21230 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
21240 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
21250 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
21260 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
21270 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
21280 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
21290 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
212a0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
212b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
212c0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
212d0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
212e0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
212f0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
21300 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
21310 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
21320 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
21330 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
21340 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  bj(sqlite3_colum
21350 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  n_count(pStmt)))
21360 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
21370 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
21380 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
21390 6e 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75  n_type STMT colu
213a0 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
213b0 74 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20  the type of the 
213c0 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27  data in column '
213d0 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63  column' of the c
213e0 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73  urrent row..*/.s
213f0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
21400 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c  _TCLAPI test_col
21410 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  umn_type(.  void
21420 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
21430 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
21440 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
21450 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21460 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
21470 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
21480 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
21490 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f  int tp;..  if( o
214a0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
214b0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
214c0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
214d0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
214e0 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
214f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
21500 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
21510 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
21520 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
21530 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
21540 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
21550 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
21560 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
21570 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21580 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
21590 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
215a0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
215b0 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
215c0 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20  _ERROR;..  tp = 
215d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
215e0 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ype(pStmt, col);
215f0 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29 7b  .  switch( tp ){
21600 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
21610 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20 20  _INTEGER: .     
21620 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
21630 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52 22  nterp, "INTEGER"
21640 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
21650 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
21660 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
21670 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  L:.      Tcl_Set
21680 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
21690 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49  NULL", TCL_STATI
216a0 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
216b0 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
216c0 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54  E_FLOAT:.      T
216d0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
216e0 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43  erp, "FLOAT", TC
216f0 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
21700 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
21710 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20  e SQLITE_TEXT:. 
21720 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
21730 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58 54  lt(interp, "TEXT
21740 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
21750 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
21760 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
21770 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  OB:.      Tcl_Se
21780 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
21790 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54  "BLOB", TCL_STAT
217a0 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
217b0 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
217c0 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
217d0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
217e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
217f0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
21800 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54  olumn_int64 STMT
21810 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
21820 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
21830 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
21840 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
21850 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a 2a  row cast as an.*
21860 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29 20  * wide (64-bit) 
21870 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
21880 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
21890 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e  LAPI test_column
218a0 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a  _int64(.  void *
218b0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
218c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
218d0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
218e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
218f0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
21900 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
21910 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 69 36  .  int col;.  i6
21920 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f  4 iVal;..  if( o
21930 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
21940 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
21950 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
21960 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
21970 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
21980 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
21990 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
219a0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
219b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
219c0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
219d0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
219e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
219f0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
21a00 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21a10 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
21a20 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
21a30 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
21a40 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
21a50 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61 6c 20  _ERROR;..  iVal 
21a60 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
21a70 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 63 6f  _int64(pStmt, co
21a80 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  l);.  Tcl_SetObj
21a90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
21aa0 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
21ab0 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72  (iVal));.  retur
21ac0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
21ad0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
21ae0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 53 54  3_column_blob ST
21af0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61  MT column.*/.sta
21b00 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
21b10 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d  CLAPI test_colum
21b20 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  n_blob(.  void *
21b30 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
21b40 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
21b50 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
21b60 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
21b70 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
21b80 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
21b90 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20 20 69  .  int col;..  i
21ba0 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73 74 20  nt len;.  const 
21bb0 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a 20 20  void *pBlob;..  
21bc0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
21bd0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
21be0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
21bf0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
21c00 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
21c10 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
21c20 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
21c30 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
21c40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21c50 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
21c60 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
21c70 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
21c80 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
21c90 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
21ca0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
21cb0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
21cc0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
21cd0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
21ce0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
21cf0 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  len = sqlite3_co
21d00 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
21d10 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f 62 20  , col);.  pBlob 
21d20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
21d30 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63 6f 6c  _blob(pStmt, col
21d40 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
21d50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
21d60 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
21d70 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29 3b 0a  j(pBlob, len));.
21d80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
21d90 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
21da0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
21db0 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f 6c 75  double STMT colu
21dc0 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  mn.**.** Return 
21dd0 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75  the data in colu
21de0 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74  mn 'column' of t
21df0 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77 20 63  he current row c
21e00 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c 65 2e  ast as a double.
21e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
21e20 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
21e30 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  t_column_double(
21e40 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
21e50 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
21e60 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
21e70 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
21e80 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
21e90 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
21ea0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
21eb0 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20 72 56  col;.  double rV
21ec0 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  al;..  if( objc!
21ed0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
21ee0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
21ef0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
21f00 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
21f10 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
21f20 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
21f30 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
21f40 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
21f50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
21f60 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
21f70 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
21f80 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
21f90 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
21fa0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
21fb0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
21fc0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
21fd0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
21fe0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
21ff0 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20 73 71  OR;..  rVal = sq
22000 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
22010 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ble(pStmt, col);
22020 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
22030 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
22040 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 56 61  NewDoubleObj(rVa
22050 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
22060 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
22070 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 61  sage: sqlite3_da
22080 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a  ta_count STMT .*
22090 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
220a0 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
220b0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
220c0 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
220d0 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
220e0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
220f0 49 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e  I test_data_coun
22100 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
22110 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
22120 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
22130 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
22140 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
22150 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
22160 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
22170 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
22180 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
22190 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
221a0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
221b0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
221c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
221d0 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
221e0 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
221f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22200 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
22210 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
22220 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
22230 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
22240 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
22250 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
22260 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
22270 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
22280 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74 61 5f  bj(sqlite3_data_
22290 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
222a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
222b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
222c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
222d0 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  text STMT column
222e0 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
222f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
22300 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d  ltype STMT colum
22310 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  n.**.** Usage: s
22320 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
22330 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  me STMT column.*
22340 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
22350 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
22360 73 74 6d 74 5f 75 74 66 38 28 0a 20 20 76 6f 69  stmt_utf8(.  voi
22370 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  d * clientData, 
22380 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
22390 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20  r to SQLite API 
223a0 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
223b0 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c 5f 49  nvoke */.  Tcl_I
223c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
223d0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
223e0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
223f0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
22400 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
22410 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20  nt col;.  const 
22420 63 68 61 72 20 2a 28 2a 78 46 75 6e 63 29 28 73  char *(*xFunc)(s
22430 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
22440 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t);.  const char
22450 20 2a 7a 52 65 74 3b 0a 0a 20 20 78 46 75 6e 63   *zRet;..  xFunc
22460 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
22470 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  (*)(sqlite3_stmt
22480 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44 61  *, int))clientDa
22490 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ta;.  if( objc!=
224a0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
224b0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
224c0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
224d0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
224e0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
224f0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
22500 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
22510 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
22520 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
22530 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
22540 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
22550 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
22560 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
22570 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22580 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
22590 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
225a0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
225b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
225c0 52 3b 0a 20 20 7a 52 65 74 20 3d 20 78 46 75 6e  R;.  zRet = xFun
225d0 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  c(pStmt, col);. 
225e0 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20 20 20   if( zRet ){.   
225f0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
22600 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 7a  nterp, (char *)z
22610 52 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Ret, 0);.  }.  r
22620 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
22630 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
22640 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 67  TE_TCLAPI test_g
22650 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20  lobal_recover(. 
22660 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
22670 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
22680 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
22690 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
226a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
226b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
226c0 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
226d0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
226e0 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
226f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
22700 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
22710 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   "");.    return
22720 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67    rc = sqlite3_g
22740 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b  lobal_recover();
22750 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
22760 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
22770 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
22780 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23  , TCL_STATIC);.#
22790 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
227a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
227b0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
227c0 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20  olumn_text STMT 
227d0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
227e0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
227f0 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54  mn_decltype STMT
22800 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
22810 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
22820 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f  umn_name STMT co
22830 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
22840 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
22850 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
22860 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
22870 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f  tData,     /* Po
22880 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20  inter to SQLite 
22890 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  API function to 
228a0 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20  be invoked */.  
228b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
228c0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
228d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
228e0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
228f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
22900 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73  TF16.  sqlite3_s
22910 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
22920 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a  t col;.  Tcl_Obj
22930 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20   *pRet;.  const 
22940 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20  void *zName16;. 
22950 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78   const void *(*x
22960 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
22970 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46  mt*, int);..  xF
22980 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69  unc = (const voi
22990 64 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73  d *(*)(sqlite3_s
229a0 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e  tmt*, int))clien
229b0 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a  tData;.  if( obj
229c0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
229d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
229e0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
229f0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
22a00 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
22a10 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
22a20 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
22a30 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
22a40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
22a50 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
22a60 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
22a70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
22a80 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
22a90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22aa0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
22ab0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
22ac0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
22ad0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
22ae0 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36  RROR;..  zName16
22af0 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20   = xFunc(pStmt, 
22b00 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  col);.  if( zNam
22b10 65 31 36 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  e16 ){.    int n
22b20 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
22b30 20 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20   *z = zName16;. 
22b40 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d     for(n=0; z[n]
22b50 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32   || z[n+1]; n+=2
22b60 29 7b 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 54  ){}.    pRet = T
22b70 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
22b80 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32 29  bj(zName16, n+2)
22b90 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
22ba0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
22bb0 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  Ret);.  }.#endif
22bc0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
22bd0 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75  UTF16 */..  retu
22be0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
22bf0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
22c00 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54  e3_column_int ST
22c10 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
22c20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
22c30 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54  olumn_bytes STMT
22c40 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
22c50 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
22c60 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54  umn_bytes16 STMT
22c70 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74   column.**.*/.st
22c80 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
22c90 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74  TCLAPI test_stmt
22ca0 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _int(.  void * c
22cb0 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a  lientData,    /*
22cc0 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
22cd0 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
22ce0 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f  to be invoked */
22cf0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22d00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
22d10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
22d20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
22d30 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
22d40 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
22d50 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73    int (*xFunc)(s
22d60 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
22d70 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  t);..  xFunc = (
22d80 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65 33 5f  int (*)(sqlite3_
22d90 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65  stmt*, int))clie
22da0 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62  ntData;.  if( ob
22db0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
22dc0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
22dd0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
22de0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
22df0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
22e00 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
22e10 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
22e20 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
22e30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22e40 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
22e50 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
22e60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22e70 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
22e80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
22e90 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
22ea0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
22eb0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
22ec0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
22ed0 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
22ee0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
22ef0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
22f00 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f  (xFunc(pStmt, co
22f10 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  l)));.  return T
22f20 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
22f30 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 73  Usage:  sqlite_s
22f40 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d 41  et_magic  DB  MA
22f50 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a  GIC-NUMBER.**.**
22f60 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61 67   Set the db->mag
22f70 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  ic value.  This 
22f80 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
22f90 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20 6c  error recovery l
22fa0 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ogic..*/.static 
22fb0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
22fc0 49 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67  I sqlite_set_mag
22fd0 69 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ic(.  void * cli
22fe0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
22ff0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
23000 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
23010 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71  r **argv.){.  sq
23020 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
23030 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
23040 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
23050 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
23060 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
23070 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
23080 20 20 20 20 20 20 20 20 20 22 20 44 42 20 4d 41           " DB MA
23090 47 49 43 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  GIC", 0);.    re
230a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
230b0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
230c0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
230d0 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
230e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
230f0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  .  if( strcmp(ar
23100 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
23110 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30 20 29  AGIC_OPEN")==0 )
23120 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20  {.    db->magic 
23130 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f  = SQLITE_MAGIC_O
23140 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  PEN;.  }else if(
23150 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
23160 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43   "SQLITE_MAGIC_C
23170 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a 20 20  LOSED")==0 ){.  
23180 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
23190 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53 45  LITE_MAGIC_CLOSE
231a0 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  D;.  }else if( s
231b0 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
231c0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
231d0 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62  Y")==0 ){.    db
231e0 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
231f0 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 7d  _MAGIC_BUSY;.  }
23200 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
23210 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
23220 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22 29 3d 3d  _MAGIC_ERROR")==
23230 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
23240 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
23250 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  C_ERROR;.  }else
23260 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
23270 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
23280 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d 61 67 69   (int*)&db->magi
23290 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  c) ){.    return
232a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
232b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
232c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
232d0 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72    sqlite3_interr
232e0 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a 20 54  upt  DB .**.** T
232f0 72 69 67 67 65 72 20 61 6e 20 69 6e 74 65 72 72  rigger an interr
23300 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61  upt on DB.*/.sta
23310 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
23320 43 4c 41 50 49 20 74 65 73 74 5f 69 6e 74 65 72  CLAPI test_inter
23330 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  rupt(.  void * c
23340 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
23350 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
23360 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
23370 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
23380 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
23390 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
233a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
233b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
233c0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
233d0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
233e0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
233f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23400 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
23410 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
23420 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
23430 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
23440 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  OR;.  sqlite3_in
23450 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20 20 72  terrupt(db);.  r
23460 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
23470 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
23480 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63  lite_delete_func
23490 74 69 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e  tion DB function
234a0 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65  -name.**.** Dele
234b0 74 65 20 74 68 65 20 75 73 65 72 20 66 75 6e 63  te the user func
234c0 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e  tion 'function-n
234d0 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61  ame' from databa
234e0 73 65 20 68 61 6e 64 6c 65 20 44 42 2e 20 49 74  se handle DB. It
234f0 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74  .** is assumed t
23500 68 61 74 20 74 68 65 20 75 73 65 72 20 66 75 6e  hat the user fun
23510 63 74 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65  ction was create
23520 64 20 61 73 20 55 54 46 38 2c 20 61 6e 79 20 6e  d as UTF8, any n
23530 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75  umber of.** argu
23540 6d 65 6e 74 73 20 28 74 68 65 20 77 61 79 20 74  ments (the way t
23550 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  he TCL interface
23560 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74   does it)..*/.st
23570 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
23580 54 43 4c 41 50 49 20 64 65 6c 65 74 65 5f 66 75  TCLAPI delete_fu
23590 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
235a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
235b0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
235c0 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
235d0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
235e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
235f0 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
23600 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
23610 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23620 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23630 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23640 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
23650 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
23660 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
23670 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23680 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
23690 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
236a0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
236b0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
236c0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
236d0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
236e0 63 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ction(db, argv[2
236f0 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ], -1, SQLITE_UT
23700 46 38 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  F8, 0, 0, 0, 0);
23710 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
23720 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
23730 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
23740 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
23750 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
23760 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
23770 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f  sqlite_delete_co
23780 6c 6c 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61  llation DB colla
23790 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20  tion-name.**.** 
237a0 44 65 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61  Delete the colla
237b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63  tion sequence 'c
237c0 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66  ollation-name' f
237d0 72 6f 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e  rom database han
237e0 64 6c 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69  dle .** DB. It i
237f0 73 20 61 73 73 75 6d 65 64 20 74 68 61 74 20 74  s assumed that t
23800 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
23810 75 65 6e 63 65 20 77 61 73 20 63 72 65 61 74 65  uence was create
23820 64 20 61 73 20 55 54 46 38 20 28 74 68 65 20 0a  d as UTF8 (the .
23830 2a 2a 20 77 61 79 20 74 68 65 20 54 43 4c 20 69  ** way the TCL i
23840 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74  nterface does it
23850 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
23860 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64   SQLITE_TCLAPI d
23870 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  elete_collation(
23880 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
23890 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
238a0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
238b0 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a  t argc,.  char *
238c0 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72  *argv.){.  int r
238d0 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
238e0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
238f0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
23900 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
23910 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
23920 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
23930 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
23940 22 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61  " DB function-na
23950 6d 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  me", 0);.    ret
23960 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23970 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
23980 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
23990 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
239a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
239b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
239c0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
239d0 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c  db, argv[2], SQL
239e0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b  ITE_UTF8, 0, 0);
239f0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
23a00 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
23a10 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
23a20 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
23a30 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
23a40 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
23a50 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
23a60 63 6f 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20  commit DB.**.** 
23a70 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
23a80 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 69  he database DB i
23a90 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61  s currently in a
23aa0 75 74 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e  uto-commit mode.
23ab0 0a 2a 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65  .** Return false
23ac0 20 69 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   if not..*/.stat
23ad0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
23ae0 4c 41 50 49 20 67 65 74 5f 61 75 74 6f 63 6f 6d  LAPI get_autocom
23af0 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  mit(.  void * cl
23b00 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
23b10 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
23b20 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68    int argc,.  ch
23b30 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63  ar **argv.){.  c
23b40 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20  har zBuf[30];.  
23b50 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
23b60 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20  f( argc!=2 ){.  
23b70 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
23b80 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
23b90 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
23ba0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
23bb0 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 22  , .        " DB"
23bc0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
23bd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23be0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
23bf0 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
23c00 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
23c10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
23c20 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
23c30 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
23c40 75 66 2c 20 22 25 64 22 2c 20 73 71 6c 69 74 65  uf, "%d", sqlite
23c50 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
23c60 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70  (db));.  Tcl_App
23c70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
23c80 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
23c90 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
23ca0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
23cb0 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
23cc0 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20 53 65  t DB MS.**.** Se
23cd0 74 20 74 68 65 20 62 75 73 79 20 74 69 6d 65 6f  t the busy timeo
23ce0 75 74 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ut.  This is mor
23cf0 65 20 65 61 73 69 6c 79 20 64 6f 6e 65 20 75 73  e easily done us
23d00 69 6e 67 20 74 68 65 20 74 69 6d 65 6f 75 74 0a  ing the timeout.
23d10 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ** method of the
23d20 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 20   TCL interface. 
23d30 20 42 75 74 20 77 65 20 6e 65 65 64 20 61 20 77   But we need a w
23d40 61 79 20 74 6f 20 74 65 73 74 20 74 68 65 20 63  ay to test the c
23d50 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 69 74 20  ase.** where it 
23d60 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d  returns SQLITE_M
23d70 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  ISUSE..*/.static
23d80 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
23d90 50 49 20 74 65 73 74 5f 62 75 73 79 5f 74 69 6d  PI test_busy_tim
23da0 65 6f 75 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  eout(.  void * c
23db0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
23dc0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
23dd0 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
23de0 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
23df0 69 6e 74 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71  int rc, ms;.  sq
23e00 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
23e10 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
23e20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
23e30 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
23e40 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
23e50 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
23e60 0a 20 20 20 20 20 20 20 20 22 20 44 42 22 2c 20  .        " DB", 
23e70 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
23e80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23e90 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
23ea0 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
23eb0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
23ec0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
23ed0 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
23ee0 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73  rp, argv[2], &ms
23ef0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
23f00 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
23f10 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75  ite3_busy_timeou
23f20 74 28 64 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c  t(db, ms);.  Tcl
23f30 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
23f40 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
23f50 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
23f60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
23f70 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
23f80 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70  tcl_variable_typ
23f90 65 20 56 41 52 49 41 42 4c 45 4e 41 4d 45 0a 2a  e VARIABLENAME.*
23fa0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
23fb0 6e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 74 65  name of the inte
23fc0 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74  rnal representat
23fd0 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 76  ion for the.** v
23fe0 61 6c 75 65 20 6f 66 20 74 68 65 20 67 69 76 65  alue of the give
23ff0 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73  n variable..*/.s
24000 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
24010 5f 54 43 4c 41 50 49 20 74 63 6c 5f 76 61 72 69  _TCLAPI tcl_vari
24020 61 62 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f 69  able_type(.  voi
24030 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
24040 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
24050 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
24060 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
24070 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54  ST objv[].){.  T
24080 63 6c 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20  cl_Obj *pVar;.  
24090 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
240a0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
240b0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
240c0 62 6a 76 2c 20 22 56 41 52 49 41 42 4c 45 22 29  bjv, "VARIABLE")
240d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
240e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56  _ERROR;.  }.  pV
240f0 61 72 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32  ar = Tcl_GetVar2
24100 45 78 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  Ex(interp, Tcl_G
24110 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
24120 29 2c 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f  ), 0, TCL_LEAVE_
24130 45 52 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20  ERR_MSG);.  if( 
24140 70 56 61 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  pVar==0 ) return
24150 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
24160 28 20 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20  ( pVar->typePtr 
24170 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
24180 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
24190 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
241a0 28 70 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e  (pVar->typePtr->
241b0 6e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a  name, -1));.  }.
241c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
241d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
241e0 20 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73    sqlite3_releas
241f0 65 5f 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a  e_memory ?N?.**.
24200 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65  ** Attempt to re
24210 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72  lease memory cur
24220 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 75 74 20  rently held but 
24230 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71  not actually req
24240 75 69 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e  uired..** The in
24250 74 65 67 65 72 20 4e 20 69 73 20 74 68 65 20 6e  teger N is the n
24260 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 77  umber of bytes w
24270 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
24280 72 65 6c 65 61 73 65 2e 20 20 54 68 65 20 0a 2a  release.  The .*
24290 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  * return value i
242a0 73 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  s the amount of 
242b0 6d 65 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79 20  memory actually 
242c0 72 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61  released..*/.sta
242d0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
242e0 43 4c 41 50 49 20 74 65 73 74 5f 72 65 6c 65 61  CLAPI test_relea
242f0 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69  se_memory(.  voi
24300 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
24310 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
24320 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
24330 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
24340 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
24350 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
24360 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
24370 4e 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65  NAGEMENT) && !de
24380 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
24390 54 5f 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20  T_DISKIO).  int 
243a0 4e 3b 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20  N;.  int amt;.  
243b0 69 66 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f  if( objc!=1 && o
243c0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
243d0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
243e0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
243f0 22 3f 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  "?N?");.    retu
24400 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24410 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  }.  if( objc==2 
24420 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
24430 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
24440 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e  erp, objv[1], &N
24450 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
24460 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
24470 20 20 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20     N = -1;.  }. 
24480 20 61 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72   amt = sqlite3_r
24490 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29  elease_memory(N)
244a0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
244b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
244c0 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29  _NewIntObj(amt))
244d0 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
244e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
244f0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
24500 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
24510 65 6d 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20 41  emory DB.**.** A
24520 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73  ttempt to releas
24530 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74  e memory current
24540 6c 79 20 68 65 6c 64 20 62 79 20 64 61 74 61 62  ly held by datab
24550 61 73 65 20 44 42 2e 20 20 52 65 74 75 72 6e 20  ase DB.  Return 
24560 74 68 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f  the.** result co
24570 64 65 20 28 77 68 69 63 68 20 69 6e 20 74 68 65  de (which in the
24580 20 63 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65   current impleme
24590 6e 74 61 74 69 6f 6e 20 69 73 20 61 6c 77 61 79  ntation is alway
245a0 73 20 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61 74  s zero)..*/.stat
245b0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
245c0 4c 41 50 49 20 74 65 73 74 5f 64 62 5f 72 65 6c  LAPI test_db_rel
245d0 65 61 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76  ease_memory(.  v
245e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
245f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
24600 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
24610 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
24620 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
24630 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
24640 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62  int rc;.  if( ob
24650 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
24660 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
24670 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
24680 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
24690 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
246a0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
246b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
246c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
246d0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
246e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
246f0 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65   = sqlite3_db_re
24700 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29  lease_memory(db)
24710 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
24720 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
24730 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
24740 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
24750 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
24760 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 61  :  sqlite3_db_ca
24770 63 68 65 66 6c 75 73 68 20 44 42 0a 2a 2a 0a 2a  cheflush DB.**.*
24780 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 66 6c 75  * Attempt to flu
24790 73 68 20 61 6e 79 20 64 69 72 74 79 20 70 61 67  sh any dirty pag
247a0 65 73 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73  es to disk..*/.s
247b0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
247c0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 62 5f  _TCLAPI test_db_
247d0 63 61 63 68 65 66 6c 75 73 68 28 0a 20 20 76 6f  cacheflush(.  vo
247e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
247f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
24800 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
24810 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
24820 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
24830 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
24840 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a  nt rc;.  if( obj
24850 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
24860 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
24870 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
24880 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  B");.    return 
24890 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
248a0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
248b0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
248c0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
248d0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
248e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
248f0 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63  = sqlite3_db_cac
24900 68 65 66 6c 75 73 68 28 64 62 29 3b 0a 20 20 69  heflush(db);.  i
24910 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c  f( rc ){.    Tcl
24920 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
24930 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
24940 65 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43  e3ErrStr(rc), TC
24950 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
24960 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24970 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65  .  }..  Tcl_Rese
24980 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
24990 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
249a0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
249b0 3a 20 20 73 71 6c 69 74 65 33 5f 73 79 73 74 65  :  sqlite3_syste
249c0 6d 5f 65 72 72 6e 6f 20 44 42 0a 2a 2a 0a 2a 2a  m_errno DB.**.**
249d0 20 52 65 74 75 72 6e 20 74 68 65 20 6c 6f 77 2d   Return the low-
249e0 6c 65 76 65 6c 20 73 79 73 74 65 6d 20 65 72 72  level system err
249f0 6e 6f 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  no value..*/.sta
24a00 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
24a10 43 4c 41 50 49 20 74 65 73 74 5f 73 79 73 74 65  CLAPI test_syste
24a20 6d 5f 65 72 72 6e 6f 28 0a 20 20 76 6f 69 64 20  m_errno(.  void 
24a30 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
24a40 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
24a50 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
24a60 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
24a70 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
24a80 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
24a90 69 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 62  iErrno;.  if( ob
24aa0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
24ab0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
24ac0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
24ad0 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
24ae0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24af0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
24b00 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
24b10 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
24b20 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
24b30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 45   TCL_ERROR;.  iE
24b40 72 72 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 73  rrno = sqlite3_s
24b50 79 73 74 65 6d 5f 65 72 72 6e 6f 28 64 62 29 3b  ystem_errno(db);
24b60 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
24b70 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
24b80 4e 65 77 49 6e 74 4f 62 6a 28 69 45 72 72 6e 6f  NewIntObj(iErrno
24b90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
24ba0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
24bb0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
24bc0 5f 66 69 6c 65 6e 61 6d 65 20 44 42 20 44 42 4e  _filename DB DBN
24bd0 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
24be0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66   the name of a f
24bf0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
24c00 69 74 68 20 61 20 64 61 74 61 62 61 73 65 2e 0a  ith a database..
24c10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
24c20 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
24c30 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20  _db_filename(.  
24c40 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
24c50 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
24c60 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
24c70 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
24c80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
24c90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
24ca0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
24cb0 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Name;.  if( objc
24cc0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
24cd0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
24ce0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
24cf0 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72   DBNAME");.    r
24d00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24d10 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
24d20 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
24d30 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
24d40 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
24d50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24d60 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c  .  zDbName = Tcl
24d70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
24d80 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
24d90 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
24da0 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
24db0 61 6d 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ame(db, zDbName)
24dc0 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72  , (void*)0);.  r
24dd0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
24de0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
24df0 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
24e00 6c 79 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a  ly DB DBNAME.**.
24e10 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30  ** Return 1 or 0
24e20 20 69 66 20 44 42 4e 41 4d 45 20 69 73 20 72 65   if DBNAME is re
24e30 61 64 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20  adonly or not.  
24e40 52 65 74 75 72 6e 20 2d 31 20 69 66 20 44 42 4e  Return -1 if DBN
24e50 41 4d 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20  AME does.** not 
24e60 65 78 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  exist..*/.static
24e70 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
24e80 50 49 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f  PI test_db_reado
24e90 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nly(.  void * cl
24ea0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
24eb0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
24ec0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
24ed0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
24ee0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
24ef0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
24f00 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69  ar *zDbName;.  i
24f10 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
24f20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
24f30 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
24f40 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29  jv, "DB DBNAME")
24f50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
24f60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
24f70 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
24f80 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
24f90 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
24fa0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
24fb0 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d  _ERROR;.  zDbNam
24fc0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
24fd0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63  g(objv[2]);.  Tc
24fe0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
24ff0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
25000 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 62 5f  tObj(sqlite3_db_
25010 72 65 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44 62  readonly(db, zDb
25020 4e 61 6d 65 29 29 29 3b 0a 20 20 72 65 74 75 72  Name)));.  retur
25030 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
25040 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
25050 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
25060 69 74 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65  it ?N?.**.** Que
25070 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f  ry or set the so
25080 66 74 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f  ft heap limit fo
25090 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68  r the current th
250a0 72 65 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69  read.  The.** li
250b0 6d 69 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e  mit is only chan
250c0 67 65 64 20 69 66 20 74 68 65 20 4e 20 69 73 20  ged if the N is 
250d0 70 72 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72  present.  The pr
250e0 65 76 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20  evious limit.** 
250f0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
25100 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
25110 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6f  E_TCLAPI test_so
25120 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20  ft_heap_limit(. 
25130 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
25140 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
25150 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
25160 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
25170 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
25180 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
25190 20 61 6d 74 3b 0a 20 20 54 63 6c 5f 57 69 64 65   amt;.  Tcl_Wide
251a0 49 6e 74 20 4e 20 3d 20 2d 31 3b 0a 20 20 69 66  Int N = -1;.  if
251b0 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a  ( objc!=1 && obj
251c0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
251d0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
251e0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
251f0 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  N?");.    return
25200 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
25210 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
25220 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
25230 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
25240 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
25250 26 4e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &N) ) return TCL
25260 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d  _ERROR;.  }.  am
25270 74 20 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66 74  t = sqlite3_soft
25280 5f 68 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29  _heap_limit64(N)
25290 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
252a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
252b0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 61  _NewWideIntObj(a
252c0 6d 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  mt));.  return T
252d0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
252e0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
252f0 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a  _thread_cleanup.
25300 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73  **.** Call the s
25310 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
25320 65 61 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74  eanup API..*/.st
25330 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
25340 54 43 4c 41 50 49 20 74 65 73 74 5f 74 68 72 65  TCLAPI test_thre
25350 61 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76 6f  ad_cleanup(.  vo
25360 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
25370 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
25380 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
25390 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
253a0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
253b0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
253c0 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73  T_DEPRECATED.  s
253d0 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
253e0 65 61 6e 75 70 28 29 3b 0a 23 65 6e 64 69 66 0a  eanup();.#endif.
253f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
25410 20 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72     sqlite3_pager
25420 5f 72 65 66 63 6f 75 6e 74 73 20 20 44 42 0a 2a  _refcounts  DB.*
25430 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69  *.** Return a li
25440 73 74 20 6f 66 20 6e 75 6d 62 65 72 73 20 77 68  st of numbers wh
25450 69 63 68 20 61 72 65 20 74 68 65 20 50 61 67 65  ich are the Page
25460 72 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 61 6c  rRefcount for al
25470 6c 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20 65  l.** pagers on e
25480 61 63 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ach database con
25490 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
254a0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
254b0 4c 41 50 49 20 74 65 73 74 5f 70 61 67 65 72 5f  LAPI test_pager_
254c0 72 65 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f 69  refcounts(.  voi
254d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
254e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
254f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
25500 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
25510 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
25520 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
25530 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a 61  t i;.  int v, *a
25540 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65  ;.  Tcl_Obj *pRe
25550 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  sult;..  if( obj
25560 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
25570 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
25580 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
25590 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
255a0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
255b0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
255c0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
255d0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
255e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
255f0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
25600 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
25610 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
25620 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
25630 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25640 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65  pResult = Tcl_Ne
25650 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69 3d  wObj();.  for(i=
25660 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
25670 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
25680 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 7b  aDb[i].pBt==0 ){
25690 0a 20 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a 20  .      v = -1;. 
256a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
256b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
256c0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
256d0 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65        a = sqlite
256e0 33 50 61 67 65 72 53 74 61 74 73 28 73 71 6c 69  3PagerStats(sqli
256f0 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
25700 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a  ->aDb[i].pBt));.
25710 20 20 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b 0a        v = a[0];.
25720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
25730 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
25740 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
25750 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
25760 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 73  dElement(0, pRes
25770 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  ult, Tcl_NewIntO
25780 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20 20 54 63  bj(v));.  }.  Tc
25790 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
257a0 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74 29 3b  nterp, pResult);
257b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
257c0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
257d0 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34  md:   working_64
257e0 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f  bit_int.**.** So
257f0 6d 65 20 54 43 4c 20 62 75 69 6c 64 73 20 28 65  me TCL builds (e
25800 78 3a 20 63 79 67 77 69 6e 29 20 64 6f 20 6e 6f  x: cygwin) do no
25810 74 20 73 75 70 70 6f 72 74 20 36 34 2d 62 69 74  t support 64-bit
25820 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 69 73   integers.  This
25830 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20 61 20 6e  .** leads to a n
25840 75 6d 62 65 72 20 6f 66 20 74 65 73 74 20 66 61  umber of test fa
25850 69 6c 75 72 65 73 2e 20 20 54 68 65 20 70 72 65  ilures.  The pre
25860 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20 63 68 65  sent command che
25870 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43 4c 20 62  cks the.** TCL b
25880 75 69 6c 64 20 74 6f 20 73 65 65 20 77 68 65 74  uild to see whet
25890 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 73 75  her or not it su
258a0 70 70 6f 72 74 73 20 36 34 2d 62 69 74 20 69 6e  pports 64-bit in
258b0 74 65 67 65 72 73 2e 20 20 49 74 0a 2a 2a 20 72  tegers.  It.** r
258c0 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20 69  eturns TRUE if i
258d0 74 20 64 6f 65 73 20 61 6e 64 20 46 41 4c 53 45  t does and FALSE
258e0 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54   if not..**.** T
258f0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
25900 73 65 64 20 74 6f 20 77 61 72 6e 20 75 73 65 72  sed to warn user
25910 73 20 74 68 61 74 20 74 68 65 69 72 20 54 43 4c  s that their TCL
25920 20 62 75 69 6c 64 20 69 73 20 64 65 66 65 63 74   build is defect
25930 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20  ive.** and that 
25940 74 68 65 20 65 72 72 6f 72 73 20 74 68 65 79 20  the errors they 
25950 61 72 65 20 73 65 65 69 6e 67 20 69 6e 20 74 68  are seeing in th
25960 65 20 74 65 73 74 20 73 63 72 69 70 74 73 20 6d  e test scripts m
25970 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 72 65 73  ight be.** a res
25980 75 6c 74 20 6f 66 20 74 68 65 69 72 20 64 65 66  ult of their def
25990 65 63 74 69 76 65 20 54 43 4c 20 72 61 74 68 65  ective TCL rathe
259a0 72 20 74 68 61 6e 20 70 72 6f 62 6c 65 6d 73 20  r than problems 
259b0 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74  in SQLite..*/.st
259c0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
259d0 54 43 4c 41 50 49 20 77 6f 72 6b 69 6e 67 5f 36  TCLAPI working_6
259e0 34 62 69 74 5f 69 6e 74 28 0a 20 20 43 6c 69 65  4bit_int(.  Clie
259f0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
25a00 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
25a10 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
25a20 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
25a30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
25a40 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
25a50 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
25a60 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
25a70 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
25a80 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
25a90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
25aa0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
25ab0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
25ac0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
25ad0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
25ae0 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  .){.  Tcl_Obj *p
25af0 54 65 73 74 4f 62 6a 3b 0a 20 20 69 6e 74 20 77  TestObj;.  int w
25b00 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 70  orking = 0;..  p
25b10 54 65 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  TestObj = Tcl_Ne
25b20 77 57 69 64 65 49 6e 74 4f 62 6a 28 31 30 30 30  wWideIntObj(1000
25b30 30 30 30 2a 28 69 36 34 29 31 32 33 34 35 36 37  000*(i64)1234567
25b40 38 39 30 29 3b 0a 20 20 77 6f 72 6b 69 6e 67 20  890);.  working 
25b50 3d 20 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74  = strcmp(Tcl_Get
25b60 53 74 72 69 6e 67 28 70 54 65 73 74 4f 62 6a 29  String(pTestObj)
25b70 2c 20 22 31 32 33 34 35 36 37 38 39 30 30 30 30  , "1234567890000
25b80 30 30 30 22 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f  000")==0;.  Tcl_
25b90 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 54 65  DecrRefCount(pTe
25ba0 73 74 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 53 65  stObj);.  Tcl_Se
25bb0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
25bc0 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61  p, Tcl_NewBoolea
25bd0 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67 29 29 3b 0a  nObj(working));.
25be0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25bf0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
25c00 64 3a 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f  d:   vfs_unlink_
25c10 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  test.**.** This 
25c20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 6e 72 65  TCL command unre
25c30 67 69 73 74 65 72 73 20 74 68 65 20 70 72 69 6d  gisters the prim
25c40 61 72 79 20 56 46 53 20 61 6e 64 20 74 68 65 6e  ary VFS and then
25c50 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20 69 74   registers.** it
25c60 20 62 61 63 6b 20 61 67 61 69 6e 2e 20 20 54 68   back again.  Th
25c70 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  is is used to te
25c80 73 74 20 74 68 65 20 61 62 69 6c 69 74 79 20 74  st the ability t
25c90 6f 20 72 65 67 69 73 74 65 72 20 61 0a 2a 2a 20  o register a.** 
25ca0 56 46 53 20 77 68 65 6e 20 6e 6f 6e 65 20 61 72  VFS when none ar
25cb0 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  e previously reg
25cc0 69 73 74 65 72 65 64 2c 20 61 6e 64 20 74 68 65  istered, and the
25cd0 20 61 62 69 6c 69 74 79 20 74 6f 20 0a 2a 2a 20   ability to .** 
25ce0 75 6e 72 65 67 69 73 74 65 72 20 74 68 65 20 6f  unregister the o
25cf0 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 56 46  nly available VF
25d00 53 2e 20 20 54 69 63 6b 65 74 20 23 32 37 33 38  S.  Ticket #2738
25d10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
25d20 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73  QLITE_TCLAPI vfs
25d30 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20  _unlink_test(.  
25d40 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
25d50 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
25d60 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
25d70 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
25d80 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
25d90 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
25da0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
25db0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
25dc0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
25dd0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
25de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
25df0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
25e00 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
25e10 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
25e20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
25e30 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
25e40 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
25e50 70 4d 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  pMain;.  sqlite3
25e60 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b  _vfs *apVfs[20];
25e70 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f  .  sqlite3_vfs o
25e80 6e 65 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c 69  ne, two;..  sqli
25e90 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
25ea0 65 72 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72 65  er(0);   /* Unre
25eb0 67 69 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20 69  gister of NULL i
25ec0 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20  s harmless */.  
25ed0 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f  one.zName = "__o
25ee0 6e 65 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65  ne";.  two.zName
25ef0 20 3d 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f   = "__two";..  /
25f00 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  * Calling sqlite
25f10 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 20 77  3_vfs_register w
25f20 69 74 68 20 32 6e 64 20 61 72 67 75 6d 65 6e 74  ith 2nd argument
25f30 20 6f 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a 20   of 0 does not. 
25f40 20 2a 2a 20 63 68 61 6e 67 65 20 74 68 65 20 64   ** change the d
25f50 65 66 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f 0a  efault VFS.  */.
25f60 20 20 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65    pMain = sqlite
25f70 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20  3_vfs_find(0);. 
25f80 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
25f90 69 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a  ister(&one, 0);.
25fa0 20 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d    assert( pMain=
25fb0 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c  =0 || pMain==sql
25fc0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
25fd0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   );.  sqlite3_vf
25fe0 73 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c  s_register(&two,
25ff0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
26000 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e  Main==0 || pMain
26010 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
26020 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 57  nd(0) );..  /* W
26030 65 20 63 61 6e 20 66 69 6e 64 20 61 20 56 46 53  e can find a VFS
26040 20 62 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a   by its name */.
26050 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
26060 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
26070 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
26080 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
26090 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
260a0 3d 3d 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20  ==&two );..  /* 
260b0 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 76  Calling sqlite_v
260c0 66 73 5f 72 65 67 69 73 74 65 72 20 77 69 74 68  fs_register with
260d0 20 6e 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e 64   non-zero second
260e0 20 70 61 72 61 6d 65 74 65 72 20 63 68 61 6e 67   parameter chang
260f0 65 73 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61  es the.  ** defa
26100 75 6c 74 20 56 46 53 2c 20 65 76 65 6e 20 69 66  ult VFS, even if
26110 20 74 68 65 20 31 73 74 20 70 61 72 61 6d 65 74   the 1st paramet
26120 65 72 20 69 73 20 61 6e 20 65 78 69 73 74 69 67  er is an existig
26130 20 56 46 53 20 74 68 61 74 20 69 73 0a 20 20 2a   VFS that is.  *
26140 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67  * previously reg
26150 69 73 74 65 72 65 64 20 61 73 20 74 68 65 20 6e  istered as the n
26160 6f 6e 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f  on-default..  */
26170 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
26180 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29  egister(&one, 1)
26190 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
261a0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
261b0 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
261c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
261d0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
261e0 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73  ")==&two );.  as
261f0 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
26200 73 5f 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65 20  s_find(0)==&one 
26210 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
26220 5f 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20  _register(&two, 
26230 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  1);.  assert( sq
26240 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
26250 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b  __one")==&one );
26260 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26270 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74  e3_vfs_find("__t
26280 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20  wo")==&two );.  
26290 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
262a0 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74 77  vfs_find(0)==&tw
262b0 6f 20 29 3b 0a 20 20 69 66 28 20 70 4d 61 69 6e  o );.  if( pMain
262c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
262d0 76 66 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61  vfs_register(pMa
262e0 69 6e 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  in, 1);.    asse
262f0 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
26300 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
26310 6f 6e 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  one );.    asser
26320 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
26330 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74  ind("__two")==&t
26340 77 6f 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  wo );.    assert
26350 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
26360 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
26370 20 20 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c 69    }.  .  /* Unli
26380 6e 6b 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  nk the default V
26390 46 53 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69  FS.  Repeat unti
263a0 6c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  l there are no m
263b0 6f 72 65 20 56 46 53 65 73 0a 20 20 2a 2a 20 72  ore VFSes.  ** r
263c0 65 67 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f 0a  egistered..  */.
263d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
263e0 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f  eof(apVfs)/sizeo
263f0 66 28 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b 2b  f(apVfs[0]); i++
26400 29 7b 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20  ){.    apVfs[i] 
26410 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
26420 6e 64 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61  nd(0);.    if( a
26430 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20  pVfs[i] ){.     
26440 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69   assert( apVfs[i
26450 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  ]==sqlite3_vfs_f
26460 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e  ind(apVfs[i]->zN
26470 61 6d 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71  ame) );.      sq
26480 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
26490 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a  ster(apVfs[i]);.
264a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 30 3d        assert( 0=
264b0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
264c0 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
264d0 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e) );.    }.  }.
264e0 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c    assert( 0==sql
264f0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
26500 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69   );.  .  /* Regi
26510 73 74 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46  ster the main VF
26520 53 20 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74  S as non-default
26530 20 28 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 64   (will be made d
26540 65 66 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20 20  efault, since.  
26550 2a 2a 20 69 74 27 6c 6c 20 62 65 20 74 68 65 20  ** it'll be the 
26560 6f 6e 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69 73  only one in exis
26570 74 65 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20 73  tence)..  */.  s
26580 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
26590 74 65 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a 20  ter(pMain, 0);. 
265a0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
265b0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
265c0 61 69 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 55  ain );.  .  /* U
265d0 6e 2d 72 65 67 69 73 74 65 72 20 74 68 65 20 6d  n-register the m
265e0 61 69 6e 20 56 46 53 20 61 67 61 69 6e 20 74 6f  ain VFS again to
265f0 20 72 65 73 74 6f 72 65 20 61 6e 20 65 6d 70 74   restore an empt
26600 79 20 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20 20  y VFS list */.  
26610 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
26620 67 69 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a 20  gister(pMain);. 
26630 20 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69   assert( 0==sqli
26640 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
26650 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b 20  );..  /* Relink 
26660 61 6c 6c 20 56 46 53 65 73 20 69 6e 20 72 65 76  all VFSes in rev
26670 65 72 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20 20  erse order. */  
26680 0a 20 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66 28  .  for(i=sizeof(
26690 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70  apVfs)/sizeof(ap
266a0 56 66 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b  Vfs[0])-1; i>=0;
266b0 20 69 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61   i--){.    if( a
266c0 70 56 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20  pVfs[i] ){.     
266d0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
266e0 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20  ister(apVfs[i], 
266f0 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  1);.      assert
26700 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69  ( apVfs[i]==sqli
26710 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
26720 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
26730 20 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74   apVfs[i]==sqlit
26740 65 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66  e3_vfs_find(apVf
26750 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a  s[i]->zName) );.
26760 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
26770 55 6e 72 65 67 69 73 74 65 72 20 6f 75 74 20 73  Unregister out s
26780 61 6d 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f 0a  ample VFSes. */.
26790 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
267a0 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a  register(&one);.
267b0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
267c0 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a  register(&two);.
267d0 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72  .  /* Unregister
267e0 69 6e 67 20 61 20 56 46 53 20 74 68 61 74 20 69  ing a VFS that i
267f0 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20  s not currently 
26800 72 65 67 69 73 74 65 72 65 64 20 69 73 20 68 61  registered is ha
26810 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69  rmless */.  sqli
26820 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
26830 65 72 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69  er(&one);.  sqli
26840 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
26850 65 72 28 26 74 77 6f 29 3b 0a 20 20 61 73 73 65  er(&two);.  asse
26860 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
26870 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30  find("__one")==0
26880 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
26890 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
268a0 5f 5f 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20  __two")==0 );.. 
268b0 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65   /* We should be
268c0 20 6c 65 66 74 20 77 69 74 68 20 74 68 65 20 6f   left with the o
268d0 72 69 67 69 6e 61 6c 20 64 65 66 61 75 6c 74 20  riginal default 
268e0 56 46 53 20 62 61 63 6b 20 61 73 20 74 68 65 0a  VFS back as the.
268f0 20 20 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a 2f    ** original */
26900 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26910 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
26920 70 4d 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74 75  pMain );..  retu
26930 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
26940 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66  .** tclcmd:   vf
26950 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 0a  s_initfail_test.
26960 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
26970 6f 6d 6d 61 6e 64 20 61 74 74 65 6d 70 74 73 20  ommand attempts 
26980 74 6f 20 76 66 73 5f 66 69 6e 64 20 61 6e 64 20  to vfs_find and 
26990 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 68 65  vfs_register whe
269a0 6e 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  n the.** sqlite3
269b0 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 6e  _initialize() in
269c0 74 65 72 66 61 63 65 20 69 73 20 66 61 69 6c 69  terface is faili
269d0 6e 67 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20 73  ng.  All calls s
269e0 68 6f 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73  hould fail..*/.s
269f0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
26a00 5f 54 43 4c 41 50 49 20 76 66 73 5f 69 6e 69 74  _TCLAPI vfs_init
26a10 66 61 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69  fail_test(.  Cli
26a20 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
26a30 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
26a40 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
26a50 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
26a60 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
26a70 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
26a80 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
26a90 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
26aa0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
26ab0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
26ac0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26ad0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
26ae0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
26af0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
26b00 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
26b10 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  /.){.  sqlite3_v
26b20 66 73 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e  fs one;.  one.zN
26b30 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a  ame = "__one";..
26b40 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66    if( sqlite3_vf
26b50 73 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75  s_find(0) ) retu
26b60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
26b70 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
26b80 73 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20  ster(&one, 0);. 
26b90 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73   if( sqlite3_vfs
26ba0 5f 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72  _find(0) ) retur
26bb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
26bc0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
26bd0 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20  ter(&one, 1);.  
26be0 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
26bf0 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
26c00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
26c10 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
26c20 2f 2a 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65  /*.** Saved VFSe
26c30 73 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  s.*/.static sqli
26c40 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32  te3_vfs *apVfs[2
26c50 30 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e  0];.static int n
26c60 56 66 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  Vfs = 0;../*.** 
26c70 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e  tclcmd:   vfs_un
26c80 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a  register_all.**.
26c90 2a 2a 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c  ** Unregister al
26ca0 6c 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74  l VFSes..*/.stat
26cb0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
26cc0 4c 41 50 49 20 76 66 73 5f 75 6e 72 65 67 69 73  LAPI vfs_unregis
26cd0 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e  ter_all(.  Clien
26ce0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
26cf0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
26d00 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
26d10 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
26d20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
26d30 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
26d40 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
26d50 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
26d60 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
26d70 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
26d80 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
26d90 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
26da0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
26db0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
26dc0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
26dd0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
26de0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
26df0 7a 65 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b  ze(apVfs); i++){
26e00 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
26e10 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
26e20 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
26e30 66 73 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b  fs[i]==0 ) break
26e40 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  ;.    sqlite3_vf
26e50 73 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56  s_unregister(apV
26e60 66 73 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56  fs[i]);.  }.  nV
26e70 66 73 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e  fs = i;.  return
26e80 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a   TCL_OK;.}./*.**
26e90 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72   tclcmd:   vfs_r
26ea0 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a  eregister_all.**
26eb0 0a 2a 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20  .** Restore all 
26ec0 56 46 53 65 73 20 74 68 61 74 20 77 65 72 65 20  VFSes that were 
26ed0 72 65 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66  removed using vf
26ee0 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
26ef0 2e 20 54 61 6b 69 6e 67 0a 2a 2a 20 63 61 72 65  . Taking.** care
26f00 20 74 6f 20 70 75 74 20 74 68 65 20 6c 69 6e 6b   to put the link
26f10 65 64 20 6c 69 73 74 20 62 61 63 6b 20 74 6f 67  ed list back tog
26f20 65 74 68 65 72 20 69 6e 20 74 68 65 20 73 61 6d  ether in the sam
26f30 65 20 6f 72 64 65 72 20 61 73 20 69 74 20 77 61  e order as it wa
26f40 73 0a 2a 2a 20 69 6e 20 62 65 66 6f 72 65 20 76  s.** in before v
26f50 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c  fs_unregister_al
26f60 6c 20 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a  l was invoked..*
26f70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
26f80 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f 72  ITE_TCLAPI vfs_r
26f90 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20  eregister_all(. 
26fa0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
26fb0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
26fc0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
26fd0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
26fe0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
26ff0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
27000 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
27010 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
27020 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
27030 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
27040 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
27050 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
27060 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
27070 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
27080 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
27090 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
270a0 3b 0a 20 20 66 6f 72 28 69 3d 6e 56 66 73 2d 31  ;.  for(i=nVfs-1
270b0 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
270c0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
270d0 67 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c  gister(apVfs[i],
270e0 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   1);.  }.  retur
270f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
27100 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
27110 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 20  le_control_test 
27120 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  DB.**.** This TC
27130 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
27140 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
27150 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
27160 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
27170 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
27180 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e  ion of the same.
27190 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
271a0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c  QLITE_TCLAPI fil
271b0 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28 0a  e_control_test(.
271c0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
271d0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
271e0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
271f0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
27200 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
27210 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
27220 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
27230 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
27240 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
27250 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
27260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27270 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
27280 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
27290 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
272a0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
272b0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
272c0 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69  iArg = 0;.  sqli
272d0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
272e0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
272f0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
27300 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
27310 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
27320 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
27330 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
27340 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
27350 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c  v[0], 0), " DB",
27360 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
27370 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
27380 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
27390 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
273a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
273b0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
273c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
273d0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
273e0 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30 2c  ontrol(db, 0, 0,
273f0 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72   &iArg);.  asser
27400 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  t( rc==SQLITE_NO
27410 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d  TFOUND );.  rc =
27420 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
27430 6e 74 72 6f 6c 28 64 62 2c 20 22 6e 6f 74 61 64  ntrol(db, "notad
27440 61 74 61 62 61 73 65 22 2c 20 53 51 4c 49 54 45  atabase", SQLITE
27450 5f 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45  _FCNTL_LOCKSTATE
27460 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
27470 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45  rt( rc==SQLITE_E
27480 52 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73  RROR );.  rc = s
27490 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
274a0 72 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20  rol(db, "main", 
274b0 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73  -1, &iArg);.  as
274c0 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45  sert( rc==SQLITE
274d0 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72  _NOTFOUND );.  r
274e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
274f0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74 65  _control(db, "te
27500 6d 70 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b  mp", -1, &iArg);
27510 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
27520 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 7c  QLITE_NOTFOUND |
27530 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  | rc==SQLITE_ERR
27540 4f 52 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  OR );..  return 
27550 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
27560 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
27570 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72  _control_lasterr
27580 6e 6f 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a  no_test DB.**.**
27590 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
275a0 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
275b0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
275c0 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
275d0 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
275e0 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
275f0 68 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45  he SQLITE_LAST_E
27600 52 52 4e 4f 20 76 65 72 62 2e 0a 2a 2f 0a 73 74  RRNO verb..*/.st
27610 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
27620 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74  TCLAPI file_cont
27630 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
27640 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
27650 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
27660 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
27670 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
27680 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
27690 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
276a0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
276b0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
276c0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
276d0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
276e0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
276f0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
27700 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
27710 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
27720 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
27730 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
27740 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20  int iArg = 0;.  
27750 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
27760 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
27770 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
27780 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
27790 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
277a0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
277b0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
277c0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
277d0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
277e0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
277f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27800 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
27810 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
27820 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
27830 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
27840 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
27850 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
27860 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
27870 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
27880 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 2c  LITE_LAST_ERRNO,
27890 20 26 69 41 72 67 29 3b 0a 20 20 69 66 28 20 72   &iArg);.  if( r
278a0 63 20 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65  c ){ .    Tcl_Se
278b0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
278c0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
278d0 28 72 63 29 29 3b 20 0a 20 20 20 20 72 65 74 75  (rc)); .    retu
278e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20  rn TCL_ERROR; . 
278f0 20 7d 0a 20 20 69 66 28 20 69 41 72 67 21 3d 30   }.  if( iArg!=0
27900 20 29 20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70   ) {.    Tcl_App
27910 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
27920 2c 20 22 55 6e 65 78 70 65 63 74 65 64 20 6e 6f  , "Unexpected no
27930 6e 2d 7a 65 72 6f 20 65 72 72 6e 6f 3a 20 22 2c  n-zero errno: ",
27940 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
27950 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
27960 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 4e  ingFromObj(Tcl_N
27970 65 77 49 6e 74 4f 62 6a 28 69 41 72 67 29 2c 20  ewIntObj(iArg), 
27980 30 29 2c 20 22 20 22 2c 20 30 29 3b 0a 20 20 20  0), " ", 0);.   
27990 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
279a0 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
279b0 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
279c0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
279d0 65 5f 63 6f 6e 74 72 6f 6c 5f 64 61 74 61 5f 76  e_control_data_v
279e0 65 72 73 69 6f 6e 20 44 42 20 44 42 4e 41 4d 45  ersion DB DBNAME
279f0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
27a00 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
27a10 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
27a20 6e 74 72 6f 6c 20 77 69 74 68 20 74 68 65 0a 2a  ntrol with the.*
27a30 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  * SQLITE_FCNTL_D
27a40 41 54 41 5f 56 45 52 53 49 4f 4e 20 6f 70 63 6f  ATA_VERSION opco
27a50 64 65 2c 20 72 65 74 75 72 6e 69 6e 67 20 74 68  de, returning th
27a60 65 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61  e result..*/.sta
27a70 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
27a80 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72  CLAPI file_contr
27a90 6f 6c 5f 64 61 74 61 5f 76 65 72 73 69 6f 6e 28  ol_data_version(
27aa0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
27ab0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
27ac0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
27ad0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
27ae0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
27af0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
27b00 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
27b10 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
27b20 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
27b30 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
27b40 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27b50 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
27b60 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
27b70 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
27b80 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
27b90 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ents */.){.  uns
27ba0 69 67 6e 65 64 20 69 6e 74 20 69 56 65 72 73 3b  igned int iVers;
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27bc0 64 61 74 61 20 76 65 72 73 69 6f 6e 20 2a 2f 0a  data version */.
27bd0 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20    char *zDb;    
27be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bf0 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d    /* Db name ("m
27c00 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63  ain", "temp" etc
27c10 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  .) */.  sqlite3 
27c20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
27c30 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
27c40 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
27c50 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
27c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27c70 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  /* file_control(
27c80 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  ) return code */
27c90 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
27ca0 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
27cb0 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  3 && objc!=2 ){.
27cc0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
27cd0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
27ce0 6f 62 6a 76 2c 20 22 44 42 20 5b 44 42 4e 41 4d  objv, "DB [DBNAM
27cf0 45 5d 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E]");.    return
27d00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
27d10 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
27d20 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
27d30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
27d40 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65  ), &db) ){.   re
27d50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
27d60 20 20 7d 0a 20 20 7a 44 62 20 3d 20 6f 62 6a 63    }.  zDb = objc
27d70 3d 3d 33 20 3f 20 54 63 6c 5f 47 65 74 53 74 72  ==3 ? Tcl_GetStr
27d80 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 20 3a 20 4e  ing(objv[2]) : N
27d90 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ULL;..  rc = sql
27da0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
27db0 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
27dc0 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52  E_FCNTL_DATA_VER
27dd0 53 49 4f 4e 2c 20 28 76 6f 69 64 20 2a 29 26 69  SION, (void *)&i
27de0 56 65 72 73 29 3b 0a 20 20 69 66 28 20 72 63 20  Vers);.  if( rc 
27df0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
27e00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
27e10 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
27e20 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
27e30 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
27e40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
27e50 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
27e60 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
27e70 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 75 22  (zBuf),zBuf,"%u"
27e80 2c 69 56 65 72 73 29 3b 0a 20 20 20 20 54 63 6c  ,iVers);.    Tcl
27e90 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
27ea0 70 2c 20 28 63 68 61 72 20 2a 29 7a 42 75 66 2c  p, (char *)zBuf,
27eb0 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
27ec0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
27ed0 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  K;.  }.}../*.** 
27ee0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
27ef0 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
27f00 5f 74 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20  _test DB DBNAME 
27f10 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIZE.**.** This 
27f20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
27f30 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
27f40 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
27f50 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
27f60 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
27f70 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
27f80 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
27f90 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c  YFILE and.** SQL
27fa0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
27fb0 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a  YFILE verbs..*/.
27fc0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
27fd0 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f  E_TCLAPI file_co
27fe0 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f  ntrol_chunksize_
27ff0 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
28000 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
28010 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
28020 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
28030 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
28040 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
28050 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
28060 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
28070 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
28080 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
28090 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
280a0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
280b0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
280c0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
280d0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
280e0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
280f0 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20    int nSize;    
28100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28110 20 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20 73    /* New chunk s
28120 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ize */.  char *z
28130 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
28140 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e           /* Db n
28150 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65  ame ("main", "te
28160 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73  mp" etc.) */.  s
28170 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
28180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28190 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
281a0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
281b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281c0 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63         /* file_c
281d0 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20  ontrol() return 
281e0 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  code */..  if( o
281f0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
28200 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
28210 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
28220 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22  "DB DBNAME SIZE"
28230 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
28240 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
28250 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
28260 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
28270 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
28280 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f  &db) .   || Tcl_
28290 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
282a0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
282b0 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72  nSize).  ){.   r
282c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
282d0 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c  .  }.  zDb = Tcl
282e0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
282f0 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30  2]);.  if( zDb[0
28300 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20  ]=='\0' ) zDb = 
28310 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71  NULL;..  rc = sq
28320 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
28330 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  ol(db, zDb, SQLI
28340 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f 53  TE_FCNTL_CHUNK_S
28350 49 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53  IZE, (void *)&nS
28360 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
28370 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73  {.    Tcl_SetRes
28380 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
28390 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61  r *)sqlite3ErrNa
283a0 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
283b0 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  IC);.    return 
283c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
283d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
283e0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
283f0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
28400 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44 42  sizehint_test DB
28410 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a   DBNAME SIZE.**.
28420 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
28430 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
28440 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
28450 6c 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a 20  l interface .** 
28460 77 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e 54  with SQLITE_FCNT
28470 4c 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a 73  L_SIZE_HINT.*/.s
28480 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
28490 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e  _TCLAPI file_con
284a0 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65  trol_sizehint_te
284b0 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
284c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
284d0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
284e0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
284f0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
28500 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
28510 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
28520 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
28530 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
28540 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
28550 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
28560 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
28570 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
28580 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
28590 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
285a0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
285b0 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69 7a  Tcl_WideInt nSiz
285c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
285d0 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20 2a  /* Hinted size *
285e0 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20  /.  char *zDb;  
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28      /* Db name (
28610 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65  "main", "temp" e
28620 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tc.) */.  sqlite
28630 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
28640 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
28650 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
28660 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28680 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f    /* file_contro
28690 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20  l() return code 
286a0 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  */..  if( objc!=
286b0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
286c0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
286d0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
286e0 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20  BNAME SIZE");.  
286f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
28700 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
28710 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
28720 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
28730 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
28740 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57 69  .   || Tcl_GetWi
28750 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
28760 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
28770 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72 65  Size).  ){.   re
28780 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28790 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
287a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
287b0 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30 5d  ]);.  if( zDb[0]
287c0 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20 4e  =='\0' ) zDb = N
287d0 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ULL;..  rc = sql
287e0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
287f0 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  l(db, zDb, SQLIT
28800 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
28810 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69 7a  T, (void *)&nSiz
28820 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  e);.  if( rc ){.
28830 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
28840 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
28850 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  *)sqlite3ErrName
28860 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
28870 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
28880 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
28890 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
288a0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
288b0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f   file_control_lo
288c0 63 6b 70 72 6f 78 79 5f 74 65 73 74 20 44 42 20  ckproxy_test DB 
288d0 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  PWD.**.** This T
288e0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
288f0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
28900 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
28910 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
28920 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
28930 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49  tion of the SQLI
28940 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_GET_LOCKPROXY
28950 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  FILE and.** SQLI
28960 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
28970 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a 73  FILE verbs..*/.s
28980 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
28990 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e  _TCLAPI file_con
289a0 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74  trol_lockproxy_t
289b0 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
289c0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
289d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
289e0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
289f0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
28a00 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
28a10 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
28a20 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
28a30 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
28a40 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
28a50 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
28a60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
28a70 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
28a80 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
28a90 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
28aa0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
28ab0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
28ac0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
28ad0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
28ae0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
28af0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
28b00 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
28b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28b20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
28b30 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
28b40 30 29 2c 20 22 20 44 42 20 50 57 44 22 2c 20 30  0), " DB PWD", 0
28b50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
28b60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
28b70 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
28b80 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
28b90 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
28ba0 26 64 62 29 20 29 7b 0a 20 20 20 72 65 74 75 72  &db) ){.   retur
28bb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28bc0 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .  .#if !defined
28bd0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c  (SQLITE_ENABLE_L
28be0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23 20  OCKING_STYLE).# 
28bf0 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50   if defined(__AP
28c00 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66 69  PLE__).#    defi
28c10 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ne SQLITE_ENABLE
28c20 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 31  _LOCKING_STYLE 1
28c30 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64 65  .#  else.#    de
28c40 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42  fine SQLITE_ENAB
28c50 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
28c60 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e 64   0.#  endif.#end
28c70 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45 4e  if.#if SQLITE_EN
28c80 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
28c90 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  LE && defined(__
28ca0 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20 20  APPLE__).  {.   
28cb0 20 63 68 61 72 20 2a 74 65 73 74 50 61 74 68 3b   char *testPath;
28cc0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
28cd0 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20 63   int nPwd;.    c
28ce0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 77 64 3b  onst char *zPwd;
28cf0 0a 20 20 20 20 63 68 61 72 20 70 72 6f 78 79 50  .    char proxyP
28d00 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a 20  ath[400];.    . 
28d10 20 20 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47 65     zPwd = Tcl_Ge
28d20 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
28d30 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b 0a  bjv[2], &nPwd);.
28d40 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66 28 70      if( sizeof(p
28d50 72 6f 78 79 50 61 74 68 29 3c 6e 50 77 64 2b 32  roxyPath)<nPwd+2
28d60 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  0 ){.      Tcl_A
28d70 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28d80 72 70 2c 20 22 50 57 44 20 74 6f 6f 20 62 69 67  rp, "PWD too big
28d90 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20  ", (void*)0);.  
28da0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28db0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
28dc0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
28dd0 28 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61 74  (sizeof(proxyPat
28de0 68 29 2c 20 70 72 6f 78 79 50 61 74 68 2c 20 22  h), proxyPath, "
28df0 25 73 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c 20  %s/test.proxy", 
28e00 7a 50 77 64 29 3b 0a 20 20 20 20 72 63 20 3d 20  zPwd);.    rc = 
28e10 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
28e20 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
28e30 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
28e40 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61  OXYFILE, proxyPa
28e50 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  th);.    if( rc 
28e60 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
28e70 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
28e80 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
28e90 72 63 29 29 3b 20 0a 20 20 20 20 20 20 72 65 74  rc)); .      ret
28ea0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28eb0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
28ec0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
28ed0 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
28ee0 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
28ef0 59 46 49 4c 45 2c 20 26 74 65 73 74 50 61 74 68  YFILE, &testPath
28f00 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  );.    if( strnc
28f10 6d 70 28 70 72 6f 78 79 50 61 74 68 2c 74 65 73  mp(proxyPath,tes
28f20 74 50 61 74 68 2c 31 31 29 20 29 7b 0a 20 20 20  tPath,11) ){.   
28f30 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
28f40 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f 63  ult(interp, "Loc
28f50 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 64 69 64  k proxy file did
28f60 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20 22   not match the "
28f70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28f90 22 70 72 65 76 69 6f 75 73 6c 79 20 61 73 73 69  "previously assi
28fa0 67 6e 65 64 20 76 61 6c 75 65 22 2c 20 30 29 3b  gned value", 0);
28fb0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
28fc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
28fd0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
28fe0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
28ff0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
29000 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a  NewIntObj(rc));.
29010 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
29020 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
29030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
29040 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
29050 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54  NULL, SQLITE_SET
29060 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
29070 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20  proxyPath);.    
29080 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
29090 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
290a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
290b0 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20  IntObj(rc));.   
290c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
290d0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ROR;.    }.  }.#
290e0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
290f0 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66 20  CL_OK;  .}..#if 
29100 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a  SQLITE_OS_WIN./*
29110 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
29120 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
29130 5f 61 76 5f 72 65 74 72 79 20 44 42 20 20 4e 52  _av_retry DB  NR
29140 45 54 52 59 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a  ETRY  DELAY.**.*
29150 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
29160 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
29170 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
29180 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a   interface with.
29190 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  ** the SQLITE_FC
291a0 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54  NTL_WIN32_AV_RET
291b0 52 59 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74  RY opcode..*/.st
291c0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
291d0 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74  TCLAPI file_cont
291e0 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74  rol_win32_av_ret
291f0 72 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ry(.  ClientData
29200 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
29210 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
29220 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
29230 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
29240 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
29250 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
29260 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
29270 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
29280 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
29290 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
292a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
292b0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
292c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
292d0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
292e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
292f0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
29300 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b 32  nt rc;.  int a[2
29310 5d 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  ];.  char z[100]
29320 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
29330 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
29340 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
29350 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
29360 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
29370 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
29380 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
29390 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e 52  [0], 0), " DB NR
293a0 45 54 52 59 20 44 45 4c 41 59 22 2c 20 30 29 3b  ETRY DELAY", 0);
293b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
293c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
293d0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
293e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
293f0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
29400 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
29410 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
29420 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
29430 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
29440 6f 62 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29 20  objv[2], &a[0]) 
29450 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
29460 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
29470 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
29480 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61 5b  rp, objv[3], &a[
29490 31 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  1]) ) return TCL
294a0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
294b0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
294c0 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
294d0 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
294e0 5f 41 56 5f 52 45 54 52 59 2c 20 28 76 6f 69 64  _AV_RETRY, (void
294f0 2a 29 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *)a);.  sqlite3_
29500 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
29510 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 20 25 64  z), z, "%d %d %d
29520 22 2c 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b 31  ", rc, a[0], a[1
29530 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
29540 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
29550 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
29560 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
29570 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
29580 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
29590 77 69 6e 33 32 5f 67 65 74 5f 68 61 6e 64 6c 65  win32_get_handle
295a0 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54   DB.**.** This T
295b0 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
295c0 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
295d0 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
295e0 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
295f0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
29600 32 5f 47 45 54 5f 48 41 4e 44 4c 45 20 6f 70 63  2_GET_HANDLE opc
29610 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
29620 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
29630 77 69 6e 33 32 5f 67 65 74 5f 68 61 6e 64 6c 65  win32_get_handle
29640 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
29650 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
29660 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
29670 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
29680 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
29690 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
296a0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
296b0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
296c0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
296d0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
296e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
296f0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
29700 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
29710 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
29720 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
29730 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
29740 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
29750 20 72 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46   rc;.  HANDLE hF
29760 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68  ile = NULL;.  ch
29770 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  ar z[100];..  if
29780 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
29790 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
297a0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
297b0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
297c0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
297d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
297e0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
297f0 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20  , " DB", 0);.   
29800 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29810 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
29820 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
29830 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
29840 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
29850 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
29860 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
29870 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
29880 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
29890 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  , SQLITE_FCNTL_W
298a0 49 4e 33 32 5f 47 45 54 5f 48 41 4e 44 4c 45 2c  IN32_GET_HANDLE,
298b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
298d0 69 64 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20 73  id*)&hFile);.  s
298e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
298f0 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
29900 64 20 25 70 22 2c 20 72 63 2c 20 28 76 6f 69 64  d %p", rc, (void
29910 2a 29 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f  *)hFile);.  Tcl_
29920 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
29930 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
29940 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
29950 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
29960 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
29970 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61  rol_win32_set_ha
29980 6e 64 6c 65 20 44 42 20 48 41 4e 44 4c 45 0a 2a  ndle DB HANDLE.*
29990 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
299a0 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
299b0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
299c0 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69  rol interface wi
299d0 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45  th.** the SQLITE
299e0 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54  _FCNTL_WIN32_SET
299f0 5f 48 41 4e 44 4c 45 20 6f 70 63 6f 64 65 2e 0a  _HANDLE opcode..
29a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
29a10 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
29a20 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73  _control_win32_s
29a30 65 74 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69  et_handle(.  Cli
29a40 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
29a50 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
29a60 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
29a70 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
29a80 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
29a90 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
29aa0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
29ab0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
29ac0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
29ad0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
29ae0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29af0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
29b00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
29b10 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
29b20 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
29b30 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
29b40 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
29b50 48 41 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e  HANDLE hFile = N
29b60 55 4c 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30  ULL;.  char z[10
29b70 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
29b80 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
29b90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29ba0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
29bb0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
29bc0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
29bd0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
29be0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
29bf0 48 41 4e 44 4c 45 22 2c 20 30 29 3b 0a 20 20 20  HANDLE", 0);.   
29c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29c10 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
29c20 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
29c30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
29c40 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
29c50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
29c60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
29c70 28 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c 65  ( getWin32Handle
29c80 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
29c90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
29ca0 20 26 68 46 69 6c 65 29 20 29 7b 0a 20 20 20 20   &hFile) ){.    
29cb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
29cc0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
29cd0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
29ce0 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
29cf0 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53  TE_FCNTL_WIN32_S
29d00 45 54 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20  ET_HANDLE,.     
29d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29 26 68         (void*)&h
29d30 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  File);.  sqlite3
29d40 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
29d50 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c  (z), z, "%d %p",
29d60 20 72 63 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c   rc, (void*)hFil
29d70 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  e);.  Tcl_Append
29d80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
29d90 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
29da0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
29db0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
29dc0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
29dd0 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77  ontrol_persist_w
29de0 61 6c 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c  al DB PERSIST-FL
29df0 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  AG.**.** This TC
29e00 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
29e10 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
29e20 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
29e30 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51  e with.** the SQ
29e40 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49  LITE_FCNTL_PERSI
29e50 53 54 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a  ST_WAL opcode..*
29e60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
29e70 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f  ITE_TCLAPI file_
29e80 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
29e90 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  wal(.  ClientDat
29ea0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
29eb0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
29ec0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
29ed0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
29ee0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
29ef0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
29f00 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
29f10 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
29f20 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
29f30 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
29f40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
29f50 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
29f60 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
29f70 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
29f80 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
29f90 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
29fa0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 50  int rc;.  int bP
29fb0 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72 20 7a  ersist;.  char z
29fc0 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
29fd0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
29fe0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
29ff0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
2a000 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
2a010 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
2a020 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
2a030 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
2a040 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20  DB FLAG", 0);.  
2a050 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a060 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2a070 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2a080 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2a090 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2a0a0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
2a0b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2a0c0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
2a0d0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2a0e0 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73 74 29  v[2], &bPersist)
2a0f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2a100 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
2a110 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2a120 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
2a130 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
2a140 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62 50 65  WAL, (void*)&bPe
2a150 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  rsist);.  sqlite
2a160 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2a170 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22  f(z), z, "%d %d"
2a180 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74 29 3b  , rc, bPersist);
2a190 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
2a1a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28  ult(interp, z, (
2a1b0 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75  char*)0);.  retu
2a1c0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
2a1d0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
2a1e0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77  file_control_pow
2a1f0 65 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65  ersafe_overwrite
2a200 20 44 42 20 50 53 4f 57 2d 46 4c 41 47 0a 2a 2a   DB PSOW-FLAG.**
2a210 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
2a220 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
2a230 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2a240 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74  ol interface wit
2a250 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f  h.** the SQLITE_
2a260 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f  FCNTL_POWERSAFE_
2a270 4f 56 45 52 57 52 49 54 45 20 6f 70 63 6f 64 65  OVERWRITE opcode
2a280 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a290 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69  SQLITE_TCLAPI fi
2a2a0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72  le_control_power
2a2b0 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 28 0a  safe_overwrite(.
2a2c0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
2a2d0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
2a2e0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
2a2f0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
2a300 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
2a310 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2a320 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2a330 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2a340 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2a350 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
2a360 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a370 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2a380 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
2a390 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
2a3a0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2a3b0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
2a3c0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
2a3d0 63 3b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 63 68  c;.  int b;.  ch
2a3e0 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  ar z[100];..  if
2a3f0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
2a400 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2a410 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
2a420 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
2a430 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
2a440 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
2a450 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
2a460 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30 29  , " DB FLAG", 0)
2a470 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2a480 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2a490 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2a4a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2a4b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2a4c0 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
2a4d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a4e0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
2a4f0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
2a500 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 29 20 29 20   objv[2], &b) ) 
2a510 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a520 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2a530 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
2a540 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45 5f 46 43 4e  ,NULL,SQLITE_FCN
2a550 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TL_POWERSAFE_OVE
2a560 52 57 52 49 54 45 2c 28 76 6f 69 64 2a 29 26 62  RWRITE,(void*)&b
2a570 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
2a580 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
2a590 20 7a 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c   z, "%d %d", rc,
2a5a0 20 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e   b);.  Tcl_Appen
2a5b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2a5c0 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  z, (char*)0);.  
2a5d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
2a5e0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
2a5f0 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
2a600 6c 5f 76 66 73 6e 61 6d 65 20 44 42 20 3f 41 55  l_vfsname DB ?AU
2a610 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  XDB?.**.** Retur
2a620 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
2a630 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73 74  describes the st
2a640 61 63 6b 20 6f 66 20 56 46 53 65 73 2e 0a 2a 2f  ack of VFSes..*/
2a650 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
2a660 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63  TE_TCLAPI file_c
2a670 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 28 0a  ontrol_vfsname(.
2a680 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
2a690 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
2a6a0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
2a6b0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
2a6c0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
2a6d0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2a6e0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2a6f0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2a700 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2a710 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
2a720 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a730 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2a740 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
2a750 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
2a760 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2a770 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
2a780 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
2a790 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
2a7a0 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20   "main";.  char 
2a7b0 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 0a  *zVfsName = 0;..
2a7c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
2a7d0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
2a7e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a7f0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2a800 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2a810 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
2a820 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
2a830 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
2a840 20 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20   " DB ?AUXDB?", 
2a850 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2a860 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2a870 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2a880 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2a890 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2a8a0 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
2a8b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2a8c0 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33   }.  if( objc==3
2a8d0 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20   ){.    zDbName 
2a8e0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2a8f0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20  objv[2]);.  }.  
2a900 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
2a910 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65  trol(db, zDbName
2a920 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56  , SQLITE_FCNTL_V
2a930 46 53 4e 41 4d 45 2c 28 76 6f 69 64 2a 29 26 7a  FSNAME,(void*)&z
2a940 56 66 73 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f  VfsName);.  Tcl_
2a950 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2a960 65 72 70 2c 20 7a 56 66 73 4e 61 6d 65 2c 20 28  erp, zVfsName, (
2a970 63 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69  char*)0);.  sqli
2a980 74 65 33 5f 66 72 65 65 28 7a 56 66 73 4e 61 6d  te3_free(zVfsNam
2a990 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  e);.  return TCL
2a9a0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
2a9b0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
2a9c0 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e  ontrol_tempfilen
2a9d0 61 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a  ame DB ?AUXDB?.*
2a9e0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
2a9f0 72 69 6e 67 20 74 68 61 74 20 69 73 20 61 20 74  ring that is a t
2aa00 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d  emporary filenam
2aa10 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  e.*/.static int 
2aa20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69  SQLITE_TCLAPI fi
2aa30 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66  le_control_tempf
2aa40 69 6c 65 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e  ilename(.  Clien
2aa50 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2aa60 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
2aa70 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
2aa80 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
2aa90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2aaa0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2aab0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2aac0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2aad0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2aae0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2aaf0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2ab00 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2ab10 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2ab20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2ab30 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2ab40 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2ab50 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2ab60 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22  zDbName = "main"
2ab70 3b 0a 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65  ;.  char *zTName
2ab80 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
2ab90 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
2aba0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2abb0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2abc0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2abd0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
2abe0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
2abf0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
2ac00 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55  0], 0), " DB ?AU
2ac10 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72  XDB?", 0);.    r
2ac20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ac30 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2ac40 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2ac50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2ac60 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
2ac70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ac80 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2ac90 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a  objc==3 ){.    z
2aca0 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  DbName = Tcl_Get
2acb0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
2acc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
2acd0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
2ace0 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  zDbName, SQLITE_
2acf0 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41  FCNTL_TEMPFILENA
2ad00 4d 45 2c 20 28 76 6f 69 64 2a 29 26 7a 54 4e 61  ME, (void*)&zTNa
2ad10 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  me);.  Tcl_Appen
2ad20 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2ad30 7a 54 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  zTName, (char*)0
2ad40 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2ad50 65 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 72 65 74  e(zTName);.  ret
2ad60 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
2ad70 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
2ad80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69    sqlite3_vfs_li
2ad90 73 74 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72  st.**.**   Retur
2ada0 6e 20 61 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e  n a tcl list con
2adb0 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65  taining the name
2adc0 73 20 6f 66 20 61 6c 6c 20 72 65 67 69 73 74 65  s of all registe
2add0 72 65 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74  red vfs's..*/.st
2ade0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2adf0 54 43 4c 41 50 49 20 76 66 73 5f 6c 69 73 74 28  TCLAPI vfs_list(
2ae00 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2ae10 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
2ae20 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
2ae30 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
2ae40 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
2ae50 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2ae60 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2ae70 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2ae80 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2ae90 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2aeb0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2aec0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2aed0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2aee0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2aef0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
2af00 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
2af10 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20    Tcl_Obj *pRet 
2af20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
2af30 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
2af40 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2af50 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2af60 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
2af70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2af80 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66 73  ;.  }.  for(pVfs
2af90 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
2afa0 64 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66 73  d(0); pVfs; pVfs
2afb0 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20  =pVfs->pNext){. 
2afc0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
2afd0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2afe0 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
2aff0 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d  wStringObj(pVfs-
2b000 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20  >zName, -1));.  
2b010 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
2b020 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
2b030 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
2b040 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
2b050 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65  tclcmd:   sqlite
2b060 33 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56 41  3_limit DB ID VA
2b070 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  LUE.**.** This T
2b080 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
2b090 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  the sqlite3_limi
2b0a0 74 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  t interface and.
2b0b0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
2b0c0 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
2b0d0 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74   the same..*/.st
2b0e0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2b0f0 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 69 6d 69  TCLAPI test_limi
2b100 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
2b110 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
2b120 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
2b130 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
2b140 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
2b150 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2b160 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2b170 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2b180 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2b190 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2b1a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2b1b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2b1c0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2b1d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2b1e0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2b1f0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
2b200 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2b210 74 20 72 63 3b 0a 20 20 73 74 61 74 69 63 20 63  t rc;.  static c
2b220 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
2b230 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a     char *zName;.
2b240 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d       int id;.  }
2b250 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b   aId[] = {.    {
2b260 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c   "SQLITE_LIMIT_L
2b270 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
2b280 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2b290 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  T_LENGTH        
2b2a0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2b2b0 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51  "SQLITE_LIMIT_SQ
2b2c0 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20  L_LENGTH",      
2b2d0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2b2e0 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20  _SQL_LENGTH     
2b2f0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2b300 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
2b310 55 4d 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  UMN",           
2b320 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2b330 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20  COLUMN          
2b340 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
2b350 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
2b360 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20 20 20  _DEPTH",        
2b370 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45    SQLITE_LIMIT_E
2b380 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20 20  XPR_DEPTH       
2b390 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
2b3a0 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
2b3b0 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20 20 20 20  UND_SELECT",    
2b3c0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f   SQLITE_LIMIT_CO
2b3d0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20  MPOUND_SELECT   
2b3e0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
2b3f0 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
2b400 50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  P",             
2b410 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
2b420 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20  E_OP            
2b430 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
2b440 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
2b450 4e 5f 41 52 47 22 2c 20 20 20 20 20 20 20 20 53  N_ARG",        S
2b460 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
2b470 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20  TION_ARG        
2b480 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
2b490 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
2b4a0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
2b4b0 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
2b4c0 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20 20  HED             
2b4d0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
2b4e0 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
2b4f0 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c  ERN_LENGTH", SQL
2b500 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
2b510 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d  ATTERN_LENGTH  }
2b520 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
2b530 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
2b540 55 4d 42 45 52 22 2c 20 20 20 20 20 53 51 4c 49  UMBER",     SQLI
2b550 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
2b560 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 7d 2c  E_NUMBER      },
2b570 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
2b580 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
2b590 54 48 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54  TH",       SQLIT
2b5a0 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
2b5b0 44 45 50 54 48 20 20 20 20 20 20 20 20 7d 2c 0a  DEPTH        },.
2b5c0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
2b5d0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
2b5e0 44 53 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45  DS",      SQLITE
2b5f0 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48  _LIMIT_WORKER_TH
2b600 52 45 41 44 53 20 20 20 20 20 20 20 7d 2c 0a 20  READS       },. 
2b610 20 20 20 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f     .    /* Out o
2b620 66 20 72 61 6e 67 65 20 74 65 73 74 20 63 61 73  f range test cas
2b630 65 73 20 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c  es */.    { "SQL
2b640 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41  ITE_LIMIT_TOOSMA
2b650 4c 4c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  LL",            
2b660 2d 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  -1,             
2b670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b680 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
2b690 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22  TE_LIMIT_TOOBIG"
2b6a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
2b6b0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
2b6c0 45 52 5f 54 48 52 45 41 44 53 2b 31 20 20 20 20  ER_THREADS+1    
2b6d0 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
2b6e0 2c 20 69 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  , id = 0;.  int 
2b6f0 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  val;.  const cha
2b700 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f  r *zId;..  if( o
2b710 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
2b720 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2b730 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2b740 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2b750 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
2b760 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
2b770 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
2b780 20 44 42 20 49 44 20 56 41 4c 55 45 22 2c 20 30   DB ID VALUE", 0
2b790 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2b7a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2b7b0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2b7c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2b7d0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2b7e0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2b7f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d  L_ERROR;.  zId =
2b800 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2b810 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[2]);.  for(i
2b820 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49 64  =0; i<sizeof(aId
2b830 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29  )/sizeof(aId[0])
2b840 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
2b850 73 74 72 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b  strcmp(zId, aId[
2b860 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
2b870 20 20 20 20 20 20 69 64 20 3d 20 61 49 64 5b 69        id = aId[i
2b880 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62 72 65 61  ].id;.      brea
2b890 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
2b8a0 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64  f( i>=sizeof(aId
2b8b0 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29  )/sizeof(aId[0])
2b8c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2b8d0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2b8e0 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20   "unknown limit 
2b8f0 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63  type: ", zId, (c
2b900 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2b910 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b920 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
2b930 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2b940 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
2b950 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2b960 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
2b970 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69  ite3_limit(db, i
2b980 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53  d, val);.  Tcl_S
2b990 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2b9a0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
2b9b0 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  j(rc));.  return
2b9c0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
2b9d0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61 76  .** tclcmd:  sav
2b9e0 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a  e_prng_state.**.
2b9f0 2a 2a 20 53 61 76 65 20 74 68 65 20 73 74 61 74  ** Save the stat
2ba00 65 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  e of the pseudo-
2ba10 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
2ba20 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74  nerator..** At t
2ba30 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 76 65  he same time, ve
2ba40 72 69 66 79 20 74 68 61 74 20 73 71 6c 69 74 65  rify that sqlite
2ba50 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77  3_test_control w
2ba60 6f 72 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a  orks even when.*
2ba70 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  * called with an
2ba80 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70   out-of-range op
2ba90 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
2baa0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2bab0 49 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74  I save_prng_stat
2bac0 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
2bad0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
2bae0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
2baf0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
2bb00 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
2bb10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2bb20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2bb30 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2bb40 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2bb50 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2bb60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2bb70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2bb80 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2bb90 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2bba0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2bbb0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
2bbc0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
2bbd0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39  test_control(999
2bbe0 39 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  9);.  assert( rc
2bbf0 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ==0 );.  rc = sq
2bc00 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2bc10 6f 6c 28 2d 31 29 3b 0a 20 20 61 73 73 65 72 74  ol(-1);.  assert
2bc20 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c  ( rc==0 );.  sql
2bc30 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2bc40 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2bc50 4c 5f 50 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20  L_PRNG_SAVE);.  
2bc60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2bc70 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2bc80 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61  restore_prng_sta
2bc90 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  te.*/.static int
2bca0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 72   SQLITE_TCLAPI r
2bcb0 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74  estore_prng_stat
2bcc0 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
2bcd0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
2bce0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
2bcf0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
2bd00 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
2bd10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2bd20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2bd30 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2bd40 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2bd50 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2bd60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2bd70 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2bd80 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2bd90 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2bda0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2bdb0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
2bdc0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2bdd0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2bde0 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
2bdf0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2be00 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  OK;.}./*.** tclc
2be10 6d 64 3a 20 20 72 65 73 65 74 5f 70 72 6e 67 5f  md:  reset_prng_
2be20 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20  state.*/.static 
2be30 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2be40 49 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61  I reset_prng_sta
2be50 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
2be60 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2be70 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
2be80 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
2be90 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
2bea0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2beb0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2bec0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2bed0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2bee0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2bef0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2bf00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2bf10 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2bf20 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2bf30 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2bf40 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2bf50 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
2bf60 73 73 28 30 2c 30 29 3b 0a 20 20 72 65 74 75 72  ss(0,0);.  retur
2bf70 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
2bf80 2a 20 74 63 6c 63 6d 64 3a 20 20 70 72 6e 67 5f  * tclcmd:  prng_
2bf90 73 65 65 64 20 49 4e 54 0a 2a 2a 0a 2a 2a 20 45  seed INT.**.** E
2bfa0 73 74 61 62 6c 69 73 68 20 54 45 58 54 20 61 73  stablish TEXT as
2bfb0 20 74 68 65 20 73 65 65 64 20 66 6f 72 20 74 68   the seed for th
2bfc0 65 20 50 52 4e 47 0a 2a 2f 0a 73 74 61 74 69 63  e PRNG.*/.static
2bfd0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2bfe0 50 49 20 70 72 6e 67 5f 73 65 65 64 28 0a 20 20  PI prng_seed(.  
2bff0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2c000 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
2c010 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
2c020 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
2c030 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
2c040 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2c050 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2c060 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2c070 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2c080 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2c090 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2c0a0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2c0b0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
2c0c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
2c0d0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
2c0e0 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e  s */.){.  unsign
2c0f0 65 64 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  ed int i;.  if( 
2c100 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2c110 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2c120 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2c130 20 22 50 52 4e 47 2d 53 45 45 44 2d 54 45 58 54   "PRNG-SEED-TEXT
2c140 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2c150 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2c160 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
2c170 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 6f 62 6a  omObj(interp,obj
2c180 76 5b 30 5d 2c 26 69 29 20 29 20 72 65 74 75 72  v[0],&i) ) retur
2c190 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73  n TCL_ERROR;.  s
2c1a0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2c1b0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2c1c0 54 52 4c 5f 50 52 4e 47 5f 53 45 45 44 2c 20 28  TRL_PRNG_SEED, (
2c1d0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 69 29 3b  unsigned int)i);
2c1e0 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f  .  sqlite3_rando
2c1f0 6d 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 72 65  mness(0,0);.  re
2c200 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2c210 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64  /*.** tclcmd:  d
2c220 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63  atabase_may_be_c
2c230 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64  orrupt.**.** Ind
2c240 69 63 61 74 65 20 74 68 61 74 20 64 61 74 61 62  icate that datab
2c250 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20  ase files might 
2c260 62 65 20 63 6f 72 72 75 70 74 2e 20 49 6e 20 6f  be corrupt. In o
2c270 74 68 65 72 20 77 6f 72 64 73 2c 20 73 65 74 20  ther words, set 
2c280 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 73 74  the normal.** st
2c290 61 74 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ate of operation
2c2a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c2b0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 61  SQLITE_TCLAPI da
2c2c0 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f  tabase_may_be_co
2c2d0 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44  rrupt(.  ClientD
2c2e0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2c2f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
2c300 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
2c310 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
2c320 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2c330 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2c340 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2c350 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2c360 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2c370 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2c380 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c390 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2c3a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2c3b0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2c3c0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2c3d0 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
2c3e0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2c3f0 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
2c400 52 52 55 50 54 2c 20 30 29 3b 0a 20 20 72 65 74  RRUPT, 0);.  ret
2c410 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
2c420 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61 74  .** tclcmd:  dat
2c430 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
2c440 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61  upt.**.** Indica
2c450 74 65 20 74 68 61 74 20 64 61 74 61 62 61 73 65  te that database
2c460 20 66 69 6c 65 73 20 61 72 65 20 61 6c 77 61 79   files are alway
2c470 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 54  s well-formed. T
2c480 68 69 73 20 65 6e 61 62 6c 65 73 0a 2a 2a 20 65  his enables.** e
2c490 78 74 72 61 20 61 73 73 65 72 74 28 29 20 73 74  xtra assert() st
2c4a0 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 74 65  atements that te
2c4b0 73 74 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74 68  st conditions th
2c4c0 61 74 20 61 72 65 20 61 6c 77 61 79 73 20 74 72  at are always tr
2c4d0 75 65 0a 2a 2a 20 66 6f 72 20 77 65 6c 6c 2d 66  ue.** for well-f
2c4e0 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 73 2e  ormed databases.
2c4f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
2c500 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 61 74  QLITE_TCLAPI dat
2c510 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
2c520 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  upt(.  ClientDat
2c530 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2c540 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
2c550 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
2c560 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
2c570 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2c580 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2c590 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2c5a0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2c5b0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2c5c0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2c5d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2c5e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2c5f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2c600 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2c610 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2c620 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2c630 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
2c640 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
2c650 55 50 54 2c 20 31 29 3b 0a 20 20 72 65 74 75 72  UPT, 1);.  retur
2c660 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2c670 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63  ** tclcmd:  pcac
2c680 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74  he_stats.*/.stat
2c690 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2c6a0 4c 41 50 49 20 74 65 73 74 5f 70 63 61 63 68 65  LAPI test_pcache
2c6b0 5f 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e 74  _stats(.  Client
2c6c0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2c6d0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2c6e0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2c6f0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2c700 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2c710 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2c720 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2c730 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2c740 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2c750 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2c760 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c770 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2c780 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2c790 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2c7a0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2c7b0 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20  {.  int nMin;.  
2c7c0 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74 20  int nMax;.  int 
2c7d0 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20  nCurrent;.  int 
2c7e0 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20 54  nRecyclable;.  T
2c7f0 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20  cl_Obj *pRet;.. 
2c800 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 74   sqlite3PcacheSt
2c810 61 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20 26  ats(&nCurrent, &
2c820 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52  nMax, &nMin, &nR
2c830 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20 70  ecyclable);..  p
2c840 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
2c850 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ();.  Tcl_ListOb
2c860 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2c870 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
2c880 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63  _NewStringObj("c
2c890 75 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 20  urrent", -1));. 
2c8a0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2c8b0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c8c0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
2c8d0 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29 29  ntObj(nCurrent))
2c8e0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2c8f0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2c900 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
2c910 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 78  ewStringObj("max
2c920 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
2c930 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2c940 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
2c950 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
2c960 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  nMax));.  Tcl_Li
2c970 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2c980 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
2c990 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2c9a0 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a 20  j("min", -1));. 
2c9b0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2c9c0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2c9d0 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
2c9e0 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20  ntObj(nMin));.  
2c9f0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2ca00 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2ca10 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
2ca20 72 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c 61  ringObj("recycla
2ca30 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63  ble", -1));.  Tc
2ca40 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2ca50 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
2ca60 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
2ca70 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29 29  bj(nRecyclable))
2ca80 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
2ca90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
2caa0 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  et);..  return T
2cab0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66  CL_OK;.}..#ifdef
2cac0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
2cad0 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61  NLOCK_NOTIFY.sta
2cae0 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 75 6e  tic void test_un
2caf0 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28 76  lock_notify_cb(v
2cb00 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74 20  oid **aArg, int 
2cb10 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 69 3b  nArg){.  int ii;
2cb20 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
2cb30 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nArg; ii++){.   
2cb40 20 54 63 6c 5f 45 76 61 6c 45 78 28 28 54 63 6c   Tcl_EvalEx((Tcl
2cb50 5f 49 6e 74 65 72 70 20 2a 29 61 41 72 67 5b 69  _Interp *)aArg[i
2cb60 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  i], "unlock_noti
2cb70 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41  fy", -1, TCL_EVA
2cb80 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d  L_GLOBAL);.  }.}
2cb90 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
2cba0 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
2cbb0 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  NOTIFY */../*.**
2cbc0 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
2cbd0 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20  3_unlock_notify 
2cbe0 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  db.*/.#ifdef SQL
2cbf0 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
2cc00 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20  K_NOTIFY.static 
2cc10 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2cc20 49 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f  I test_unlock_no
2cc30 74 69 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61  tify(.  ClientDa
2cc40 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2cc50 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
2cc60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2cc70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2cc80 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2cc90 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2cca0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2ccb0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2ccc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2ccd0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2cce0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2ccf0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2cd00 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2cd10 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2cd20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
2cd30 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2cd40 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2cd50 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2cd60 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75   "DB");.    retu
2cd70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2cd80 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  }..  if( getDbPo
2cd90 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2cda0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2cdb0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
2cdc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2cdd0 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
2cde0 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f  qlite3_unlock_no
2cdf0 74 69 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e  tify(db, test_un
2ce00 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20  lock_notify_cb, 
2ce10 28 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b  (void *)interp);
2ce20 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
2ce30 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2ce40 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
2ce50 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
2ce60 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2ce70 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
2ce80 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33  tclcmd:  sqlite3
2ce90 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20  _wal_checkpoint 
2cea0 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61  db ?NAME?.*/.sta
2ceb0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2cec0 43 4c 41 50 49 20 74 65 73 74 5f 77 61 6c 5f 63  CLAPI test_wal_c
2ced0 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69  heckpoint(.  Cli
2cee0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2cef0 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
2cf00 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2cf10 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2cf20 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2cf30 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2cf40 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2cf50 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
2cf60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2cf70 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2cf80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2cf90 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
2cfa0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2cfb0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
2cfc0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
2cfd0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
2cfe0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
2cff0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2d000 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2d010 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2d020 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a  , "DB ?NAME?");.
2d030 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2d040 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
2d050 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2d060 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2d070 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
2d080 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
2d090 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2d0a0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
2d0b0 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  .    zDb = Tcl_G
2d0c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2d0d0 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
2d0e0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
2d0f0 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
2d100 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2d110 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
2d120 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
2d130 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
2d140 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2d150 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2d160 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
2d170 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44  kpoint_v2 db MOD
2d180 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54  E ?NAME?.**.** T
2d190 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c  his command call
2d1a0 73 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70  s the wal_checkp
2d1b0 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69  oint_v2() functi
2d1c0 6f 6e 20 77 69 74 68 20 74 68 65 20 73 70 65 63  on with the spec
2d1d0 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72  ified.** mode ar
2d1e0 67 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c  gument (passive,
2d1f0 20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74   full or restart
2d200 29 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74  ). If present, t
2d210 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  he database name
2d220 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73  .** NAME is pass
2d230 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64  ed as the second
2d240 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c   argument to wal
2d250 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
2d260 2e 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e  . If it the.** N
2d270 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20  AME argument is 
2d280 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e  not present, a N
2d290 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70  ULL pointer is p
2d2a0 61 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a  assed instead..*
2d2b0 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63  *.** If wal_chec
2d2c0 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75  kpoint_v2() retu
2d2d0 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74  rns any value ot
2d2e0 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f  her than SQLITE_
2d2f0 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54  BUSY or.** SQLIT
2d300 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20  E_OK, then this 
2d310 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20  command returns 
2d320 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54  TCL_ERROR. The T
2d330 63 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65 74  cl result is set
2d340 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72  .** to the error
2d350 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65   message obtaine
2d360 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  d from sqlite3_e
2d370 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f  rrmsg()..**.** O
2d380 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20 63  therwise, this c
2d390 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61  ommand returns a
2d3a0 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20 69   list of three i
2d3b0 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66 69 72  ntegers. The fir
2d3c0 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73  st integer.** is
2d3d0 20 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53   1 if SQLITE_BUS
2d3e0 59 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20  Y was returned, 
2d3f0 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20  or 0 otherwise. 
2d400 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
2d410 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72  o integers.** ar
2d420 65 20 74 68 65 20 76 61 6c 75 65 73 20 72 65 74  e the values ret
2d430 75 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75  urned via the ou
2d440 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 20  tput parameters 
2d450 62 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  by wal_checkpoin
2d460 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20  t_v2() -.** the 
2d470 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
2d480 20 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20   in the log and 
2d490 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72  the number of fr
2d4a0 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a  ames in the log.
2d4b0 2a 2a 20 74 68 61 74 20 68 61 76 65 20 62 65 65  ** that have bee
2d4c0 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a  n checkpointed..
2d4d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2d4e0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2d4f0 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
2d500 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  v2(.  ClientData
2d510 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2d520 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
2d530 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2d540 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2d550 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2d560 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2d570 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2d580 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2d590 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2d5a0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2d5b0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2d5c0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2d5d0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2d5e0 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20  char *zDb = 0;. 
2d5f0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
2d600 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20 65  int rc;..  int e
2d610 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67  Mode;.  int nLog
2d620 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20 6e   = -555;.  int n
2d630 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20 54  Ckpt = -555;.  T
2d640 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20  cl_Obj *pRet;.. 
2d650 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61 4d   const char * aM
2d660 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73 69  ode[] = { "passi
2d670 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72 65  ve", "full", "re
2d680 73 74 61 72 74 22 2c 20 22 74 72 75 6e 63 61 74  start", "truncat
2d690 65 22 2c 20 30 20 7d 3b 0a 20 20 61 73 73 65 72  e", 0 };.  asser
2d6a0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
2d6b0 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20  OINT_PASSIVE==0 
2d6c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
2d6d0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
2d6e0 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ULL==1 );.  asse
2d6f0 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
2d700 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32  POINT_RESTART==2
2d710 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
2d720 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
2d730 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 0a  TRUNCATE==3 );..
2d740 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
2d750 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
2d760 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2d770 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2d780 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d 45  , "DB MODE ?NAME
2d790 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
2d7a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2d7b0 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b    if( objc==4 ){
2d7c0 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  .    zDb = Tcl_G
2d7d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
2d7e0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  );.  }.  if( get
2d7f0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2d800 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2d810 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 7c  objv[1]), &db) |
2d820 7c 20 28 0a 20 20 20 20 20 20 54 43 4c 5f 4f 4b  | (.      TCL_OK
2d830 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
2d840 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c 20  Obj(0, objv[2], 
2d850 26 65 4d 6f 64 65 29 0a 20 20 20 26 26 20 54 43  &eMode).   && TC
2d860 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 64  L_OK!=Tcl_GetInd
2d870 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
2d880 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65  , objv[2], aMode
2d890 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65 4d  , "mode", 0, &eM
2d8a0 6f 64 65 29 20 0a 20 20 29 29 7b 0a 20 20 20 20  ode) .  )){.    
2d8b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2d8c0 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
2d8d0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
2d8e0 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c  oint_v2(db, zDb,
2d8f0 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20 26   eMode, &nLog, &
2d900 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28 20 72 63  nCkpt);.  if( rc
2d910 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
2d920 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29  c!=SQLITE_BUSY )
2d930 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2d940 20 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73 71 6c   *zErrCode = sql
2d950 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 3b  ite3ErrName(rc);
2d960 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
2d970 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
2d980 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2d990 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 43  lt(interp, zErrC
2d9a0 6f 64 65 2c 20 22 20 2d 20 22 2c 20 28 63 68 61  ode, " - ", (cha
2d9b0 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d  r *)sqlite3_errm
2d9c0 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
2d9d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2d9e0 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20  ;.  }..  pRet = 
2d9f0 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
2da00 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2da10 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2da20 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
2da30 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54 45 5f  tObj(rc==SQLITE_
2da40 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20 54 63  BUSY?1:0));.  Tc
2da50 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2da60 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
2da70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
2da80 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54 63 6c  bj(nLog));.  Tcl
2da90 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2daa0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
2dab0 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
2dac0 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54 63 6c  j(nCkpt));.  Tcl
2dad0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2dae0 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20  terp, pRet);..  
2daf0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2db00 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
2db10 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
2db20 6f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 56  ocheckpoint db V
2db30 41 4c 55 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ALUE.*/.static i
2db40 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2db50 20 74 65 73 74 5f 77 61 6c 5f 61 75 74 6f 63 68   test_wal_autoch
2db60 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65  eckpoint(.  Clie
2db70 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2db80 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
2db90 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2dba0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2dbb0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2dbc0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2dbd0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2dbe0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2dbf0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2dc00 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2dc10 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2dc20 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2dc30 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2dc40 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2dc50 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
2dc60 6e 74 20 69 56 61 6c 3b 0a 0a 0a 20 20 69 66 28  nt iVal;...  if(
2dc70 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
2dc80 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2dc90 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2dca0 2c 20 22 44 42 20 56 41 4c 55 45 22 29 3b 0a 20  , "DB VALUE");. 
2dcb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2dcc0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
2dcd0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2dce0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2dcf0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2dd00 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74  ) .   || Tcl_Get
2dd10 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 6f 62  IntFromObj(0, ob
2dd20 6a 76 5b 32 5d 2c 20 26 69 56 61 6c 29 0a 20 20  jv[2], &iVal).  
2dd30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
2dd40 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2dd50 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c  rc = sqlite3_wal
2dd60 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
2dd70 64 62 2c 20 69 56 61 6c 29 3b 0a 20 20 54 63 6c  db, iVal);.  Tcl
2dd80 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
2dd90 65 72 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  erp);.  if( rc!=
2dda0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2ddb0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
2ddc0 72 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 45  rCode = sqlite3E
2ddd0 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20 20  rrName(rc);.    
2dde0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2ddf0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2de00 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 43 6f  StringObj(zErrCo
2de10 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65  de, -1));.    re
2de20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2de30 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
2de40 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
2de50 74 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73 71  tclcmd:  test_sq
2de60 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49 50  lite3_log ?SCRIP
2de70 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72  T?.*/.static str
2de80 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b 20  uct LogCallback 
2de90 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
2dea0 70 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  pInterp;.  Tcl_O
2deb0 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63  bj *pObj;.} logc
2dec0 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30 7d  allback = {0, 0}
2ded0 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78 4c  ;.static void xL
2dee0 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20  ogcallback(void 
2def0 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20 65 72 72  *unused, int err
2df00 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20  , char *zMsg){. 
2df10 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d   Tcl_Obj *pNew =
2df20 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
2df30 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f  j(logcallback.pO
2df40 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  bj);.  Tcl_IncrR
2df50 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 20  efCount(pNew);. 
2df60 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2df70 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20 20  ndElement(.     
2df80 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65   0, pNew, Tcl_Ne
2df90 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
2dfa0 65 33 45 72 72 4e 61 6d 65 28 65 72 72 29 2c 20  e3ErrName(err), 
2dfb0 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 4c  -1).  );.  Tcl_L
2dfc0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2dfd0 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54 63 6c  ent(0, pNew, Tcl
2dfe0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4d  _NewStringObj(zM
2dff0 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  sg, -1));.  Tcl_
2e000 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61 6c  EvalObjEx(logcal
2e010 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20 70  lback.pInterp, p
2e020 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c  New, TCL_EVAL_GL
2e030 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49  OBAL|TCL_EVAL_DI
2e040 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63  RECT);.  Tcl_Dec
2e050 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b  rRefCount(pNew);
2e060 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  .}.static int SQ
2e070 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2e080 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 28 0a 20 20  _sqlite3_log(.  
2e090 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2e0a0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2e0b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2e0c0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2e0d0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2e0e0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2e0f0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2e100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e110 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2e120 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2e130 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2e140 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2e150 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ents */.){.  if(
2e160 20 6f 62 6a 63 3e 32 20 29 7b 0a 20 20 20 20 54   objc>2 ){.    T
2e170 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2e180 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2e190 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20   "SCRIPT");.    
2e1a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2e1b0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 67 63  ;.  }.  if( logc
2e1c0 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a  allback.pObj ){.
2e1d0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
2e1e0 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  ount(logcallback
2e1f0 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63  .pObj);.    logc
2e200 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 30  allback.pObj = 0
2e210 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63  ;.    logcallbac
2e220 6b 2e 70 49 6e 74 65 72 70 20 3d 20 30 3b 0a 20  k.pInterp = 0;. 
2e230 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69     sqlite3_confi
2e240 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  g(SQLITE_CONFIG_
2e250 4c 4f 47 2c 20 28 76 6f 69 64 2a 29 30 2c 20 28  LOG, (void*)0, (
2e260 76 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20  void*)0);.  }.  
2e270 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20  if( objc>1 ){.  
2e280 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f    logcallback.pO
2e290 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20  bj = objv[1];.  
2e2a0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2e2b0 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  nt(logcallback.p
2e2c0 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c  Obj);.    logcal
2e2d0 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20  lback.pInterp = 
2e2e0 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69  interp;.    sqli
2e2f0 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
2e300 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c  E_CONFIG_LOG, xL
2e310 6f 67 63 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  ogcallback, (voi
2e320 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  d*)0);.  }.  ret
2e330 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2e340 2a 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a  *.**     tcl_obj
2e350 70 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45  proc COMMANDNAME
2e360 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52   ARGS....**.** R
2e370 75 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  un a TCL command
2e380 20 75 73 69 6e 67 20 69 74 73 20 6f 62 6a 50 72   using its objPr
2e390 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54  oc interface.  T
2e3a0 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66  hrow an error if
2e3b0 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  .** the command 
2e3c0 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69  has no objProc i
2e3d0 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61  nterface..*/.sta
2e3e0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2e3f0 43 4c 41 50 49 20 72 75 6e 41 73 4f 62 6a 50 72  CLAPI runAsObjPr
2e400 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  oc(.  void * cli
2e410 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2e420 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
2e430 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
2e440 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2e450 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49  [].){.  Tcl_CmdI
2e460 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69  nfo cmdInfo;.  i
2e470 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
2e480 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2e490 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2e4a0 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  v, "COMMAND ..."
2e4b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2e4c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2e4d0 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  f( !Tcl_GetComma
2e4e0 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54  ndInfo(interp, T
2e4f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2e500 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29  v[1]), &cmdInfo)
2e510 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2e520 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2e530 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
2e540 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  und: ",.        
2e550 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
2e560 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72  (objv[1]), (char
2e570 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
2e580 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2e590 20 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62    if( cmdInfo.ob
2e5a0 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20  jProc==0 ){.    
2e5b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2e5c0 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
2e5d0 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63  d has no objProc
2e5e0 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
2e5f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2e600 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
2e610 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2e620 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
2e630 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62  eturn cmdInfo.ob
2e640 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62  jProc(cmdInfo.ob
2e650 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74  jClientData, int
2e660 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a  erp, objc-1, obj
2e670 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  v+1);.}..#ifndef
2e680 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
2e690 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49  LAIN./*.** WARNI
2e6a0 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  NG: The followin
2e6b0 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e  g function, prin
2e6c0 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
2e6d0 6e 28 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a  n() is an exact.
2e6e0 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70  ** copy of examp
2e6f0 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70  le code from eqp
2e700 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20  .in (eqp.html). 
2e710 49 66 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  If this code is 
2e720 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65  modified,.** the
2e730 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  n the documentat
2e740 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74  ion copy needs t
2e750 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73  o be modified as
2e760 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20   well..*/./*.** 
2e770 41 72 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69  Argument pStmt i
2e780 73 20 61 20 70 72 65 70 61 72 65 64 20 53 51 4c  s a prepared SQL
2e790 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
2e7a0 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c   function compil
2e7b0 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e  es.** an EXPLAIN
2e7c0 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
2e7d0 61 6e 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e  and to report on
2e7e0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
2e7f0 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20  atement,.** and 
2e800 70 72 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72  prints the repor
2e810 74 20 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e  t to stdout usin
2e820 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69  g printf()..*/.i
2e830 6e 74 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51  nt printExplainQ
2e840 75 65 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33  ueryPlan(sqlite3
2e850 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
2e860 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2e870 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2e880 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f   /* Input SQL */
2e890 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69  .  char *zExplai
2e8a0 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
2e8b0 20 20 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45     /* SQL with E
2e8c0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
2e8d0 4e 20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20  N prepended */. 
2e8e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
2e8f0 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20  Explain;        
2e900 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50   /* Compiled EXP
2e910 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
2e920 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2e930 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2e940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e950 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
2e960 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2e970 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c  _v2() */..  zSql
2e980 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
2e990 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71  Stmt);.  if( zSq
2e9a0 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
2e9b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a  LITE_ERROR;..  z
2e9c0 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
2e9d0 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41  3_mprintf("EXPLA
2e9e0 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73  IN QUERY PLAN %s
2e9f0 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ", zSql);.  if( 
2ea00 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65  zExplain==0 ) re
2ea10 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2ea20 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  M;..  rc = sqlit
2ea30 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71  e3_prepare_v2(sq
2ea40 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
2ea50 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e  pStmt), zExplain
2ea60 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
2ea70 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
2ea80 72 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20  ree(zExplain);. 
2ea90 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2eaa0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
2eab0 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
2eac0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
2ead0 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a  ep(pExplain) ){.
2eae0 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69      int iSelecti
2eaf0 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
2eb00 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
2eb10 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72   0);.    int iOr
2eb20 64 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  der = sqlite3_co
2eb30 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
2eb40 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69  n, 1);.    int i
2eb50 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  From = sqlite3_c
2eb60 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
2eb70 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73  in, 2);.    cons
2eb80 74 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20  t char *zDetail 
2eb90 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
2eba0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
2ebb0 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
2ebc0 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25  ;..    printf("%
2ebd0 64 20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69  d %d %d %s\n", i
2ebe0 53 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72  Selectid, iOrder
2ebf0 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c  , iFrom, zDetail
2ec00 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
2ec10 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2ec20 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a  e(pExplain);.}..
2ec30 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2ec40 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72  E_TCLAPI test_pr
2ec50 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69 64 20  int_eqp(.  void 
2ec60 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2ec70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2ec80 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2ec90 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2eca0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
2ecb0 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73   rc;.  sqlite3_s
2ecc0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
2ecd0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2ece0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2ecf0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2ed00 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
2ed10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ed20 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2ed30 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
2ed40 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2ed50 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
2ed60 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
2ed70 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70  _ERROR;.  rc = p
2ed80 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79  rintExplainQuery
2ed90 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20 20 2f  Plan(pStmt);.  /
2eda0 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64 65 64  * This is needed
2edb0 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f 20 74   on Windows so t
2edc0 68 61 74 20 61 20 74 65 73 74 20 63 61 73 65 20  hat a test case 
2edd0 75 73 69 6e 67 20 74 68 69 73 20 0a 20 20 2a 2a  using this .  **
2ede0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 6f 70   function can op
2edf0 65 6e 20 61 20 72 65 61 64 20 70 69 70 65 20 61  en a read pipe a
2ee00 6e 64 20 67 65 74 20 74 68 65 20 6f 75 74 70 75  nd get the outpu
2ee10 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e 74 45  t of.  ** printE
2ee20 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
2ee30 29 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  ) immediately.. 
2ee40 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73 74 64   */.  fflush(std
2ee50 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  out);.  Tcl_SetR
2ee60 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
2ee70 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
2ee80 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
2ee90 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2eea0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2eeb0 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a  MIT_EXPLAIN */..
2eec0 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65  /*.** sqlite3_te
2eed0 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52 42 20  st_control VERB 
2eee0 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69  ARGS....*/.stati
2eef0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2ef00 41 50 49 20 74 65 73 74 5f 74 65 73 74 5f 63 6f  API test_test_co
2ef10 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20  ntrol(.  void * 
2ef20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2ef30 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2ef40 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2ef50 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2ef60 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63  bjv[].){.  struc
2ef70 74 20 56 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e  t Verb {.    con
2ef80 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
2ef90 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61      int i;.  } a
2efa0 56 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  Verb[] = {.    {
2efb0 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52   "SQLITE_TESTCTR
2efc0 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
2efd0 54 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 54 45  T",    SQLITE_TE
2efe0 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
2eff0 5f 46 41 55 4c 54 20 7d 2c 20 0a 20 20 20 20 7b  _FAULT }, .    {
2f000 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52   "SQLITE_TESTCTR
2f010 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 22 2c 20  L_SORTER_MMAP", 
2f020 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
2f030 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d  STCTRL_SORTER_MM
2f040 41 50 20 20 20 20 20 7d 2c 20 0a 20 20 20 20 7b  AP     }, .    {
2f050 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52   "SQLITE_TESTCTR
2f060 4c 5f 49 4d 50 4f 53 54 45 52 22 2c 20 20 20 20  L_IMPOSTER",    
2f070 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
2f080 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20  STCTRL_IMPOSTER 
2f090 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2f0a0 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
2f0b0 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49  _INTERNAL_FUNCTI
2f0c0 4f 4e 53 22 2c 20 53 51 4c 49 54 45 5f 54 45 53  ONS", SQLITE_TES
2f0d0 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46  TCTRL_INTERNAL_F
2f0e0 55 4e 43 54 49 4f 4e 53 7d 2c 0a 20 20 7d 3b 0a  UNCTIONS},.  };.
2f0f0 20 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20 69    int iVerb;.  i
2f100 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74 20  nt iFlag;.  int 
2f110 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3c  rc;..  if( objc<
2f120 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
2f130 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2f140 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52 42  , 1, objv, "VERB
2f150 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20 20   ARGS...");.    
2f160 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f170 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54 63  ;.  }..  rc = Tc
2f180 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62  l_GetIndexFromOb
2f190 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20 20 69  jStruct(.      i
2f1a0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
2f1b0 61 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61 56  aVerb, sizeof(aV
2f1c0 65 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22 2c  erb[0]), "VERB",
2f1d0 20 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b 0a   0, &iVerb.  );.
2f1e0 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
2f1f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
2f200 20 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b 69   iFlag = aVerb[i
2f210 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74 63  Verb].i;.  switc
2f220 68 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20 20  h( iFlag ){.    
2f230 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
2f240 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55  CTRL_INTERNAL_FU
2f250 4e 43 54 49 4f 4e 53 3a 0a 20 20 20 20 63 61 73  NCTIONS:.    cas
2f260 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
2f270 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
2f280 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  T: {.      int v
2f290 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62  al;.      if( ob
2f2a0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  jc!=3 ){.       
2f2b0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2f2c0 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a  s(interp, 2, obj
2f2d0 76 2c 20 22 4f 4e 4f 46 46 22 29 3b 0a 20 20 20  v, "ONOFF");.   
2f2e0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
2f2f0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
2f300 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
2f310 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
2f320 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
2f330 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
2f340 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
2f350 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2f360 74 72 6f 6c 28 69 46 6c 61 67 2c 20 76 61 6c 29  trol(iFlag, val)
2f370 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
2f380 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53     }..    case S
2f390 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
2f3a0 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20  ORTER_MMAP: {.  
2f3b0 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20      int val;.   
2f3c0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a     sqlite3 *db;.
2f3d0 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
2f3e0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  4 ){.        Tcl
2f3f0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2f400 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
2f410 44 42 20 4c 49 4d 49 54 22 29 3b 0a 20 20 20 20  DB LIMIT");.    
2f420 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2f430 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
2f440 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
2f450 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2f460 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2f470 32 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  2]), &db) ) retu
2f480 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2f490 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
2f4a0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
2f4b0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29  , objv[3], &val)
2f4c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2f4d0 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ROR;.      sqlit
2f4e0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2f4f0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2f500 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c  SORTER_MMAP, db,
2f510 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65   val);.      bre
2f520 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
2f530 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
2f540 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b 0a  TRL_IMPOSTER: {.
2f550 20 20 20 20 20 20 69 6e 74 20 6f 6e 4f 66 66 2c        int onOff,
2f560 20 74 6e 75 6d 3b 0a 20 20 20 20 20 20 63 6f 6e   tnum;.      con
2f570 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
2f580 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  ;.      sqlite3 
2f590 2a 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  *db;.      if( o
2f5a0 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 20 20  bjc!=6 ){.      
2f5b0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2f5c0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
2f5d0 6a 76 2c 20 22 44 42 20 64 62 4e 61 6d 65 20 6f  jv, "DB dbName o
2f5e0 6e 4f 66 66 20 74 6e 75 6d 22 29 3b 0a 20 20 20  nOff tnum");.   
2f5f0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
2f600 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
2f610 20 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f       if( getDbPo
2f620 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2f630 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2f640 5b 32 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [2]), &db) ) ret
2f650 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2f660 20 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54       zDbName = T
2f670 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2f680 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69 66 28  v[3]);.      if(
2f690 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
2f6a0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2f6b0 34 5d 2c 20 26 6f 6e 4f 66 66 29 20 29 20 72 65  4], &onOff) ) re
2f6c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2f6d0 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
2f6e0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
2f6f0 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 74 6e  rp, objv[5], &tn
2f700 75 6d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  um) ) return TCL
2f710 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71  _ERROR;.      sq
2f720 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2f730 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2f740 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62 2c  RL_IMPOSTER, db,
2f750 20 7a 44 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c   zDbName, onOff,
2f760 20 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62 72   tnum);.      br
2f770 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  eak;.    }.  }..
2f780 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2f790 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
2f7a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
2f7b0 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  if SQLITE_OS_UNI
2f7c0 58 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  X.#include <sys/
2f7d0 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
2f7e0 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68   <sys/resource.h
2f7f0 3e 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  >..static int SQ
2f800 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2f810 5f 67 65 74 72 75 73 61 67 65 28 0a 20 20 76 6f  _getrusage(.  vo
2f820 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
2f830 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2f840 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
2f850 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
2f860 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
2f870 63 68 61 72 20 62 75 66 5b 31 30 32 34 5d 3b 0a  char buf[1024];.
2f880 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20    struct rusage 
2f890 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c 20  r;.  memset(&r, 
2f8a0 30 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  0, sizeof(r));. 
2f8b0 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47   getrusage(RUSAG
2f8c0 45 5f 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20 20  E_SELF, &r);..  
2f8d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2f8e0 28 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 62 75  (sizeof(buf), bu
2f8f0 66 2c 0a 20 20 20 20 22 72 75 5f 75 74 69 6d 65  f,.    "ru_utime
2f900 3d 25 64 2e 25 30 36 64 20 72 75 5f 73 74 69 6d  =%d.%06d ru_stim
2f910 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 6d 69 6e  e=%d.%06d ru_min
2f920 66 6c 74 3d 25 64 20 72 75 5f 6d 61 6a 66 6c 74  flt=%d ru_majflt
2f930 3d 25 64 22 2c 20 0a 20 20 20 20 28 69 6e 74 29  =%d", .    (int)
2f940 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 73 65  r.ru_utime.tv_se
2f950 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69  c, (int)r.ru_uti
2f960 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20  me.tv_usec, .   
2f970 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65   (int)r.ru_stime
2f980 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e  .tv_sec, (int)r.
2f990 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65 63  ru_stime.tv_usec
2f9a0 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75  , .    (int)r.ru
2f9b0 5f 6d 69 6e 66 6c 74 2c 20 28 69 6e 74 29 72 2e  _minflt, (int)r.
2f9c0 72 75 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b 0a 20  ru_majflt.  );. 
2f9d0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2f9e0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2f9f0 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20  wStringObj(buf, 
2fa00 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
2fa10 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
2fa20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
2fa30 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61  IN./*.** Informa
2fa40 74 69 6f 6e 20 70 61 73 73 65 64 20 66 72 6f 6d  tion passed from
2fa50 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
2fa60 20 69 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f 77   into the window
2fa70 73 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a  s file locker.**
2fa80 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
2fa90 61 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  ad..*/.struct wi
2faa0 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a  n32FileLocker {.
2fab0 20 20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b 20    char *evName; 
2fac0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2fad0 20 65 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c   event to signal
2fae0 20 74 68 72 65 61 64 20 73 74 61 72 74 75 70 20   thread startup 
2faf0 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20  */.  HANDLE h;  
2fb00 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
2fb10 6c 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  le of the file t
2fb20 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
2fb30 20 69 6e 74 20 64 65 6c 61 79 31 3b 20 20 20 20   int delay1;    
2fb40 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65       /* Delay be
2fb50 66 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  fore locking */.
2fb60 20 20 69 6e 74 20 64 65 6c 61 79 32 3b 20 20 20    int delay2;   
2fb70 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62        /* Delay b
2fb80 65 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67 20  efore unlocking 
2fb90 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20 20  */.  int ok;    
2fba0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
2fbb0 73 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74  shed ok */.  int
2fbc0 20 65 72 72 3b 20 20 20 20 20 20 20 20 20 20 20   err;           
2fbd0 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65   /* True if an e
2fbe0 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 7d  rror occurs */.}
2fbf0 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53  ;.#endif...#if S
2fc00 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e  QLITE_OS_WIN.#in
2fc10 63 6c 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68  clude <process.h
2fc20 3e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b  >./*.** The back
2fc30 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68  ground thread th
2fc40 61 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63  at does file loc
2fc50 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
2fc60 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43  void SQLITE_CDEC
2fc70 4c 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63  L win32_file_loc
2fc80 6b 65 72 28 76 6f 69 64 20 2a 70 41 70 70 44 61  ker(void *pAppDa
2fc90 74 61 29 7b 0a 20 20 73 74 72 75 63 74 20 77 69  ta){.  struct wi
2fca0 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 2a 70  n32FileLocker *p
2fcb0 20 3d 20 28 73 74 72 75 63 74 20 77 69 6e 33 32   = (struct win32
2fcc0 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41 70 70  FileLocker*)pApp
2fcd0 44 61 74 61 3b 0a 20 20 69 66 28 20 70 2d 3e 65  Data;.  if( p->e
2fce0 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48 41 4e  vName ){.    HAN
2fcf0 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45 76 65  DLE ev = OpenEve
2fd00 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46 59 5f  nt(EVENT_MODIFY_
2fd10 53 54 41 54 45 2c 20 46 41 4c 53 45 2c 20 70 2d  STATE, FALSE, p-
2fd20 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20 69 66  >evName);.    if
2fd30 20 28 20 65 76 20 29 7b 0a 20 20 20 20 20 20 53   ( ev ){.      S
2fd40 65 74 45 76 65 6e 74 28 65 76 29 3b 0a 20 20 20  etEvent(ev);.   
2fd50 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65     CloseHandle(e
2fd60 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  v);.    }.  }.  
2fd70 69 66 28 20 70 2d 3e 64 65 6c 61 79 31 20 29 20  if( p->delay1 ) 
2fd80 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 31 29  Sleep(p->delay1)
2fd90 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69 6c 65  ;.  if( LockFile
2fda0 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30  (p->h, 0, 0, 100
2fdb0 30 30 30 30 30 30 2c 20 30 29 20 29 7b 0a 20 20  000000, 0) ){.  
2fdc0 20 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79    Sleep(p->delay
2fdd0 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46 69  2);.    UnlockFi
2fde0 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31  le(p->h, 0, 0, 1
2fdf0 30 30 30 30 30 30 30 30 2c 20 30 29 3b 0a 20 20  00000000, 0);.  
2fe00 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20 20 7d    p->ok = 1;.  }
2fe10 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 72 72  else{.    p->err
2fe20 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73   = 1;.  }.  Clos
2fe30 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b 0a 20  eHandle(p->h);. 
2fe40 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70 2d 3e   p->h = 0;.  p->
2fe50 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20 70 2d  delay1 = 0;.  p-
2fe60 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d 0a 23  >delay2 = 0;.}.#
2fe70 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54  endif..#if SQLIT
2fe80 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 20  E_OS_WIN./*.**  
2fe90 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66      lock_win32_f
2fea0 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44 45 4c  ile FILENAME DEL
2feb0 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a 2a 2a  AY1 DELAY2.**.**
2fec0 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69 76   Get an exclusiv
2fed0 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f 63 6b  e manditory lock
2fee0 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44 45 4c   on file for DEL
2fef0 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  AY2 milliseconds
2ff00 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41 59 31  ..** Wait DELAY1
2ff10 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
2ff20 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20 74  fore acquiring t
2ff30 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74  he lock..*/.stat
2ff40 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2ff50 4c 41 50 49 20 77 69 6e 33 32 5f 66 69 6c 65 5f  LAPI win32_file_
2ff60 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20 63  lock(.  void * c
2ff70 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2ff80 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2ff90 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2ffa0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2ffb0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63  jv[].){.  static
2ffc0 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c   struct win32Fil
2ffd0 65 4c 6f 63 6b 65 72 20 78 20 3d 20 7b 20 22 77  eLocker x = { "w
2ffe0 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c  in32_file_lock",
2fff0 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20 7d   0, 0, 0, 0, 0 }
30000 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
30010 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 68 61  zFilename;.  cha
30020 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 69  r zBuf[200];.  i
30030 6e 74 20 72 65 74 72 79 20 3d 20 30 3b 0a 20 20  nt retry = 0;.  
30040 48 41 4e 44 4c 45 20 65 76 3b 0a 20 20 44 57 4f  HANDLE ev;.  DWO
30050 52 44 20 77 52 65 73 75 6c 74 3b 0a 20 20 0a 20  RD wResult;.  . 
30060 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26 20   if( objc!=4 && 
30070 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
30080 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
30090 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
300a0 20 22 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59   "FILENAME DELAY
300b0 31 20 44 45 4c 41 59 32 22 29 3b 0a 20 20 20 20  1 DELAY2");.    
300c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
300d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
300e0 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==1 ){.    sqlit
300f0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
30100 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
30110 22 25 64 20 25 64 20 25 64 20 25 64 20 25 64 22  "%d %d %d %d %d"
30120 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30130 20 20 20 20 20 20 20 78 2e 6f 6b 2c 20 78 2e 65         x.ok, x.e
30140 72 72 2c 20 78 2e 64 65 6c 61 79 31 2c 20 78 2e  rr, x.delay1, x.
30150 64 65 6c 61 79 32 2c 20 78 2e 68 29 3b 0a 20 20  delay2, x.h);.  
30160 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
30170 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
30180 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
30190 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
301a0 20 7d 0a 20 20 77 68 69 6c 65 28 20 78 2e 68 20   }.  while( x.h 
301b0 26 26 20 72 65 74 72 79 3c 33 30 20 29 7b 0a 20  && retry<30 ){. 
301c0 20 20 20 72 65 74 72 79 2b 2b 3b 0a 20 20 20 20     retry++;.    
301d0 53 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 7d 0a  Sleep(100);.  }.
301e0 20 20 69 66 28 20 78 2e 68 20 29 7b 0a 20 20 20    if( x.h ){.   
301f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
30200 74 28 69 6e 74 65 72 70 2c 20 22 62 75 73 79 22  t(interp, "busy"
30210 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
30220 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
30230 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
30240 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
30250 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
30260 26 78 2e 64 65 6c 61 79 31 29 20 29 20 72 65 74  &x.delay1) ) ret
30270 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
30280 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
30290 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
302a0 62 6a 76 5b 33 5d 2c 20 26 78 2e 64 65 6c 61 79  bjv[3], &x.delay
302b0 32 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  2) ) return TCL_
302c0 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e 61  ERROR;.  zFilena
302d0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
302e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 78  ng(objv[1]);.  x
302f0 2e 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65 28  .h = CreateFile(
30300 7a 46 69 6c 65 6e 61 6d 65 2c 20 47 45 4e 45 52  zFilename, GENER
30310 49 43 5f 52 45 41 44 7c 47 45 4e 45 52 49 43 5f  IC_READ|GENERIC_
30320 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20 20  WRITE,.         
30330 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45 5f       FILE_SHARE_
30340 52 45 41 44 7c 46 49 4c 45 5f 53 48 41 52 45 5f  READ|FILE_SHARE_
30350 57 52 49 54 45 2c 20 30 2c 20 4f 50 45 4e 5f 41  WRITE, 0, OPEN_A
30360 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20 20  LWAYS,.         
30370 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49 42       FILE_ATTRIB
30380 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a  UTE_NORMAL, 0);.
30390 20 20 69 66 28 20 21 78 2e 68 20 29 7b 0a 20 20    if( !x.h ){.  
303a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
303b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e  lt(interp, "cann
303c0 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22 2c  ot open file: ",
303d0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68 61   zFilename, (cha
303e0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
303f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
30400 0a 20 20 65 76 20 3d 20 43 72 65 61 74 65 45 76  .  ev = CreateEv
30410 65 6e 74 28 4e 55 4c 4c 2c 20 54 52 55 45 2c 20  ent(NULL, TRUE, 
30420 46 41 4c 53 45 2c 20 78 2e 65 76 4e 61 6d 65 29  FALSE, x.evName)
30430 3b 0a 20 20 69 66 20 28 20 21 65 76 20 29 7b 0a  ;.  if ( !ev ){.
30440 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
30450 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61  sult(interp, "ca
30460 6e 6e 6f 74 20 63 72 65 61 74 65 20 65 76 65 6e  nnot create even
30470 74 3a 20 22 2c 20 78 2e 65 76 4e 61 6d 65 2c 20  t: ", x.evName, 
30480 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
30490 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
304a0 0a 20 20 7d 0a 20 20 5f 62 65 67 69 6e 74 68 72  .  }.  _beginthr
304b0 65 61 64 28 77 69 6e 33 32 5f 66 69 6c 65 5f 6c  ead(win32_file_l
304c0 6f 63 6b 65 72 2c 20 30 2c 20 28 76 6f 69 64 2a  ocker, 0, (void*
304d0 29 26 78 29 3b 0a 20 20 53 6c 65 65 70 28 30 29  )&x);.  Sleep(0)
304e0 3b 0a 20 20 69 66 20 28 20 28 77 52 65 73 75 6c  ;.  if ( (wResul
304f0 74 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67 6c  t = WaitForSingl
30500 65 4f 62 6a 65 63 74 28 65 76 2c 20 31 30 30 30  eObject(ev, 1000
30510 30 29 29 21 3d 57 41 49 54 5f 4f 42 4a 45 43 54  0))!=WAIT_OBJECT
30520 5f 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  _0 ){.    sqlite
30530 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
30540 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
30550 30 78 25 78 22 2c 20 77 52 65 73 75 6c 74 29 3b  0x%x", wResult);
30560 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
30570 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
30580 61 69 74 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a  ait failed: ", z
30590 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
305a0 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
305b0 65 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ev);.    return 
305c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
305d0 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29   CloseHandle(ev)
305e0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
305f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
30600 20 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61   exists_win32_pa
30610 74 68 20 50 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65  th PATH.**.** Re
30620 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69  turns non-zero i
30630 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  f the specified 
30640 70 61 74 68 20 65 78 69 73 74 73 2c 20 77 68 6f  path exists, who
30650 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
30660 65 64 20 6e 61 6d 65 0a 2a 2a 20 6d 61 79 20 65  ed name.** may e
30670 78 63 65 65 64 20 32 36 30 20 63 68 61 72 61 63  xceed 260 charac
30680 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72  ters if it is pr
30690 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f  efixed with "\\?
306a0 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
306b0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
306c0 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61 74  win32_exists_pat
306d0 68 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  h(.  void *clien
306e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
306f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
30700 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
30710 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
30720 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .){.  if( objc!=
30730 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
30740 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
30750 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 48  , 1, objv, "PATH
30760 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
30770 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
30780 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
30790 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
307a0 42 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20 20  BooleanObj(.    
307b0 20 20 47 65 74 46 69 6c 65 41 74 74 72 69 62 75    GetFileAttribu
307c0 74 65 73 57 28 20 54 63 6c 5f 47 65 74 55 6e 69  tesW( Tcl_GetUni
307d0 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21 3d  code(objv[1]))!=
307e0 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54 54  INVALID_FILE_ATT
307f0 52 49 42 55 54 45 53 20 29 29 3b 0a 20 20 72 65  RIBUTES ));.  re
30800 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
30810 2f 2a 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64 5f  /*.**      find_
30820 77 69 6e 33 32 5f 66 69 6c 65 20 50 41 54 54 45  win32_file PATTE
30830 52 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  RN.**.** Returns
30840 20 61 20 6c 69 73 74 20 6f 66 20 65 6e 74 72 69   a list of entri
30850 65 73 20 69 6e 20 61 20 64 69 72 65 63 74 6f 72  es in a director
30860 79 20 74 68 61 74 20 6d 61 74 63 68 20 74 68 65  y that match the
30870 20 73 70 65 63 69 66 69 65 64 20 70 61 74 74 65   specified patte
30880 72 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75 6c  rn,.** whose ful
30890 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ly qualified nam
308a0 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38  e may exceed 248
308b0 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69   characters if i
308c0 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69  t is prefixed wi
308d0 74 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f  th.** "\\?\"..*/
308e0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
308f0 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f  TE_TCLAPI win32_
30900 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76 6f 69  find_file(.  voi
30910 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
30920 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
30930 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
30940 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
30950 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41  T objv[].){.  HA
30960 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c 65 20 3d  NDLE hFindFile =
30970 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f   INVALID_HANDLE_
30980 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32 5f 46  VALUE;.  WIN32_F
30990 49 4e 44 5f 44 41 54 41 57 20 66 69 6e 64 44 61  IND_DATAW findDa
309a0 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c  ta;.  Tcl_Obj *l
309b0 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52 44 20  istObj;.  DWORD 
309c0 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66 28  lastErrno;.  if(
309d0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
309e0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
309f0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
30a00 2c 20 22 50 41 54 54 45 52 4e 22 29 3b 0a 20 20  , "PATTERN");.  
30a10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
30a20 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e 64 46  OR;.  }.  hFindF
30a30 69 6c 65 20 3d 20 46 69 6e 64 46 69 72 73 74 46  ile = FindFirstF
30a40 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63  ileW(Tcl_GetUnic
30a50 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 66  ode(objv[1]), &f
30a60 69 6e 64 44 61 74 61 29 3b 0a 20 20 69 66 28 20  indData);.  if( 
30a70 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56 41 4c  hFindFile==INVAL
30a80 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 20  ID_HANDLE_VALUE 
30a90 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
30aa0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
30ab0 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
30ac0 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29  j(GetLastError()
30ad0 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
30ae0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
30af0 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65  listObj = Tcl_Ne
30b00 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49 6e  wObj();.  Tcl_In
30b10 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f  crRefCount(listO
30b20 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20 20  bj);.  do {.    
30b30 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
30b40 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
30b50 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65   listObj, Tcl_Ne
30b60 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20 20 20  wUnicodeObj(.   
30b70 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e 63 46       findData.cF
30b80 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  ileName, -1));. 
30b90 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
30ba0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
30bb0 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c  rp, listObj, Tcl
30bc0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 0a  _NewWideIntObj(.
30bd0 20 20 20 20 20 20 20 20 66 69 6e 64 44 61 74 61          findData
30be0 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74 65  .dwFileAttribute
30bf0 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65 28 20  s));.  } while( 
30c00 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28 68 46  FindNextFileW(hF
30c10 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64 44 61  indFile, &findDa
30c20 74 61 29 20 29 3b 0a 20 20 6c 61 73 74 45 72 72  ta) );.  lastErr
30c30 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72 6f  no = GetLastErro
30c40 72 28 29 3b 0a 20 20 69 66 28 20 6c 61 73 74 45  r();.  if( lastE
30c50 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20 26  rrno!=NO_ERROR &
30c60 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52 52  & lastErrno!=ERR
30c70 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53  OR_NO_MORE_FILES
30c80 20 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c 6f 73   ){.    FindClos
30c90 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20  e(hFindFile);.  
30ca0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
30cb0 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 20  nt(listObj);.   
30cc0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
30cd0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
30ce0 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c  wWideIntObj(GetL
30cf0 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20  astError()));.  
30d00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
30d10 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64 43 6c  OR;.  }.  FindCl
30d20 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a  ose(hFindFile);.
30d30 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
30d40 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f  lt(interp, listO
30d50 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  bj);.  return TC
30d60 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  L_OK;.}../*.**  
30d70 20 20 20 20 64 65 6c 65 74 65 5f 77 69 6e 33 32      delete_win32
30d80 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 0a 2a  _file FILENAME.*
30d90 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74 68 65  *.** Deletes the
30da0 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 2c   specified file,
30db0 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61   whose fully qua
30dc0 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20  lified name may 
30dd0 65 78 63 65 65 64 20 32 36 30 0a 2a 2a 20 63 68  exceed 260.** ch
30de0 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69  aracters if it i
30df0 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  s prefixed with 
30e00 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69  "\\?\"..*/.stati
30e10 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
30e20 41 50 49 20 77 69 6e 33 32 5f 64 65 6c 65 74 65  API win32_delete
30e30 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63  _file(.  void *c
30e40 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
30e50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
30e60 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
30e70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
30e80 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62  jv[].){.  if( ob
30e90 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
30ea0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
30eb0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
30ec0 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20 20  FILENAME");.    
30ed0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
30ee0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 44 65 6c  ;.  }.  if( !Del
30ef0 65 74 65 46 69 6c 65 57 28 54 63 6c 5f 47 65 74  eteFileW(Tcl_Get
30f00 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29  Unicode(objv[1])
30f10 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ) ){.    Tcl_Set
30f20 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
30f30 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
30f40 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
30f50 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
30f60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
30f70 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
30f80 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
30f90 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
30fa0 2a 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65 5f 77  *.**      make_w
30fb0 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43 54 4f  in32_dir DIRECTO
30fc0 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 73  RY.**.** Creates
30fd0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 64   the specified d
30fe0 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73 65 20  irectory, whose 
30ff0 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
31000 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20  name may exceed 
31010 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  248.** character
31020 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69  s if it is prefi
31030 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e  xed with "\\?\".
31040 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
31050 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 69 6e  QLITE_TCLAPI win
31060 33 32 5f 6d 6b 64 69 72 28 0a 20 20 76 6f 69 64  32_mkdir(.  void
31070 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
31080 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
31090 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
310a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
310b0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
310c0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
310d0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
310e0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
310f0 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b 0a  , "DIRECTORY");.
31100 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
31110 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
31120 21 43 72 65 61 74 65 44 69 72 65 63 74 6f 72 79  !CreateDirectory
31130 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  W(Tcl_GetUnicode
31140 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29  (objv[1]), NULL)
31150 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
31160 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
31170 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
31180 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  bj(GetLastError(
31190 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
311a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
311b0 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
311c0 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
311d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
311e0 0a 2a 2a 20 20 20 20 20 20 72 65 6d 6f 76 65 5f  .**      remove_
311f0 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43 54  win32_dir DIRECT
31200 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65  ORY.**.** Remove
31210 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
31220 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73 65  directory, whose
31230 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
31240 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64   name may exceed
31250 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74 65   248.** characte
31260 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66  rs if it is pref
31270 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22  ixed with "\\?\"
31280 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31290 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 69  SQLITE_TCLAPI wi
312a0 6e 33 32 5f 72 6d 64 69 72 28 0a 20 20 76 6f 69  n32_rmdir(.  voi
312b0 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
312c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
312d0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
312e0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
312f0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66  T objv[].){.  if
31300 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
31310 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
31320 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
31330 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b  v, "DIRECTORY");
31340 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
31350 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
31360 20 21 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72   !RemoveDirector
31370 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64  yW(Tcl_GetUnicod
31380 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a 20  e(objv[1])) ){. 
31390 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
313a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
313b0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65  NewWideIntObj(Ge
313c0 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
313d0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
313e0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
313f0 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
31400 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  rp);.  return TC
31410 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
31420 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74 69  ./*.**      opti
31430 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c  mization_control
31440 20 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a   DB OPT BOOLEAN.
31450 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20  **.** Enable or 
31460 64 69 73 61 62 6c 65 20 71 75 65 72 79 20 6f 70  disable query op
31470 74 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69 6e  timizations usin
31480 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65  g the sqlite3_te
31490 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20  st_control().** 
314a0 69 6e 74 65 72 66 61 63 65 2e 20 20 44 69 73 61  interface.  Disa
314b0 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69  ble if BOOLEAN i
314c0 73 20 66 61 6c 73 65 20 61 6e 64 20 65 6e 61 62  s false and enab
314d0 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73  le if BOOLEAN is
314e0 20 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69 73   true..** OPT is
314f0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
31500 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f   optimization to
31510 20 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f   be disabled..*/
31520 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
31530 54 45 5f 54 43 4c 41 50 49 20 6f 70 74 69 6d 69  TE_TCLAPI optimi
31540 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28 0a  zation_control(.
31550 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
31560 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
31570 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
31580 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
31590 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
315a0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
315b0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
315c0 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20  t char *zOpt;.  
315d0 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e 74  int onoff;.  int
315e0 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 73 74 61   mask = 0;.  sta
315f0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
31600 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
31610 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 20  r *zOptName;.   
31620 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20 61   int mask;.  } a
31630 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Opt[] = {.    { 
31640 22 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20  "all",          
31650 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41 6c         SQLITE_Al
31660 6c 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c 0a  lOpts        },.
31670 20 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20 20 20      { "none",   
31680 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
31690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
316a0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 75 65     },.    { "que
316b0 72 79 2d 66 6c 61 74 74 65 6e 65 72 22 2c 20 20  ry-flattener",  
316c0 20 20 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46     SQLITE_QueryF
316d0 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20 20 20  lattener },.    
316e0 7b 20 22 67 72 6f 75 70 62 79 2d 6f 72 64 65 72  { "groupby-order
316f0 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
31700 47 72 6f 75 70 42 79 4f 72 64 65 72 20 20 20 7d  GroupByOrder   }
31710 2c 0a 20 20 20 20 7b 20 22 66 61 63 74 6f 72 2d  ,.    { "factor-
31720 63 6f 6e 73 74 61 6e 74 73 22 2c 20 20 20 20 53  constants",    S
31730 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74 43  QLITE_FactorOutC
31740 6f 6e 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22 64  onst },.    { "d
31750 69 73 74 69 6e 63 74 2d 6f 70 74 22 2c 20 20 20  istinct-opt",   
31760 20 20 20 20 20 53 51 4c 49 54 45 5f 44 69 73 74       SQLITE_Dist
31770 69 6e 63 74 4f 70 74 20 20 20 20 7d 2c 0a 20 20  inctOpt    },.  
31780 20 20 7b 20 22 63 6f 76 65 72 2d 69 64 78 2d 73    { "cover-idx-s
31790 63 61 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54  can",      SQLIT
317a0 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 20 20  E_CoverIdxScan  
317b0 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65 72   },.    { "order
317c0 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20 20  -by-idx-join",  
317d0 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79 49   SQLITE_OrderByI
317e0 64 78 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b 20  dxJoin },.    { 
317f0 22 74 72 61 6e 73 69 74 69 76 65 22 2c 20 20 20  "transitive",   
31800 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 72         SQLITE_Tr
31810 61 6e 73 69 74 69 76 65 20 20 20 20 20 7d 2c 0a  ansitive     },.
31820 20 20 20 20 7b 20 22 6f 6d 69 74 2d 6e 6f 6f 70      { "omit-noop
31830 2d 6a 6f 69 6e 22 2c 20 20 20 20 20 20 53 51 4c  -join",      SQL
31840 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e  ITE_OmitNoopJoin
31850 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61     },.    { "sta
31860 74 33 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  t3",            
31870 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74 33 34     SQLITE_Stat34
31880 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
31890 7b 20 22 73 74 61 74 34 22 2c 20 20 20 20 20 20  { "stat4",      
318a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
318b0 53 74 61 74 33 34 20 20 20 20 20 20 20 20 20 7d  Stat34         }
318c0 2c 0a 20 20 20 20 7b 20 22 73 6b 69 70 2d 73 63  ,.    { "skip-sc
318d0 61 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 53  an",           S
318e0 51 4c 49 54 45 5f 53 6b 69 70 53 63 61 6e 20 20  QLITE_SkipScan  
318f0 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20       },.  };..  
31900 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
31910 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
31920 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
31930 62 6a 76 2c 20 22 44 42 20 4f 50 54 20 42 4f 4f  bjv, "DB OPT BOO
31940 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  LEAN");.    retu
31950 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
31960 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
31970 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
31980 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
31990 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
319a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
319b0 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
319c0 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
319d0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66  , objv[3], &onof
319e0 66 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  f) ) return TCL_
319f0 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d 20  ERROR;.  zOpt = 
31a00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
31a10 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  jv[2]);.  for(i=
31a20 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74  0; i<sizeof(aOpt
31a30 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d  )/sizeof(aOpt[0]
31a40 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ); i++){.    if(
31a50 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61 4f   strcmp(zOpt, aO
31a60 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d  pt[i].zOptName)=
31a70 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 73 6b  =0 ){.      mask
31a80 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b   = aOpt[i].mask;
31a90 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
31aa0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f 6e    }.  }.  if( on
31ab0 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d 61  off ) mask = ~ma
31ac0 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a  sk;.  if( i>=siz
31ad0 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66  eof(aOpt)/sizeof
31ae0 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20 20  (aOpt[0]) ){.   
31af0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
31b00 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  t(interp, "unkno
31b10 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  wn optimization 
31b20 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  - should be one 
31b30 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 20  of:",.          
31b40 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
31b50 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  *)0);.    for(i=
31b60 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70 74  0; i<sizeof(aOpt
31b70 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d  )/sizeof(aOpt[0]
31b80 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54  ); i++){.      T
31b90 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
31ba0 69 6e 74 65 72 70 2c 20 22 20 22 2c 20 61 4f 70  interp, " ", aOp
31bb0 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c 20 28  t[i].zOptName, (
31bc0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d 0a  char*)0);.    }.
31bd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
31be0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
31bf0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
31c00 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
31c10 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20  _OPTIMIZATIONS, 
31c20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65 74  db, mask);.  ret
31c30 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
31c40 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73 74  *.**     load_st
31c50 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 44  atic_extension D
31c60 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  B NAME ....**.**
31c70 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f 72   Load one or mor
31c80 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  e statically lin
31c90 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a  ked extensions..
31ca0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
31cb0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 63 6c 4c  LITE_TCLAPI tclL
31cc0 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e 73 69  oadStaticExtensi
31cd0 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a 20  onCmd(.  void * 
31ce0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
31cf0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
31d00 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
31d10 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
31d20 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72  bjv[].){.  exter
31d30 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 61 6d  n int sqlite3_am
31d40 61 74 63 68 5f 69 6e 69 74 28 73 71 6c 69 74 65  atch_init(sqlite
31d50 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
31d60 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
31d70 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
31d80 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 61 72   int sqlite3_car
31d90 72 61 79 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ray_init(sqlite3
31da0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
31db0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
31dc0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
31dd0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
31de0 75 72 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ure_init(sqlite3
31df0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
31e00 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
31e10 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
31e20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 73 76 5f  int sqlite3_csv_
31e30 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
31e40 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
31e50 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
31e60 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
31e70 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e 69  sqlite3_eval_ini
31e80 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
31e90 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
31ea0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
31eb0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
31ec0 69 74 65 33 5f 65 78 70 6c 61 69 6e 5f 69 6e 69  ite3_explain_ini
31ed0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
31ee0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
31ef0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
31f00 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
31f10 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
31f20 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
31f30 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
31f40 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
31f50 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
31f60 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 28  te3_fuzzer_init(
31f70 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
31f80 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
31f90 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
31fa0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
31fb0 65 33 5f 69 65 65 65 5f 69 6e 69 74 28 73 71 6c  e3_ieee_init(sql
31fc0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
31fd0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
31fe0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
31ff0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
32000 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 28 73 71  nextchar_init(sq
32010 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
32020 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
32030 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
32040 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
32050 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74  _percentile_init
32060 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
32070 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
32080 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 23  pi_routines*);.#
32090 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
320a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
320b0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
320c0 69 74 65 33 5f 70 72 65 66 69 78 65 73 5f 69 6e  ite3_prefixes_in
320d0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
320e0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
320f0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
32100 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72 6e  .#endif.  extern
32110 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 67   int sqlite3_reg
32120 65 78 70 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  exp_init(sqlite3
32130 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
32140 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
32150 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
32160 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6d 65  int sqlite3_reme
32170 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c 69 74 65  mber_init(sqlite
32180 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
32190 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
321a0 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
321b0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 72   int sqlite3_ser
321c0 69 65 73 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ies_init(sqlite3
321d0 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
321e0 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
321f0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
32200 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 70 65 6c  int sqlite3_spel
32210 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c 69 74 65  lfix_init(sqlite
32220 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
32230 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
32240 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
32250 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74   int sqlite3_tot
32260 79 70 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  ype_init(sqlite3
32270 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
32280 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
32290 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
322a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c  int sqlite3_whol
322b0 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c  enumber_init(sql
322c0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
322d0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
322e0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
322f0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
32300 75 6e 69 6f 6e 76 74 61 62 5f 69 6e 69 74 28 73  unionvtab_init(s
32310 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
32320 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
32330 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 23 69 66  _routines*);.#if
32340 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
32350 5a 4c 49 42 0a 20 20 65 78 74 65 72 6e 20 69 6e  ZLIB.  extern in
32360 74 20 73 71 6c 69 74 65 33 5f 7a 69 70 66 69 6c  t sqlite3_zipfil
32370 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  e_init(sqlite3*,
32380 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
32390 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
323a0 73 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73 74  s*);.#endif.  st
323b0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
323c0 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
323d0 61 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20  ar *zExtName;.  
323e0 20 20 69 6e 74 20 28 2a 70 49 6e 69 74 29 28 73    int (*pInit)(s
323f0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
32400 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
32410 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d  _routines*);.  }
32420 20 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20   aExtension[] = 
32430 7b 0a 20 20 20 20 7b 20 22 61 6d 61 74 63 68 22  {.    { "amatch"
32440 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32450 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f   sqlite3_amatch_
32460 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
32470 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 61 72     },.    { "car
32480 72 61 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  ray",           
32490 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 61 72       sqlite3_car
324a0 72 61 79 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ray_init        
324b0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
324c0 22 63 6c 6f 73 75 72 65 22 2c 20 20 20 20 20 20  "closure",      
324d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
324e0 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20 20  _closure_init   
324f0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
32500 20 20 7b 20 22 63 73 76 22 2c 20 20 20 20 20 20    { "csv",      
32510 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
32520 69 74 65 33 5f 63 73 76 5f 69 6e 69 74 20 20 20  ite3_csv_init   
32530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
32540 2c 0a 20 20 20 20 7b 20 22 65 76 61 6c 22 2c 20  ,.    { "eval", 
32550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32560 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e   sqlite3_eval_in
32570 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
32580 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78 70     },.    { "exp
32590 6c 61 69 6e 22 2c 20 20 20 20 20 20 20 20 20 20  lain",          
325a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70       sqlite3_exp
325b0 6c 61 69 6e 5f 69 6e 69 74 20 20 20 20 20 20 20  lain_init       
325c0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
325d0 22 66 69 6c 65 69 6f 22 2c 20 20 20 20 20 20 20  "fileio",       
325e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
325f0 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 20 20 20 20  _fileio_init    
32600 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
32610 20 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20 20    { "fuzzer",   
32620 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
32630 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74  ite3_fuzzer_init
32640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
32650 2c 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35 34  ,.    { "ieee754
32660 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
32670 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69 6e   sqlite3_ieee_in
32680 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
32690 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65 78     },.    { "nex
326a0 74 63 68 61 72 22 2c 20 20 20 20 20 20 20 20 20  tchar",         
326b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65 78       sqlite3_nex
326c0 74 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20 20  tchar_init      
326d0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
326e0 22 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20 20  "percentile",   
326f0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
32700 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74  _percentile_init
32710 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69             },.#i
32720 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
32730 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
32740 20 20 20 7b 20 22 70 72 65 66 69 78 65 73 22 2c     { "prefixes",
32750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
32760 6c 69 74 65 33 5f 70 72 65 66 69 78 65 73 5f 69  lite3_prefixes_i
32770 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
32780 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 20  },.#endif.    { 
32790 22 72 65 67 65 78 70 22 2c 20 20 20 20 20 20 20  "regexp",       
327a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
327b0 5f 72 65 67 65 78 70 5f 69 6e 69 74 20 20 20 20  _regexp_init    
327c0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
327d0 20 20 7b 20 22 72 65 6d 65 6d 62 65 72 22 2c 20    { "remember", 
327e0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
327f0 69 74 65 33 5f 72 65 6d 65 6d 62 65 72 5f 69 6e  ite3_remember_in
32800 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  it             }
32810 2c 0a 20 20 20 20 7b 20 22 73 65 72 69 65 73 22  ,.    { "series"
32820 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32830 20 73 71 6c 69 74 65 33 5f 73 65 72 69 65 73 5f   sqlite3_series_
32840 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
32850 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70 65     },.    { "spe
32860 6c 6c 66 69 78 22 2c 20 20 20 20 20 20 20 20 20  llfix",         
32870 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 70 65       sqlite3_spe
32880 6c 6c 66 69 78 5f 69 6e 69 74 20 20 20 20 20 20  llfix_init      
32890 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
328a0 22 74 6f 74 79 70 65 22 2c 20 20 20 20 20 20 20  "totype",       
328b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
328c0 5f 74 6f 74 79 70 65 5f 69 6e 69 74 20 20 20 20  _totype_init    
328d0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
328e0 20 20 7b 20 22 75 6e 69 6f 6e 76 74 61 62 22 2c    { "unionvtab",
328f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
32900 69 74 65 33 5f 75 6e 69 6f 6e 76 74 61 62 5f 69  ite3_unionvtab_i
32910 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 7d  nit            }
32920 2c 0a 20 20 20 20 7b 20 22 77 68 6f 6c 65 6e 75  ,.    { "wholenu
32930 6d 62 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  mber",          
32940 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c 65 6e 75   sqlite3_wholenu
32950 6d 62 65 72 5f 69 6e 69 74 20 20 20 20 20 20 20  mber_init       
32960 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c     },.#ifdef SQL
32970 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20  ITE_HAVE_ZLIB.  
32980 20 20 7b 20 22 7a 69 70 66 69 6c 65 22 2c 20 20    { "zipfile",  
32990 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
329a0 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69  ite3_zipfile_ini
329b0 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  t              }
329c0 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20  ,.#endif.  };.  
329d0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
329e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
329f0 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 72 63  ;.  int i, j, rc
32a00 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
32a10 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a  g = 0;.  if( obj
32a20 63 3c 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c<3 ){.    Tcl_W
32a30 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
32a40 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
32a50 20 4e 41 4d 45 20 2e 2e 2e 22 29 3b 0a 20 20 20   NAME ...");.   
32a60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
32a70 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
32a80 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
32a90 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
32aa0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
32ab0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
32ac0 52 3b 0a 20 20 66 6f 72 28 6a 3d 32 3b 20 6a 3c  R;.  for(j=2; j<
32ad0 6f 62 6a 63 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  objc; j++){.    
32ae0 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  zName = Tcl_GetS
32af0 74 72 69 6e 67 28 6f 62 6a 76 5b 6a 5d 29 3b 0a  tring(objv[j]);.
32b00 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
32b10 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73  rraySize(aExtens
32b20 69 6f 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ion); i++){.    
32b30 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e 61    if( strcmp(zNa
32b40 6d 65 2c 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69  me, aExtension[i
32b50 5d 2e 7a 45 78 74 4e 61 6d 65 29 3d 3d 30 20 29  ].zExtName)==0 )
32b60 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
32b70 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69    if( i>=ArraySi
32b80 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 20 29  ze(aExtension) )
32b90 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
32ba0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
32bb0 20 22 6e 6f 20 73 75 63 68 20 65 78 74 65 6e 73   "no such extens
32bc0 69 6f 6e 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20 28  ion: ", zName, (
32bd0 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20  char*)0);.      
32be0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
32bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
32c00 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 70 49  aExtension[i].pI
32c10 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nit ){.      rc 
32c20 3d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e  = aExtension[i].
32c30 70 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  pInit(db, &zErrM
32c40 73 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  sg, 0);.    }els
32c50 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
32c60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
32c70 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
32c80 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67 20  E_OK || zErrMsg 
32c90 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
32ca0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
32cb0 2c 20 22 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  , "initializatio
32cc0 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20 22  n of ", zName, "
32cd0 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72 72   failed: ", zErr
32ce0 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Msg,.           
32cf0 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
32d00 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  r*)0);.      sql
32d10 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
32d20 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  g);.      return
32d30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
32d40 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  }.  }.  return T
32d50 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
32d60 20 20 20 20 73 6f 72 74 65 72 5f 74 65 73 74 5f      sorter_test_
32d70 66 61 6b 65 68 65 61 70 20 42 4f 4f 4c 0a 2a 2a  fakeheap BOOL.**
32d80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
32d90 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 6f 72  QLITE_TCLAPI sor
32da0 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61  ter_test_fakehea
32db0 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  p(.  void * clie
32dc0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
32dd0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
32de0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
32df0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
32e00 5d 0a 29 7b 0a 20 20 69 6e 74 20 62 41 72 67 3b  ].){.  int bArg;
32e10 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
32e20 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
32e30 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
32e40 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 22 29 3b  , objv, "BOOL");
32e50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
32e60 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
32e70 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
32e80 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
32e90 6f 62 6a 76 5b 31 5d 2c 20 26 62 41 72 67 29 20  objv[1], &bArg) 
32ea0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
32eb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
32ec0 69 66 28 20 62 41 72 67 20 29 7b 0a 20 20 20 20  if( bArg ){.    
32ed0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
32ee0 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30  lConfig.pHeap==0
32ef0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
32f00 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
32f10 65 61 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  eap = SQLITE_INT
32f20 5f 54 4f 5f 50 54 52 28 2d 31 29 3b 0a 20 20 20  _TO_PTR(-1);.   
32f30 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
32f40 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
32f50 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 53  lConfig.pHeap==S
32f60 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
32f70 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 73 71  (-1) ){.      sq
32f80 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
32f90 67 2e 70 48 65 61 70 20 3d 20 30 3b 0a 20 20 20  g.pHeap = 0;.   
32fa0 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65   }.  }..  Tcl_Re
32fb0 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
32fc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
32fd0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
32fe0 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f 72   sorter_test_sor
32ff0 74 34 5f 68 65 6c 70 65 72 20 44 42 20 53 51 4c  t4_helper DB SQL
33000 31 20 4e 53 54 45 50 20 53 51 4c 32 0a 2a 2a 0a  1 NSTEP SQL2.**.
33010 2a 2a 20 43 6f 6d 70 69 6c 65 20 53 51 4c 20 73  ** Compile SQL s
33020 74 61 74 65 6d 65 6e 74 20 24 53 51 4c 31 20 61  tatement $SQL1 a
33030 6e 64 20 73 74 65 70 20 69 74 20 24 4e 53 54 45  nd step it $NSTE
33040 50 20 74 69 6d 65 73 2e 20 46 6f 72 20 65 61 63  P times. For eac
33050 68 20 72 6f 77 2c 20 0a 2a 2a 20 63 68 65 63 6b  h row, .** check
33060 20 74 68 61 74 20 74 68 65 20 6c 65 66 74 6d 6f   that the leftmo
33070 73 74 20 61 6e 64 20 72 69 67 68 74 6d 6f 73 74  st and rightmost
33080 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
33090 64 20 61 72 65 20 62 6f 74 68 20 69 6e 74 65 67  d are both integ
330a0 65 72 73 2c 0a 2a 2a 20 61 6e 64 20 74 68 61 74  ers,.** and that
330b0 20 62 6f 74 68 20 63 6f 6e 74 61 69 6e 20 74 68   both contain th
330c0 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 0a 2a 2a  e same value..**
330d0 0a 2a 2a 20 54 68 65 6e 20 65 78 65 63 75 74 65  .** Then execute
330e0 20 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c 32   statement $SQL2
330f0 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  . Check that the
33100 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
33110 6e 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73  ns the same.** s
33120 65 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69  et of integers i
33130 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
33140 20 61 73 20 69 6e 20 74 68 65 20 70 72 65 76 69   as in the previ
33150 6f 75 73 20 73 74 65 70 20 28 75 73 69 6e 67 20  ous step (using 
33160 24 53 51 4c 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  $SQL1)..*/.stati
33170 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
33180 41 50 49 20 73 6f 72 74 65 72 5f 74 65 73 74 5f  API sorter_test_
33190 73 6f 72 74 34 5f 68 65 6c 70 65 72 28 0a 20 20  sort4_helper(.  
331a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
331b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
331c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
331d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
331e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
331f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
33200 71 6c 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ql1;.  const cha
33210 72 20 2a 7a 53 71 6c 32 3b 0a 20 20 69 6e 74 20  r *zSql2;.  int 
33220 6e 53 74 65 70 3b 20 0a 20 20 69 6e 74 20 69 53  nStep; .  int iS
33230 74 65 70 3b 20 0a 20 20 75 6e 73 69 67 6e 65 64  tep; .  unsigned
33240 20 69 6e 74 20 69 43 6b 73 75 6d 31 20 3d 20 30   int iCksum1 = 0
33250 3b 20 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ; .  unsigned in
33260 74 20 69 43 6b 73 75 6d 32 20 3d 20 30 3b 20 0a  t iCksum2 = 0; .
33270 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
33280 69 42 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  iB;.  sqlite3 *d
33290 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  b;.  sqlite3_stm
332a0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 0a 20 20 69  t *pStmt;.  .  i
332b0 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
332c0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
332d0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
332e0 6a 76 2c 20 22 44 42 20 53 51 4c 31 20 4e 53 54  jv, "DB SQL1 NST
332f0 45 50 20 53 51 4c 32 22 29 3b 0a 20 20 20 20 72  EP SQL2");.    r
33300 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
33310 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
33320 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
33330 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
33340 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
33350 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
33360 3b 0a 20 20 7a 53 71 6c 31 20 3d 20 54 63 6c 5f  ;.  zSql1 = Tcl_
33370 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
33380 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
33390 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
333a0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53  rp, objv[3], &nS
333b0 74 65 70 29 20 29 20 72 65 74 75 72 6e 20 54 43  tep) ) return TC
333c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 32  L_ERROR;.  zSql2
333d0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
333e0 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 72 63  (objv[4]);..  rc
333f0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
33400 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 31 2c  re_v2(db, zSql1,
33410 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
33420 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
33430 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f  E_OK ) goto sql_
33440 65 72 72 6f 72 3b 0a 0a 20 20 69 42 20 3d 20 73  error;..  iB = s
33450 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
33460 75 6e 74 28 70 53 74 6d 74 29 2d 31 3b 0a 20 20  unt(pStmt)-1;.  
33470 66 6f 72 28 69 53 74 65 70 3d 30 3b 20 69 53 74  for(iStep=0; iSt
33480 65 70 3c 6e 53 74 65 70 20 26 26 20 53 51 4c 49  ep<nStep && SQLI
33490 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
334a0 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53 74  step(pStmt); iSt
334b0 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61  ep++){.    int a
334c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
334d0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
334e0 0a 20 20 20 20 69 66 28 20 61 21 3d 73 71 6c 69  .    if( a!=sqli
334f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
33500 53 74 6d 74 2c 20 69 42 29 20 29 7b 0a 20 20 20  Stmt, iB) ){.   
33510 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
33520 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 61 74  ult(interp, "dat
33530 61 20 65 72 72 6f 72 3a 20 28 61 21 3d 62 29 22  a error: (a!=b)"
33540 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
33550 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
33560 20 20 7d 0a 0a 20 20 20 20 69 43 6b 73 75 6d 31    }..    iCksum1
33570 20 2b 3d 20 28 69 43 6b 73 75 6d 31 20 3c 3c 20   += (iCksum1 << 
33580 33 29 20 2b 20 28 75 6e 73 69 67 6e 65 64 20 69  3) + (unsigned i
33590 6e 74 29 61 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  nt)a;.  }.  rc =
335a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
335b0 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
335c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
335d0 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a  goto sql_error;.
335e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
335f0 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
33600 53 71 6c 32 2c 20 2d 31 2c 20 26 70 53 74 6d 74  Sql2, -1, &pStmt
33610 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
33620 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
33630 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 20 20 66 6f   sql_error;.  fo
33640 72 28 69 53 74 65 70 3d 30 3b 20 53 51 4c 49 54  r(iStep=0; SQLIT
33650 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
33660 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53 74 65  tep(pStmt); iSte
33670 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61 20  p++){.    int a 
33680 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
33690 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a  _int(pStmt, 0);.
336a0 20 20 20 20 69 43 6b 73 75 6d 32 20 2b 3d 20 28      iCksum2 += (
336b0 69 43 6b 73 75 6d 32 20 3c 3c 20 33 29 20 2b 20  iCksum2 << 3) + 
336c0 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 61 3b  (unsigned int)a;
336d0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
336e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
336f0 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  mt);.  if( rc!=S
33700 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
33710 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 66  sql_error;..  if
33720 28 20 69 43 6b 73 75 6d 31 21 3d 69 43 6b 73 75  ( iCksum1!=iCksu
33730 6d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  m2 ){.    Tcl_Ap
33740 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
33750 70 2c 20 22 63 68 65 63 6b 73 75 6d 20 6d 69 73  p, "checksum mis
33760 6d 61 74 63 68 22 2c 20 30 29 3b 0a 20 20 20 20  match", 0);.    
33770 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
33780 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
33790 54 43 4c 5f 4f 4b 3b 0a 20 73 71 6c 5f 65 72 72  TCL_OK;. sql_err
337a0 6f 72 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  or:.  Tcl_Append
337b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
337c0 73 71 6c 20 65 72 72 6f 72 3a 20 22 2c 20 73 71  sql error: ", sq
337d0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
337e0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
337f0 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 0a 23 69  CL_ERROR;.}...#i
33800 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
33810 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
33820 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
33830 33 75 73 65 72 61 75 74 68 2e 68 22 0a 2f 2a 0a  3userauth.h"./*.
33840 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
33850 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
33860 69 63 61 74 65 20 44 42 20 55 53 45 52 4e 41 4d  icate DB USERNAM
33870 45 20 50 41 53 53 57 4f 52 44 0a 2a 2f 0a 73 74  E PASSWORD.*/.st
33880 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
33890 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73 65 72  TCLAPI test_user
338a0 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28 0a 20  _authenticate(. 
338b0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
338c0 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65  ntData, /* Unuse
338d0 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
338e0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
338f0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
33900 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
33910 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
33920 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
33930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
33940 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
33950 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
33960 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
33970 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
33980 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ts */.){.  char 
33990 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63 68  *zUser = 0;.  ch
339a0 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b  ar *zPasswd = 0;
339b0 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20 3d  .  int nPasswd =
339c0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
339d0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
339e0 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
339f0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
33a00 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
33a10 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d  bjv, "DB USERNAM
33a20 45 20 50 41 53 53 57 4f 52 44 22 29 3b 0a 20 20  E PASSWORD");.  
33a30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
33a40 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
33a50 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
33a60 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
33a70 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
33a80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
33a90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
33aa0 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  User = Tcl_GetSt
33ab0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
33ac0 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47   zPasswd = Tcl_G
33ad0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
33ae0 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77  objv[3], &nPassw
33af0 64 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  d);.  rc = sqlit
33b00 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69  e3_user_authenti
33b10 63 61 74 65 28 64 62 2c 20 7a 55 73 65 72 2c 20  cate(db, zUser, 
33b20 7a 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64  zPasswd, nPasswd
33b30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
33b40 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
33b50 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
33b60 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
33b70 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
33b80 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
33b90 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e  LITE_USER_AUTHEN
33ba0 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66  TICATION */..#if
33bb0 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  def SQLITE_USER_
33bc0 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f  AUTHENTICATION./
33bd0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
33be0 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 20 44  lite3_user_add D
33bf0 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
33c00 4f 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a 73  ORD ISADMIN.*/.s
33c10 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
33c20 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73 65  _TCLAPI test_use
33c30 72 5f 61 64 64 28 0a 20 20 43 6c 69 65 6e 74 44  r_add(.  ClientD
33c40 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
33c50 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
33c60 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
33c70 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
33c80 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
33c90 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
33ca0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
33cb0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
33cc0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
33cd0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
33ce0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
33cf0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
33d00 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
33d10 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d  .  char *zUser =
33d20 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73   0;.  char *zPas
33d30 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  swd = 0;.  int n
33d40 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e  Passwd = 0;.  in
33d50 74 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20  t isAdmin = 0;. 
33d60 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
33d70 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
33d80 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
33d90 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
33da0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
33db0 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53  "DB USERNAME PAS
33dc0 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b  SWORD ISADMIN");
33dd0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
33de0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
33df0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
33e00 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
33e10 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
33e20 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
33e30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
33e40 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65    zUser = Tcl_Ge
33e50 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
33e60 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63  ;.  zPasswd = Tc
33e70 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
33e80 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61  bj(objv[3], &nPa
33e90 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74  sswd);.  Tcl_Get
33ea0 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
33eb0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
33ec0 26 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20  &isAdmin);.  rc 
33ed0 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61  = sqlite3_user_a
33ee0 64 64 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50  dd(db, zUser, zP
33ef0 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20  asswd, nPasswd, 
33f00 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f  isAdmin);.  Tcl_
33f10 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
33f20 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
33f30 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
33f40 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
33f50 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
33f60 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
33f70 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
33f80 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
33f90 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
33fa0 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ATION./*.** tclc
33fb0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65  md:  sqlite3_use
33fc0 72 5f 63 68 61 6e 67 65 20 44 42 20 55 53 45 52  r_change DB USER
33fd0 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53  NAME PASSWORD IS
33fe0 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20  ADMIN.*/.static 
33ff0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
34000 49 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61 6e  I test_user_chan
34010 67 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ge(.  ClientData
34020 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
34030 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
34040 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
34050 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
34060 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
34070 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
34080 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
34090 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
340a0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
340b0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
340c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
340d0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
340e0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
340f0 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
34100 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64  .  char *zPasswd
34110 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73   = 0;.  int nPas
34120 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  swd = 0;.  int i
34130 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73 71  sAdmin = 0;.  sq
34140 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
34150 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
34160 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
34170 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
34180 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
34190 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
341a0 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20 20  RD ISADMIN");.  
341b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
341c0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
341d0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
341e0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
341f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
34200 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
34210 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
34220 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74  User = Tcl_GetSt
34230 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
34240 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f 47   zPasswd = Tcl_G
34250 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
34260 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73 77  objv[3], &nPassw
34270 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f 6f  d);.  Tcl_GetBoo
34280 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
34290 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69 73  rp, objv[4], &is
342a0 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20 73  Admin);.  rc = s
342b0 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e  qlite3_user_chan
342c0 67 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a 50  ge(db, zUser, zP
342d0 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c 20  asswd, nPasswd, 
342e0 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c 5f  isAdmin);.  Tcl_
342f0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
34300 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
34310 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
34320 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
34330 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
34340 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
34350 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
34360 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
34370 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
34380 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ATION./*.** tclc
34390 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65  md:  sqlite3_use
343a0 72 5f 64 65 6c 65 74 65 20 44 42 20 55 53 45 52  r_delete DB USER
343b0 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NAME.*/.static i
343c0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
343d0 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65 74   test_user_delet
343e0 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
343f0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55  clientData, /* U
34400 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49  nused */.  Tcl_I
34410 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
34420 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
34430 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
34440 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
34450 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
34460 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
34470 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
34480 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
34490 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
344a0 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
344b0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63  uments */.){.  c
344c0 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a  har *zUser = 0;.
344d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
344e0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
344f0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
34500 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
34510 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
34520 20 22 44 42 20 55 53 45 52 4e 41 4d 45 22 29 3b   "DB USERNAME");
34530 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
34540 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
34550 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
34560 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
34570 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
34580 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
34590 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
345a0 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65    zUser = Tcl_Ge
345b0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
345c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
345d0 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 64 62 2c  _user_delete(db,
345e0 20 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f 53   zUser);.  Tcl_S
345f0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
34600 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
34610 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
34620 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
34630 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
34640 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f   /* SQLITE_USER_
34650 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a  AUTHENTICATION *
34660 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  /../*.** tclcmd:
34670 20 62 61 64 5f 62 65 68 61 76 69 6f 72 20 54 59   bad_behavior TY
34680 50 45 0a 2a 2a 0a 2a 2a 20 44 6f 20 73 6f 6d 65  PE.**.** Do some
34690 20 74 68 69 6e 67 73 20 74 68 61 74 20 73 68 6f   things that sho
346a0 75 6c 64 20 74 72 69 67 67 65 72 20 61 20 76 61  uld trigger a va
346b0 6c 67 72 69 6e 64 20 6f 72 20 2d 66 73 61 6e 69  lgrind or -fsani
346c0 74 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64 0a 2a  tize=undefined.*
346d0 2a 20 77 61 72 6e 69 6e 67 2e 20 20 54 68 69 73  * warning.  This
346e0 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72 69   is used to veri
346f0 66 79 20 74 68 61 74 20 65 72 72 6f 72 73 20 61  fy that errors a
34700 6e 64 20 77 61 72 6e 69 6e 67 73 20 6f 75 74 70  nd warnings outp
34710 75 74 20 62 79 20 74 68 6f 73 65 0a 2a 2a 20 74  ut by those.** t
34720 6f 6f 6c 73 20 61 72 65 20 64 65 74 65 63 74 65  ools are detecte
34730 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73 63  d by the test sc
34740 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ripts..**.**    
34750 20 20 20 54 59 50 45 20 20 20 20 20 20 20 42 45     TYPE       BE
34760 48 41 56 49 4f 52 0a 2a 2a 20 20 20 20 20 20 20  HAVIOR.**       
34770 31 20 20 20 20 20 20 20 20 20 20 4f 76 65 72 66  1          Overf
34780 6c 6f 77 20 61 20 73 69 67 6e 65 64 20 69 6e 74  low a signed int
34790 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 32 20  eger.**       2 
347a0 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 62 61           Jump ba
347b0 73 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69 74  sed on an uninit
347c0 69 61 6c 69 7a 65 64 20 76 61 72 69 61 62 6c 65  ialized variable
347d0 0a 2a 2a 20 20 20 20 20 20 20 33 20 20 20 20 20  .**       3     
347e0 20 20 20 20 20 52 65 61 64 20 61 66 74 65 72 20       Read after 
347f0 66 72 65 65 0a 2a 2a 20 20 20 20 20 20 20 34 20  free.**       4 
34800 20 20 20 20 20 20 20 20 20 50 61 6e 69 63 0a 2a           Panic.*
34810 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
34820 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
34830 62 61 64 5f 62 65 68 61 76 69 6f 72 28 0a 20 20  bad_behavior(.  
34840 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
34850 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
34860 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  r to an integer 
34870 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f 20  containing zero 
34880 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
34890 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
348a0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
348b0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
348c0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
348d0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
348e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
348f0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
34900 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
34910 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
34920 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
34930 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 54 79   */.){.  int iTy
34940 70 65 3b 0a 20 20 69 6e 74 20 78 79 7a 3b 0a 20  pe;.  int xyz;. 
34950 20 69 6e 74 20 69 20 3d 20 2a 28 69 6e 74 2a 29   int i = *(int*)
34960 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 6e  clientData;.  in
34970 74 20 6a 3b 0a 20 20 69 6e 74 20 77 5b 31 30 5d  t j;.  int w[10]
34980 3b 0a 20 20 69 6e 74 20 2a 61 3b 0a 20 20 69 66  ;.  int *a;.  if
34990 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
349a0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
349b0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
349c0 76 2c 20 22 54 59 50 45 22 29 3b 0a 20 20 20 20  v, "TYPE");.    
349d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
349e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
349f0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
34a00 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
34a10 69 54 79 70 65 29 20 29 20 72 65 74 75 72 6e 20  iType) ) return 
34a20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 77 69  TCL_ERROR;.  swi
34a30 74 63 68 28 20 69 54 79 70 65 20 29 7b 0a 20 20  tch( iType ){.  
34a40 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20 20    case 1: {.    
34a50 20 20 78 79 7a 20 3d 20 30 78 37 66 66 66 66 66    xyz = 0x7fffff
34a60 30 30 20 2d 20 69 3b 0a 20 20 20 20 20 20 78 79  00 - i;.      xy
34a70 7a 20 2b 3d 20 30 78 31 30 30 3b 0a 20 20 20 20  z += 0x100;.    
34a80 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
34a90 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
34aa0 65 77 49 6e 74 4f 62 6a 28 78 79 7a 29 29 3b 0a  ewIntObj(xyz));.
34ab0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
34ac0 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20 7b   }.    case 2: {
34ad0 0a 20 20 20 20 20 20 77 5b 31 5d 20 3d 20 35 3b  .      w[1] = 5;
34ae0 0a 20 20 20 20 20 20 69 66 28 20 77 5b 69 5d 3e  .      if( w[i]>
34af0 30 20 29 20 77 5b 31 5d 2b 2b 3b 0a 20 20 20 20  0 ) w[1]++;.    
34b00 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
34b10 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
34b20 65 77 49 6e 74 4f 62 6a 28 77 5b 31 5d 29 29 3b  ewIntObj(w[1]));
34b30 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
34b40 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a 20    }.    case 3: 
34b50 7b 0a 20 20 20 20 20 20 61 20 3d 20 6d 61 6c 6c  {.      a = mall
34b60 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e 74 29 2a  oc( sizeof(int)*
34b70 31 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  10 );.      for(
34b80 6a 3d 30 3b 20 6a 3c 31 30 3b 20 6a 2b 2b 29 20  j=0; j<10; j++) 
34b90 61 5b 6a 5d 20 3d 20 6a 3b 0a 20 20 20 20 20 20  a[j] = j;.      
34ba0 66 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20 54  free(a);.      T
34bb0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
34bc0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
34bd0 6e 74 4f 62 6a 28 61 5b 69 5d 29 29 3b 0a 20 20  ntObj(a[i]));.  
34be0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
34bf0 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a 20  .    case 4: {. 
34c00 20 20 20 20 20 54 63 6c 5f 50 61 6e 69 63 28 22       Tcl_Panic("
34c10 44 65 6c 69 62 65 72 61 74 65 20 70 61 6e 69 63  Deliberate panic
34c20 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
34c30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
34c40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20 20 0a  urn TCL_OK;.}  .
34c50 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
34c60 20 72 65 67 69 73 74 65 72 5f 64 62 73 74 61 74   register_dbstat
34c70 5f 76 74 61 62 20 44 42 0a 2a 2a 0a 2a 2a 20 43  _vtab DB.**.** C
34c80 61 75 73 65 20 74 68 65 20 64 62 73 74 61 74 20  ause the dbstat 
34c90 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74 6f  virtual table to
34ca0 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e   be available on
34cb0 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
34cc0 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
34cd0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
34ce0 65 73 74 5f 72 65 67 69 73 74 65 72 5f 64 62 73  est_register_dbs
34cf0 74 61 74 5f 76 74 61 62 28 0a 20 20 76 6f 69 64  tat_vtab(.  void
34d00 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
34d10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
34d20 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
34d30 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
34d40 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 64 65   objv[].){.#ifde
34d50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
34d60 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 54 63 6c  RTUALTABLE.  Tcl
34d70 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
34d80 74 65 72 70 2c 20 22 64 62 73 74 61 74 20 6e 6f  terp, "dbstat no
34d90 74 20 61 76 61 69 6c 61 62 6c 65 20 62 65 63 61  t available beca
34da0 75 73 65 20 6f 66 20 22 0a 20 20 20 20 20 20 20  use of ".       
34db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34dc0 20 20 20 20 22 53 51 4c 49 54 45 5f 4f 4d 49 54      "SQLITE_OMIT
34dd0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 22 2c 20  _VIRTUALTABLE", 
34de0 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65 74  (void*)0);.  ret
34df0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23  urn TCL_ERROR;.#
34e00 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 53 71  else.  struct Sq
34e10 6c 69 74 65 44 62 20 7b 20 73 71 6c 69 74 65 33  liteDb { sqlite3
34e20 20 2a 64 62 3b 20 7d 3b 0a 20 20 63 68 61 72 20   *db; };.  char 
34e30 2a 7a 44 62 3b 0a 20 20 54 63 6c 5f 43 6d 64 49  *zDb;.  Tcl_CmdI
34e40 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 0a 20 20  nfo cmdInfo;..  
34e50 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
34e60 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
34e70 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
34e80 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
34e90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
34ea0 3b 0a 20 20 7d 0a 0a 20 20 7a 44 62 20 3d 20 54  ;.  }..  zDb = T
34eb0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
34ec0 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c  v[1]);.  if( Tcl
34ed0 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28  _GetCommandInfo(
34ee0 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d  interp, zDb, &cm
34ef0 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 73 71  dInfo) ){.    sq
34f00 6c 69 74 65 33 2a 20 64 62 20 3d 20 28 28 73 74  lite3* db = ((st
34f10 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
34f20 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
34f30 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 20 20 73  Data)->db;.    s
34f40 71 6c 69 74 65 33 44 62 73 74 61 74 52 65 67 69  qlite3DbstatRegi
34f50 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 20 20  ster(db);.  }.  
34f60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23  return TCL_OK;.#
34f70 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
34f80 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
34f90 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63  E */.}../*.** tc
34fa0 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f  lcmd:   sqlite3_
34fb0 64 62 5f 63 6f 6e 66 69 67 20 44 42 20 53 45 54  db_config DB SET
34fc0 54 49 4e 47 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  TING VALUE.**.**
34fd0 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   Invoke sqlite3_
34fe0 64 62 5f 63 6f 6e 66 69 67 28 29 20 66 6f 72 20  db_config() for 
34ff0 6f 6e 65 20 6f 66 20 74 68 65 20 73 65 74 74 69  one of the setti
35000 6e 67 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74  ng values..*/.st
35010 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
35020 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c 69  TCLAPI test_sqli
35030 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 0a 20  te3_db_config(. 
35040 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
35050 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
35060 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
35070 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
35080 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
35090 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
350a0 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
350b0 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
350c0 20 20 20 69 6e 74 20 65 56 61 6c 3b 0a 20 20 7d     int eVal;.  }
350d0 20 61 53 65 74 74 69 6e 67 5b 5d 20 3d 20 7b 0a   aSetting[] = {.
350e0 20 20 20 20 7b 20 22 46 4b 45 59 22 2c 20 20 20      { "FKEY",   
350f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
35100 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
35110 4c 45 5f 46 4b 45 59 20 7d 2c 0a 20 20 20 20 7b  LE_FKEY },.    {
35120 20 22 54 52 49 47 47 45 52 22 2c 20 20 20 20 20   "TRIGGER",     
35130 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42         SQLITE_DB
35140 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
35150 49 47 47 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22  IGGER },.    { "
35160 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 22 2c  FTS3_TOKENIZER",
35170 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f       SQLITE_DBCO
35180 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33  NFIG_ENABLE_FTS3
35190 5f 54 4f 4b 45 4e 49 5a 45 52 20 7d 2c 0a 20 20  _TOKENIZER },.  
351a0 20 20 7b 20 22 4c 4f 41 44 5f 45 58 54 45 4e 53    { "LOAD_EXTENS
351b0 49 4f 4e 22 2c 20 20 20 20 20 53 51 4c 49 54 45  ION",     SQLITE
351c0 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45  _DBCONFIG_ENABLE
351d0 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20  _LOAD_EXTENSION 
351e0 7d 2c 0a 20 20 20 20 7b 20 22 4e 4f 5f 43 4b 50  },.    { "NO_CKP
351f0 54 5f 4f 4e 5f 43 4c 4f 53 45 22 2c 20 20 20 53  T_ON_CLOSE",   S
35200 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4e  QLITE_DBCONFIG_N
35210 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 20  O_CKPT_ON_CLOSE 
35220 7d 2c 0a 20 20 20 20 7b 20 22 51 50 53 47 22 2c  },.    { "QPSG",
35230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
35240 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
35250 4e 41 42 4c 45 5f 51 50 53 47 20 7d 2c 0a 20 20  NABLE_QPSG },.  
35260 20 20 7b 20 22 54 52 49 47 47 45 52 5f 45 51 50    { "TRIGGER_EQP
35270 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
35280 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45  _DBCONFIG_TRIGGE
35290 52 5f 45 51 50 20 7d 2c 0a 20 20 20 20 7b 20 22  R_EQP },.    { "
352a0 52 45 53 45 54 5f 44 42 22 2c 20 20 20 20 20 20  RESET_DB",      
352b0 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f       SQLITE_DBCO
352c0 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54 41 42  NFIG_RESET_DATAB
352d0 41 53 45 20 7d 2c 0a 20 20 20 20 7b 20 22 44 45  ASE },.    { "DE
352e0 46 45 4e 53 49 56 45 22 2c 20 20 20 20 20 20 20  FENSIVE",       
352f0 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46     SQLITE_DBCONF
35300 49 47 5f 44 45 46 45 4e 53 49 56 45 20 7d 2c 0a  IG_DEFENSIVE },.
35310 20 20 20 20 7b 20 22 57 52 49 54 41 42 4c 45 5f      { "WRITABLE_
35320 53 43 48 45 4d 41 22 2c 20 20 20 20 53 51 4c 49  SCHEMA",    SQLI
35330 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49 54  TE_DBCONFIG_WRIT
35340 41 42 4c 45 5f 53 43 48 45 4d 41 20 7d 2c 0a 20  ABLE_SCHEMA },. 
35350 20 20 20 7b 20 22 4c 45 47 41 43 59 5f 41 4c 54     { "LEGACY_ALT
35360 45 52 5f 54 41 42 4c 45 22 2c 20 53 51 4c 49 54  ER_TABLE", SQLIT
35370 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 45 47 41 43  E_DBCONFIG_LEGAC
35380 59 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 7d 2c  Y_ALTER_TABLE },
35390 0a 20 20 20 20 7b 20 22 44 51 53 5f 44 4d 4c 22  .    { "DQS_DML"
353a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ,            SQL
353b0 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51 53  ITE_DBCONFIG_DQS
353c0 5f 44 4d 4c 20 7d 2c 0a 20 20 20 20 7b 20 22 44  _DML },.    { "D
353d0 51 53 5f 44 44 4c 22 2c 20 20 20 20 20 20 20 20  QS_DDL",        
353e0 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
353f0 46 49 47 5f 44 51 53 5f 44 44 4c 20 7d 2c 0a 20  FIG_DQS_DDL },. 
35400 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   };.  int i;.  i
35410 6e 74 20 76 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt v;.  const ch
35420 61 72 20 2a 7a 53 65 74 74 69 6e 67 3b 0a 20 20  ar *zSetting;.  
35430 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20  sqlite3 *db;..  
35440 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
35450 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
35460 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
35470 62 6a 76 2c 20 22 44 42 20 53 45 54 54 49 4e 47  bjv, "DB SETTING
35480 20 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 72 65   VALUE");.    re
35490 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
354a0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
354b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
354c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
354d0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
354e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
354f0 20 20 7a 53 65 74 74 69 6e 67 20 3d 20 54 63 6c    zSetting = Tcl
35500 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
35510 32 5d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  2]);.  if( sqlit
35520 65 33 5f 73 74 72 67 6c 6f 62 28 22 53 51 4c 49  e3_strglob("SQLI
35530 54 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29  TE_*", zSetting)
35540 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b  ==0 ) zSetting +
35550 3d 20 37 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 7;.  if( sqlit
35560 65 33 5f 73 74 72 67 6c 6f 62 28 22 44 42 43 4f  e3_strglob("DBCO
35570 4e 46 49 47 5f 2a 22 2c 20 7a 53 65 74 74 69 6e  NFIG_*", zSettin
35580 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67  g)==0 ) zSetting
35590 20 2b 3d 20 39 3b 0a 20 20 69 66 28 20 73 71 6c   += 9;.  if( sql
355a0 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 45 4e  ite3_strglob("EN
355b0 41 42 4c 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e  ABLE_*", zSettin
355c0 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67  g)==0 ) zSetting
355d0 20 2b 3d 20 37 3b 0a 20 20 66 6f 72 28 69 3d 30   += 7;.  for(i=0
355e0 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 53  ; i<ArraySize(aS
355f0 65 74 74 69 6e 67 29 3b 20 69 2b 2b 29 7b 0a 20  etting); i++){. 
35600 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 53     if( strcmp(zS
35610 65 74 74 69 6e 67 2c 20 61 53 65 74 74 69 6e 67  etting, aSetting
35620 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20  [i].zName)==0 ) 
35630 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28  break;.  }.  if(
35640 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 53   i>=ArraySize(aS
35650 65 74 74 69 6e 67 29 20 29 7b 0a 20 20 20 20 54  etting) ){.    T
35660 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
35670 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 54 63  interp,.      Tc
35680 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
35690 75 6e 6b 6e 6f 77 6e 20 73 71 6c 69 74 65 33 5f  unknown sqlite3_
356a0 64 62 5f 63 6f 6e 66 69 67 20 73 65 74 74 69 6e  db_config settin
356b0 67 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65  g", -1));.    re
356c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
356d0 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
356e0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
356f0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 29  rp, objv[3], &v)
35700 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
35710 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64  ROR;.  sqlite3_d
35720 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 61 53 65  b_config(db, aSe
35730 74 74 69 6e 67 5b 69 5d 2e 65 56 61 6c 2c 20 76  tting[i].eVal, v
35740 2c 20 26 76 29 3b 0a 20 20 54 63 6c 5f 53 65 74  , &v);.  Tcl_Set
35750 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
35760 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
35770 76 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  v));.  return TC
35780 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  L_OK;.}../*.** C
35790 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20 6f  hange the name o
357a0 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  f the main datab
357b0 61 73 65 20 73 63 68 65 6d 61 20 66 72 6f 6d 20  ase schema from 
357c0 22 6d 61 69 6e 22 20 74 6f 20 22 69 63 65 63 75  "main" to "icecu
357d0 62 65 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  be"..*/.static i
357e0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
357f0 20 74 65 73 74 5f 64 62 63 6f 6e 66 69 67 5f 6d   test_dbconfig_m
35800 61 69 6e 64 62 6e 61 6d 65 5f 69 63 65 63 75 62  aindbname_icecub
35810 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
35820 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
35830 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
35840 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
35850 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
35860 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ].){.  int rc;. 
35870 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
35880 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 44 62  extern int getDb
35890 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65  Pointer(Tcl_Inte
358a0 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  rp*, const char*
358b0 2c 20 73 71 6c 69 74 65 33 2a 2a 29 3b 0a 20 20  , sqlite3**);.  
358c0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
358d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
358e0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
358f0 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
35900 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
35910 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
35920 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
35930 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
35940 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
35950 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
35960 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63 20  L_ERROR;.    rc 
35970 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  = sqlite3_db_con
35980 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
35990 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41  BCONFIG_MAINDBNA
359a0 4d 45 2c 20 22 69 63 65 63 75 62 65 22 29 3b 0a  ME, "icecube");.
359b0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
359c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
359d0 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
359e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
359f0 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  OK;.  }.}../*.**
35a00 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
35a10 6d 6d 61 70 5f 77 61 72 6d 20 44 42 20 44 42 4e  mmap_warm DB DBN
35a20 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  AME.*/.static in
35a30 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
35a40 74 65 73 74 5f 6d 6d 61 70 5f 77 61 72 6d 28 0a  test_mmap_warm(.
35a50 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
35a60 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
35a70 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
35a80 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
35a90 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
35aa0 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 67  {.  extern int g
35ab0 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f  etDbPointer(Tcl_
35ac0 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74 20 63  Interp*, const c
35ad0 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a 2a 29  har*, sqlite3**)
35ae0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
35af0 71 6c 69 74 65 33 5f 6d 6d 61 70 5f 77 61 72 6d  qlite3_mmap_warm
35b00 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
35b10 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 20 20  nst char *);..  
35b20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
35b30 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
35b40 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
35b50 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
35b60 22 44 42 20 3f 44 42 4e 41 4d 45 3f 22 29 3b 0a  "DB ?DBNAME?");.
35b70 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
35b80 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
35b90 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 73     int rc;.    s
35ba0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20  qlite3 *db;.    
35bb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20  const char *zDb 
35bc0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 67 65 74  = 0;.    if( get
35bd0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
35be0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
35bf0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
35c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
35c10 52 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63 3d  R;.    if( objc=
35c20 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 62 20  =3 ){.      zDb 
35c30 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
35c40 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a  objv[2]);.    }.
35c50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
35c60 5f 6d 6d 61 70 5f 77 61 72 6d 28 64 62 2c 20 7a  _mmap_warm(db, z
35c70 44 62 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  Db);.    Tcl_Set
35c80 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
35c90 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
35ca0 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  bj(sqlite3ErrNam
35cb0 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20  e(rc), -1));.   
35cc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
35cd0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61    }.}../*.** Usa
35ce0 67 65 3a 20 20 64 65 63 6f 64 65 5f 68 65 78 64  ge:  decode_hexd
35cf0 62 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 45 78 61  b TEXT.**.** Exa
35d00 6d 70 6c 65 3a 20 20 20 64 62 20 64 65 73 65 72  mple:   db deser
35d10 69 61 6c 69 7a 65 20 5b 64 65 63 6f 64 65 5f 68  ialize [decode_h
35d20 65 78 64 62 20 24 6f 75 74 70 75 74 5f 6f 66 5f  exdb $output_of_
35d30 64 62 74 6f 74 78 74 5d 0a 2a 2a 0a 2a 2a 20 54  dbtotxt].**.** T
35d40 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
35d50 72 6e 73 20 61 20 62 79 74 65 2d 61 72 72 61 79  rns a byte-array
35d60 20 66 6f 72 20 61 6e 20 53 51 4c 69 74 65 20 64   for an SQLite d
35d70 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68 61  atabase file tha
35d80 74 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 72 75 63  t.** is construc
35d90 74 65 64 20 66 72 6f 6d 20 61 20 74 65 78 74 20  ted from a text 
35da0 69 6e 70 75 74 20 77 68 69 63 68 20 69 73 20 74  input which is t
35db0 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68 65  he output of the
35dc0 20 22 64 62 74 6f 74 78 74 22 0a 2a 2a 20 75 74   "dbtotxt".** ut
35dd0 69 6c 69 74 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ility..*/.static
35de0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
35df0 50 49 20 74 65 73 74 5f 64 65 63 6f 64 65 5f 68  PI test_decode_h
35e00 65 78 64 62 28 0a 20 20 76 6f 69 64 20 2a 20 63  exdb(.  void * c
35e10 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
35e20 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
35e30 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
35e40 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
35e50 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  jv[].){.  const 
35e60 63 68 61 72 20 2a 7a 49 6e 20 3d 20 30 3b 0a 20  char *zIn = 0;. 
35e70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
35e80 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  a = 0;.  int n =
35e90 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e 6f   0;.  int lineno
35ea0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 69   = 0;.  int i, i
35eb0 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 4f 66 66  Next;.  int iOff
35ec0 73 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a  set = 0;.  int j
35ed0 2c 20 6b 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  , k;.  int rc;. 
35ee0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78 5b   unsigned int x[
35ef0 31 36 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  16];.  if( objc!
35f00 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
35f10 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
35f20 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 48 45 58  p, 1, objv, "HEX
35f30 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
35f40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
35f50 20 20 7a 49 6e 20 3d 20 54 63 6c 5f 47 65 74 53    zIn = Tcl_GetS
35f60 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a  tring(objv[1]);.
35f70 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b 69    for(i=0; zIn[i
35f80 5d 3b 20 69 3d 69 4e 65 78 74 29 7b 0a 20 20 20  ]; i=iNext){.   
35f90 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20 66   lineno++;.    f
35fa0 6f 72 28 69 4e 65 78 74 3d 69 3b 20 7a 49 6e 5b  or(iNext=i; zIn[
35fb0 69 4e 65 78 74 5d 20 26 26 20 7a 49 6e 5b 69 4e  iNext] && zIn[iN
35fc0 65 78 74 5d 21 3d 27 5c 6e 27 3b 20 69 4e 65 78  ext]!='\n'; iNex
35fd0 74 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 7a  t++){}.    if( z
35fe0 49 6e 5b 69 4e 65 78 74 5d 3d 3d 27 5c 6e 27 20  In[iNext]=='\n' 
35ff0 29 20 69 4e 65 78 74 2b 2b 3b 0a 20 20 20 20 77  ) iNext++;.    w
36000 68 69 6c 65 28 20 7a 49 6e 5b 69 5d 3d 3d 27 20  hile( zIn[i]==' 
36010 27 20 7c 7c 20 7a 49 6e 5b 69 5d 3d 3d 27 5c 74  ' || zIn[i]=='\t
36020 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20  ' ){ i++; }.    
36030 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
36040 20 20 69 6e 74 20 70 67 73 7a 3b 0a 20 20 20 20    int pgsz;.    
36050 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a 49    rc = sscanf(zI
36060 6e 2b 69 2c 20 22 7c 20 73 69 7a 65 20 25 64 20  n+i, "| size %d 
36070 70 61 67 65 73 69 7a 65 20 25 64 22 2c 20 26 6e  pagesize %d", &n
36080 2c 20 26 70 67 73 7a 29 3b 0a 20 20 20 20 20 20  , &pgsz);.      
36090 69 66 28 20 72 63 21 3d 32 20 29 20 63 6f 6e 74  if( rc!=2 ) cont
360a0 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
360b0 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73 7a  pgsz<512 || pgsz
360c0 3e 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a 26  >65536 || (pgsz&
360d0 28 70 67 73 7a 2d 31 29 29 21 3d 30 20 29 7b 0a  (pgsz-1))!=0 ){.
360e0 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65          Tcl_Appe
360f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
36100 20 22 62 61 64 20 27 70 61 67 65 73 69 7a 65 27   "bad 'pagesize'
36110 20 66 69 65 6c 64 22 2c 20 28 76 6f 69 64 2a 29   field", (void*)
36120 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  0);.        retu
36130 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
36140 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d 20      }.      n = 
36150 28 6e 2b 70 67 73 7a 2d 31 29 26 7e 28 70 67 73  (n+pgsz-1)&~(pgs
36160 7a 2d 31 29 3b 20 20 2f 2a 20 52 6f 75 6e 64 20  z-1);  /* Round 
36170 6e 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78 74  n up to the next
36180 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 70 67 73   multiple of pgs
36190 7a 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 6e  z */.      if( n
361a0 3c 35 31 32 20 29 7b 0a 20 20 20 20 20 20 20 20  <512 ){.        
361b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
361c0 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 27 73  (interp, "bad 's
361d0 69 7a 65 27 20 66 69 65 6c 64 22 2c 20 28 76 6f  ize' field", (vo
361e0 69 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 20 20  id*)0);.        
361f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
36200 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
36210 61 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b  a = malloc( n );
36220 0a 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20  .      if( a==0 
36230 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41  ){.        Tcl_A
36240 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
36250 72 70 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  rp, "out of memo
36260 72 79 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a  ry", (void*)0);.
36270 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 54          return T
36280 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
36290 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 61  }.      memset(a
362a0 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 20 20 63  , 0, n);.      c
362b0 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
362c0 20 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a     rc = sscanf(z
362d0 49 6e 2b 69 2c 20 22 7c 20 70 61 67 65 20 25 64  In+i, "| page %d
362e0 20 6f 66 66 73 65 74 20 25 64 22 2c 20 26 6a 2c   offset %d", &j,
362f0 20 26 6b 29 3b 0a 20 20 20 20 69 66 28 20 72 63   &k);.    if( rc
36300 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 4f 66  ==2 ){.      iOf
36310 66 73 65 74 20 3d 20 6b 3b 0a 20 20 20 20 20 20  fset = k;.      
36320 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
36330 20 20 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28      rc = sscanf(
36340 7a 49 6e 2b 69 2c 22 7c 20 25 64 3a 20 25 78 20  zIn+i,"| %d: %x 
36350 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
36360 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78  x %x %x %x %x %x
36370 20 25 78 20 25 78 20 25 78 20 25 78 22 2c 0a 20   %x %x %x %x",. 
36380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
36390 6a 2c 20 26 78 5b 30 5d 2c 20 26 78 5b 31 5d 2c  j, &x[0], &x[1],
363a0 20 26 78 5b 32 5d 2c 20 26 78 5b 33 5d 2c 20 26   &x[2], &x[3], &
363b0 78 5b 34 5d 2c 20 26 78 5b 35 5d 2c 20 26 78 5b  x[4], &x[5], &x[
363c0 36 5d 2c 20 26 78 5b 37 5d 2c 0a 20 20 20 20 20  6], &x[7],.     
363d0 20 20 20 20 20 20 20 20 20 20 20 26 78 5b 38 5d             &x[8]
363e0 2c 20 26 78 5b 39 5d 2c 20 26 78 5b 31 30 5d 2c  , &x[9], &x[10],
363f0 20 26 78 5b 31 31 5d 2c 20 26 78 5b 31 32 5d 2c   &x[11], &x[12],
36400 20 26 78 5b 31 33 5d 2c 20 26 78 5b 31 34 5d 2c   &x[13], &x[14],
36410 20 26 78 5b 31 35 5d 29 3b 0a 20 20 20 20 69 66   &x[15]);.    if
36420 28 20 72 63 3d 3d 31 37 20 29 7b 0a 20 20 20 20  ( rc==17 ){.    
36430 20 20 6b 20 3d 20 69 4f 66 66 73 65 74 2b 6a 3b    k = iOffset+j;
36440 0a 20 20 20 20 20 20 69 66 28 20 6b 2b 31 36 3c  .      if( k+16<
36450 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =n ){.        in
36460 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  t ii;.        fo
36470 72 28 69 69 3d 30 3b 20 69 69 3c 31 36 3b 20 69  r(ii=0; ii<16; i
36480 69 2b 2b 29 20 61 5b 6b 2b 69 69 5d 20 3d 20 78  i++) a[k+ii] = x
36490 5b 69 69 5d 26 30 78 66 66 3b 0a 20 20 20 20 20  [ii]&0xff;.     
364a0 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75   }.      continu
364b0 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54  e;.    }.  }.  T
364c0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
364d0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
364e0 79 74 65 41 72 72 61 79 4f 62 6a 28 61 2c 20 6e  yteArrayObj(a, n
364f0 29 29 3b 0a 20 20 66 72 65 65 28 61 29 3b 0a 20  ));.  free(a);. 
36500 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
36510 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  }.../*.** Regist
36520 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74 68  er commands with
36530 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   the TCL interpr
36540 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71 6c  eter..*/.int Sql
36550 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54 63  itetest1_Init(Tc
36560 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
36570 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
36580 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
36590 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
365a0 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64  nt sqlite3_found
365b0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
365c0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e 74   int sqlite3_int
365d0 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20 20  errupt_count;.  
365e0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
365f0 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75  e3_open_file_cou
36600 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
36610 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f   sqlite3_sort_co
36620 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
36630 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e  t sqlite3_curren
36640 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51 4c 49  t_time;.#if SQLI
36650 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64 65  TE_OS_UNIX && de
36660 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
36670 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   && SQLITE_ENABL
36680 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a  E_LOCKING_STYLE.
36690 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
366a0 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d 3b  ite3_hostid_num;
366b0 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72 6e  .#endif.  extern
366c0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61 78   int sqlite3_max
366d0 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78 74  _blobsize;.  ext
366e0 65 72 6e 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  ern int SQLITE_T
366f0 43 4c 41 50 49 20 73 71 6c 69 74 65 33 42 74 72  CLAPI sqlite3Btr
36700 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65 70  eeSharedCacheRep
36710 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20  ort(void*,.     
36720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36740 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a       Tcl_Interp*
36750 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e  ,int,Tcl_Obj*CON
36760 53 54 2a 29 3b 0a 20 20 73 74 61 74 69 63 20 69  ST*);.  static i
36770 6e 74 20 69 5a 65 72 6f 20 3d 20 30 3b 0a 20 20  nt iZero = 0;.  
36780 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b 0a  static struct {.
36790 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
367a0 3b 0a 20 20 20 20 20 54 63 6c 5f 43 6d 64 50 72  ;.     Tcl_CmdPr
367b0 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20 61  oc *xProc;.  } a
367c0 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  Cmd[] = {.     {
367d0 20 22 64 62 5f 65 6e 74 65 72 22 2c 20 20 20 20   "db_enter",    
367e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
367f0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36800 64 62 5f 65 6e 74 65 72 20 20 20 20 20 20 20 20  db_enter        
36810 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
36820 20 22 64 62 5f 6c 65 61 76 65 22 2c 20 20 20 20   "db_leave",    
36830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36840 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36850 64 62 5f 6c 65 61 76 65 20 20 20 20 20 20 20 20  db_leave        
36860 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
36870 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
36880 66 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  f_int",         
36890 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
368a0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
368b0 69 6e 74 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  int    },.     {
368c0 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
368d0 66 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20  f_int64",       
368e0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
368f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
36900 69 6e 74 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b  int64  },.     {
36910 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
36920 66 5f 6c 6f 6e 67 22 2c 20 20 20 20 20 20 20 20  f_long",        
36930 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36940 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
36950 6c 6f 6e 67 20 20 20 7d 2c 0a 20 20 20 20 20 7b  long   },.     {
36960 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
36970 66 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20 20  f_str",         
36980 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36990 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
369a0 73 74 72 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  str    },.     {
369b0 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e   "sqlite3_snprin
369c0 74 66 5f 73 74 72 22 2c 20 20 20 20 20 20 20 20  tf_str",        
369d0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
369e0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
369f0 5f 73 74 72 20 20 20 7d 2c 0a 20 20 20 20 20 7b  _str   },.     {
36a00 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
36a10 66 5f 73 74 72 6f 6e 6c 79 22 2c 20 20 20 20 20  f_stronly",     
36a20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36a30 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
36a40 73 74 72 6f 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b  stronly},.     {
36a50 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
36a60 66 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  f_double",      
36a70 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36a80 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
36a90 64 6f 75 62 6c 65 20 7d 2c 0a 20 20 20 20 20 7b  double },.     {
36aa0 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
36ab0 66 5f 73 63 61 6c 65 64 22 2c 20 20 20 20 20 20  f_scaled",      
36ac0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36ad0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
36ae0 73 63 61 6c 65 64 20 7d 2c 0a 20 20 20 20 20 7b  scaled },.     {
36af0 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
36b00 66 5f 68 65 78 64 6f 75 62 6c 65 22 2c 20 20 20  f_hexdouble",   
36b10 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
36b20 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
36b30 78 64 6f 75 62 6c 65 7d 2c 0a 20 20 20 20 20 7b  xdouble},.     {
36b40 20 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74   "sqlite3_mprint
36b50 66 5f 7a 5f 74 65 73 74 22 2c 20 20 20 20 20 20  f_z_test",      
36b60 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36b70 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 20 20  test_mprintf_z  
36b80 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
36b90 22 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66  "sqlite3_mprintf
36ba0 5f 6e 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20  _n_test",       
36bb0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
36bc0 65 73 74 5f 6d 70 72 69 6e 74 66 5f 6e 20 20 20  est_mprintf_n   
36bd0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
36be0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
36bf0 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
36c00 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
36c10 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 20  st_snprintf_int 
36c20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
36c30 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
36c40 72 74 5f 72 6f 77 69 64 22 2c 20 20 20 20 20 28  rt_rowid",     (
36c50 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
36c60 74 5f 6c 61 73 74 5f 72 6f 77 69 64 20 20 20 20  t_last_rowid    
36c70 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
36c80 6c 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74  lite3_exec_print
36c90 66 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  f",           (T
36ca0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
36cb0 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 20 20  _exec_printf    
36cc0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
36cd0 69 74 65 33 5f 65 78 65 63 5f 68 65 78 22 2c 20  ite3_exec_hex", 
36ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
36cf0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
36d00 65 78 65 63 5f 68 65 78 20 20 20 20 20 20 20 20  exec_hex        
36d10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
36d20 74 65 33 5f 65 78 65 63 22 2c 20 20 20 20 20 20  te3_exec",      
36d30 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
36d40 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65  _CmdProc*)test_e
36d50 78 65 63 20 20 20 20 20 20 20 20 20 20 20 20 20  xec             
36d60 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
36d70 65 33 5f 65 78 65 63 5f 6e 72 22 2c 20 20 20 20  e3_exec_nr",    
36d80 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
36d90 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78  CmdProc*)test_ex
36da0 65 63 5f 6e 72 20 20 20 20 20 20 20 20 20 20 7d  ec_nr          }
36db0 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
36dc0 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a  _OMIT_GET_TABLE.
36dd0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36de0 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
36df0 22 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ",      (Tcl_Cmd
36e00 50 72 6f 63 2a 29 74 65 73 74 5f 67 65 74 5f 74  Proc*)test_get_t
36e10 61 62 6c 65 5f 70 72 69 6e 74 66 20 7d 2c 0a 23  able_printf },.#
36e20 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
36e30 6c 69 74 65 33 5f 63 6c 6f 73 65 22 2c 20 20 20  lite3_close",   
36e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
36e50 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
36e60 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 20 20 20  te_test_close   
36e70 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
36e80 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 22 2c 20  ite3_close_v2", 
36e90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
36ea0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
36eb0 65 5f 74 65 73 74 5f 63 6c 6f 73 65 5f 76 32 20  e_test_close_v2 
36ec0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
36ed0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
36ee0 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63 6c  ion",       (Tcl
36ef0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63  _CmdProc*)test_c
36f00 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20  reate_function  
36f10 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
36f20 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  e3_create_aggreg
36f30 61 74 65 22 2c 20 20 20 20 20 20 28 54 63 6c 5f  ate",      (Tcl_
36f40 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 63 72  CmdProc*)test_cr
36f50 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 20 7d  eate_aggregate }
36f60 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
36f70 5f 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66  _register_test_f
36f80 75 6e 63 74 69 6f 6e 22 2c 20 28 54 63 6c 5f 43  unction", (Tcl_C
36f90 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 67  mdProc*)test_reg
36fa0 69 73 74 65 72 5f 66 75 6e 63 20 20 20 20 7d 2c  ister_func    },
36fb0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
36fc0 61 62 6f 72 74 22 2c 20 20 20 20 20 20 20 20 20  abort",         
36fd0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
36fe0 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 61 62  dProc*)sqlite_ab
36ff0 6f 72 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ort          },.
37000 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 62       { "sqlite_b
37010 69 6e 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  ind",           
37020 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
37030 50 72 6f 63 2a 29 74 65 73 74 5f 62 69 6e 64 20  Proc*)test_bind 
37040 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
37050 20 20 20 20 7b 20 22 62 72 65 61 6b 70 6f 69 6e      { "breakpoin
37060 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
37070 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
37080 72 6f 63 2a 29 74 65 73 74 5f 62 72 65 61 6b 70  roc*)test_breakp
37090 6f 69 6e 74 20 20 20 20 20 20 20 7d 2c 0a 20 20  oint       },.  
370a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6b 65     { "sqlite3_ke
370b0 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
370c0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
370d0 6f 63 2a 29 74 65 73 74 5f 6b 65 79 20 20 20 20  oc*)test_key    
370e0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
370f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6b    { "sqlite3_rek
37100 65 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ey",            
37110 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
37120 63 2a 29 74 65 73 74 5f 72 65 6b 65 79 20 20 20  c*)test_rekey   
37130 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
37140 20 7b 20 22 73 71 6c 69 74 65 5f 73 65 74 5f 6d   { "sqlite_set_m
37150 61 67 69 63 22 2c 20 20 20 20 20 20 20 20 20 20  agic",          
37160 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
37170 2a 29 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67  *)sqlite_set_mag
37180 69 63 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  ic      },.     
37190 7b 20 22 73 71 6c 69 74 65 33 5f 69 6e 74 65 72  { "sqlite3_inter
371a0 72 75 70 74 22 2c 20 20 20 20 20 20 20 20 20 20  rupt",          
371b0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
371c0 29 74 65 73 74 5f 69 6e 74 65 72 72 75 70 74 20  )test_interrupt 
371d0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
371e0 20 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f   "sqlite_delete_
371f0 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
37200 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
37210 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 20  delete_function 
37220 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
37230 22 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63  "sqlite_delete_c
37240 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20 20 20 20 20  ollation",      
37250 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64   (Tcl_CmdProc*)d
37260 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20  elete_collation 
37270 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
37280 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
37290 63 6f 6d 6d 69 74 22 2c 20 20 20 20 20 20 20 20  commit",        
372a0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 67 65  (Tcl_CmdProc*)ge
372b0 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 20 20 20  t_autocommit    
372c0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
372d0 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
372e0 6f 75 74 22 2c 20 20 20 20 20 20 20 20 20 20 28  out",          (
372f0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
37300 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20 20  t_busy_timeout  
37310 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70 72     },.     { "pr
37320 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20 20  intf",          
37330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
37340 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
37350 5f 70 72 69 6e 74 66 20 20 20 20 20 20 20 20 20  _printf         
37360 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
37370 69 74 65 33 49 6f 54 72 61 63 65 22 2c 20 20 20  ite3IoTrace",   
37380 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
37390 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6f  CmdProc*)test_io
373a0 5f 74 72 61 63 65 20 20 20 20 20 20 20 20 20 7d  _trace         }
373b0 2c 0a 20 20 20 20 20 7b 20 22 63 6c 61 6e 67 5f  ,.     { "clang_
373c0 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73  sanitize_address
373d0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
373e0 6d 64 50 72 6f 63 2a 29 63 6c 61 6e 67 5f 73 61  mdProc*)clang_sa
373f0 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73 20 7d  nitize_address }
37400 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  ,.  };.  static 
37410 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68  struct {.     ch
37420 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ar *zName;.     
37430 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a  Tcl_ObjCmdProc *
37440 78 50 72 6f 63 3b 0a 20 20 20 20 20 76 6f 69 64  xProc;.     void
37450 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20   *clientData;.  
37460 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d 20 7b 0a  } aObjCmd[] = {.
37470 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37480 64 62 5f 63 6f 6e 66 69 67 22 2c 20 20 20 20 20  db_config",     
37490 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c          test_sql
374a0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 2c 20  ite3_db_config, 
374b0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 61 64  0 },.     { "bad
374c0 5f 62 65 68 61 76 69 6f 72 22 2c 20 20 20 20 20  _behavior",     
374d0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
374e0 74 5f 62 61 64 5f 62 65 68 61 76 69 6f 72 2c 20  t_bad_behavior, 
374f0 20 28 76 6f 69 64 2a 29 26 69 5a 65 72 6f 20 7d   (void*)&iZero }
37500 2c 0a 20 20 20 20 20 7b 20 22 72 65 67 69 73 74  ,.     { "regist
37510 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62 22 2c  er_dbstat_vtab",
37520 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 72            test_r
37530 65 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f 76  egister_dbstat_v
37540 74 61 62 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  tab  },.     { "
37550 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65 63 74 69  sqlite3_connecti
37560 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20 20 20 20  on_pointer",    
37570 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74  get_sqlite_point
37580 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  er, 0 },.     { 
37590 22 69 6e 74 61 72 72 61 79 5f 61 64 64 72 22 2c  "intarray_addr",
375a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
375b0 20 74 65 73 74 5f 69 6e 74 61 72 72 61 79 5f 61   test_intarray_a
375c0 64 64 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ddr, 0 },.     {
375d0 20 22 69 6e 74 36 34 61 72 72 61 79 5f 61 64 64   "int64array_add
375e0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
375f0 20 20 74 65 73 74 5f 69 6e 74 36 34 61 72 72 61    test_int64arra
37600 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20 20 20  y_addr, 0 },.   
37610 20 20 7b 20 22 64 6f 75 62 6c 65 61 72 72 61 79    { "doublearray
37620 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20 20 20  _addr",         
37630 20 20 20 20 20 74 65 73 74 5f 64 6f 75 62 6c 65       test_double
37640 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c  array_addr, 0 },
37650 0a 20 20 20 20 20 7b 20 22 74 65 78 74 61 72 72  .     { "textarr
37660 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20  ay_addr",       
37670 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 74 65           test_te
37680 78 74 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20  xtarray_addr, 0 
37690 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
376a0 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20 20 20  e3_bind_int",   
376b0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
376c0 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20 20 30  bind_int,      0
376d0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
376e0 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
376f0 62 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  b",         test
37700 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 2c 20  _bind_zeroblob, 
37710 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37720 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
37730 6f 62 36 34 22 2c 20 20 20 20 20 20 20 74 65 73  ob64",       tes
37740 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36  t_bind_zeroblob6
37750 34 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  4, 0 },.     { "
37760 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
37770 36 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  64",            
37780 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 2c  test_bind_int64,
37790 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
377a0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f  "sqlite3_bind_do
377b0 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  uble",          
377c0 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c   test_bind_doubl
377d0 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  e,   0 },.     {
377e0 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e   "sqlite3_bind_n
377f0 75 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  ull",           
37800 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c    test_bind_null
37810 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
37820 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
37830 74 65 78 74 22 2c 20 20 20 20 20 20 20 20 20 20  text",          
37840 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78     test_bind_tex
37850 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  t     ,0 },.    
37860 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
37870 5f 74 65 78 74 31 36 22 2c 20 20 20 20 20 20 20  _text16",       
37880 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65      test_bind_te
37890 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20 20  xt16   ,0 },.   
378a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
378b0 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20  d_blob",        
378c0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 62       test_bind_b
378d0 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  lob     ,0 },.  
378e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
378f0 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
37900 6e 74 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f  nt",  test_bind_
37910 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 2c  parameter_count,
37920 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
37930 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
37940 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73  ter_name",   tes
37950 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  t_bind_parameter
37960 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20 20 20  _name,  0},.    
37970 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
37980 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
37990 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61  ",  test_bind_pa
379a0 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c 20 30  rameter_index, 0
379b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
379c0 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
379d0 73 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  s",        test_
379e0 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c 20  clear_bindings, 
379f0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
37a00 74 65 33 5f 73 6c 65 65 70 22 2c 20 20 20 20 20  te3_sleep",     
37a10 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
37a20 5f 73 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  _sleep,         
37a30 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
37a40 69 74 65 33 5f 65 72 72 63 6f 64 65 22 2c 20 20  ite3_errcode",  
37a50 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
37a60 74 5f 65 72 72 63 6f 64 65 20 20 20 20 20 20 20  t_errcode       
37a70 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
37a80 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
37a90 72 72 63 6f 64 65 22 2c 20 20 20 20 20 20 74 65  rrcode",      te
37aa0 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 20 20 20  st_ex_errcode   
37ab0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
37ac0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 22 2c 20  qlite3_errmsg", 
37ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
37ae0 65 73 74 5f 65 72 72 6d 73 67 20 20 20 20 20 20  est_errmsg      
37af0 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
37b00 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
37b10 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37b20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 20 20 20  test_errmsg16   
37b30 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
37b40 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 22 2c 20  "sqlite3_open", 
37b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37b60 20 74 65 73 74 5f 6f 70 65 6e 20 20 20 20 20 20   test_open      
37b70 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
37b80 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36   "sqlite3_open16
37b90 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37ba0 20 20 74 65 73 74 5f 6f 70 65 6e 31 36 20 20 20    test_open16   
37bb0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
37bc0 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  { "sqlite3_open_
37bd0 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  v2",            
37be0 20 20 20 74 65 73 74 5f 6f 70 65 6e 5f 76 32 20     test_open_v2 
37bf0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
37c00 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6d 70   { "sqlite3_comp
37c10 6c 65 74 65 31 36 22 2c 20 20 20 20 20 20 20 20  lete16",        
37c20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70 6c 65 74      test_complet
37c30 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  e16    ,0 },.   
37c40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e 6f 72    { "sqlite3_nor
37c50 6d 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20  malize",        
37c60 20 20 20 20 20 74 65 73 74 5f 6e 6f 72 6d 61 6c       test_normal
37c70 69 7a 65 20 20 20 20 20 2c 30 20 7d 2c 0a 0a 20  ize     ,0 },.. 
37c80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 70      { "sqlite3_p
37c90 72 65 70 61 72 65 22 2c 20 20 20 20 20 20 20 20  repare",        
37ca0 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65 70         test_prep
37cb0 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  are       ,0 },.
37cc0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37cd0 70 72 65 70 61 72 65 31 36 22 2c 20 20 20 20 20  prepare16",     
37ce0 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72 65          test_pre
37cf0 70 61 72 65 31 36 20 20 20 20 20 2c 30 20 7d 2c  pare16     ,0 },
37d00 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37d10 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20 20 20  _prepare_v2",   
37d20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
37d30 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30 20 7d  epare_v2    ,0 }
37d40 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
37d50 33 5f 70 72 65 70 61 72 65 5f 76 33 22 2c 20 20  3_prepare_v3",  
37d60 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
37d70 72 65 70 61 72 65 5f 76 33 20 20 20 20 2c 30 20  repare_v3    ,0 
37d80 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
37d90 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  e3_prepare_tkt31
37da0 33 34 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  34",       test_
37db0 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 2c  prepare_tkt3134,
37dc0 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
37dd0 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f 76  ite3_prepare16_v
37de0 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  2",          tes
37df0 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 20  t_prepare16_v2  
37e00 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
37e10 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22 2c  lite3_finalize",
37e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
37e30 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20 20  st_finalize     
37e40 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
37e50 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
37e60 75 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  us",           t
37e70 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 20  est_stmt_status 
37e80 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
37e90 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c 20  sqlite3_reset", 
37ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37eb0 74 65 73 74 5f 72 65 73 65 74 20 20 20 20 20 20  test_reset      
37ec0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
37ed0 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64  "sqlite3_expired
37ee0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37ef0 20 74 65 73 74 5f 65 78 70 69 72 65 64 20 20 20   test_expired   
37f00 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
37f10 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66   "sqlite3_transf
37f20 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20  er_bindings",   
37f30 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f    test_transfer_
37f40 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20 20  bind ,0 },.     
37f50 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  { "sqlite3_chang
37f60 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  es",            
37f70 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73 20     test_changes 
37f80 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
37f90 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65 70   { "sqlite3_step
37fa0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37fb0 20 20 20 20 74 65 73 74 5f 73 74 65 70 20 20 20      test_step   
37fc0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
37fd0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 71 6c    { "sqlite3_sql
37fe0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
37ff0 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20 20 20       test_sql   
38000 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
38010 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
38020 70 61 6e 64 65 64 5f 73 71 6c 22 2c 20 20 20 20  panded_sql",    
38030 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f 73 71        test_ex_sq
38040 6c 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 23  l        ,0 },.#
38050 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
38060 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20  BLE_NORMALIZE.  
38070 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6e 6f     { "sqlite3_no
38080 72 6d 61 6c 69 7a 65 64 5f 73 71 6c 22 2c 20 20  rmalized_sql",  
38090 20 20 20 20 20 20 74 65 73 74 5f 6e 6f 72 6d 5f        test_norm_
380a0 73 71 6c 20 20 20 20 20 20 2c 30 20 7d 2c 0a 23  sql      ,0 },.#
380b0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
380c0 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22  lite3_next_stmt"
380d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
380e0 73 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20 20  st_next_stmt    
380f0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
38100 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64  qlite3_stmt_read
38110 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 20 20 74  only",         t
38120 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  est_stmt_readonl
38130 79 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  y ,0 },.     { "
38140 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 69 73 65  sqlite3_stmt_ise
38150 78 70 6c 61 69 6e 22 2c 20 20 20 20 20 20 20 20  xplain",        
38160 74 65 73 74 5f 73 74 6d 74 5f 69 73 65 78 70 6c  test_stmt_isexpl
38170 61 69 6e 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ain,0 },.     { 
38180 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75  "sqlite3_stmt_bu
38190 73 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sy",            
381a0 20 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 20   test_stmt_busy 
381b0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
381c0 20 22 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72   "uses_stmt_jour
381d0 6e 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  nal",           
381e0 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72    uses_stmt_jour
381f0 6e 61 6c 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20  nal ,0 },..     
38200 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  { "sqlite3_relea
38210 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20  se_memory",     
38220 20 20 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f     test_release_
38230 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c 0a  memory,     0},.
38240 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
38250 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
38260 79 22 2c 20 20 20 20 20 74 65 73 74 5f 64 62 5f  y",     test_db_
38270 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20  release_memory, 
38280 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
38290 69 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75  ite3_db_cacheflu
382a0 73 68 22 2c 20 20