/ Hex Artifact Content
Login

Artifact 7928f1eb530dac8da21dc7f1e18935988f1f0e3e2a2d99993b522c4fb201d71b:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 66 20 64  vdbeInt.h".#if d
0280: 65 66 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 53  efined(INCLUDE_S
0290: 51 4c 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20 20  QLITE_TCL_H).#  
02a0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 5f  include "sqlite_
02b0: 74 63 6c 2e 68 22 0a 23 65 6c 73 65 0a 23 20 20  tcl.h".#else.#  
02c0: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
02d0: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
02e0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
02f0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0300: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
0310: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73  copy of the firs
0320: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 71  t part of the Sq
0330: 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72 65  liteDb structure
0340: 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69 74   in .** tclsqlit
0350: 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69 74  e.c.  We need it
0360: 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74 68   here so that th
0370: 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  e get_sqlite_poi
0380: 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  nter routine.** 
0390: 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65 20  can extract the 
03a0: 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65 72  sqlite3* pointer
03b0: 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69 6e   from an existin
03c0: 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a 20  g Tcl SQLite.** 
03d0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
03e0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
03f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0400: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  };../*.** Conver
0410: 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65 64  t text generated
0420: 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f 6e   by the "%p" con
0430: 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 62  version format b
0440: 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f  ack into.** a po
0450: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
0460: 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49 6e   int testHexToIn
0470: 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28 20  t(int h){.  if( 
0480: 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27  h>='0' && h<='9'
0490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
04a0: 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20   - '0';.  }else 
04b0: 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68 3c  if( h>='a' && h<
04c0: 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75  ='f' ){.    retu
04d0: 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30 3b  rn h - 'a' + 10;
04e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
04f0: 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26 20  sert( h>='A' && 
0500: 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72 65  h<='F' );.    re
0510: 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20 31  turn h - 'A' + 1
0520: 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a 73  0;.  }.}.void *s
0530: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
0540: 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ptr(const char *
0550: 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  z){.  void *p;. 
0560: 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32   u64 v;.  u32 v2
0570: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30  ;.  if( z[0]=='0
0580: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29  ' && z[1]=='x' )
0590: 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  {.    z += 2;.  
05a0: 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  }.  v = 0;.  whi
05b0: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20  le( *z ){.    v 
05c0: 3d 20 28 76 3c 3c 34 29 20 2b 20 74 65 73 74 48  = (v<<4) + testH
05d0: 65 78 54 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20 20  exToInt(*z);.   
05e0: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   z++;.  }.  if( 
05f0: 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f  sizeof(p)==sizeo
0600: 66 28 76 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63  f(v) ){.    memc
0610: 70 79 28 26 70 2c 20 26 76 2c 20 73 69 7a 65 6f  py(&p, &v, sizeo
0620: 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f(p));.  }else{.
0630: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
0640: 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 32  of(p)==sizeof(v2
0650: 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28 75  ) );.    v2 = (u
0660: 33 32 29 76 3b 0a 20 20 20 20 6d 65 6d 63 70 79  32)v;.    memcpy
0670: 28 26 70 2c 20 26 76 32 2c 20 73 69 7a 65 6f 66  (&p, &v2, sizeof
0680: 28 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (p));.  }.  retu
0690: 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
06a0: 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 68  A TCL command th
06b0: 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  at returns the a
06c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 71  ddress of the sq
06d0: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 2a 2a  lite* pointer.**
06e0: 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 63   for an sqlite c
06f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 73 74 61 6e  onnection instan
0700: 63 65 2e 20 20 42 61 64 20 74 68 69 6e 67 73 20  ce.  Bad things 
0710: 68 61 70 70 65 6e 20 69 66 20 74 68 65 0a 2a 2a  happen if the.**
0720: 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 6e   input is not an
0730: 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69   sqlite connecti
0740: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
0750: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
0760: 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74  get_sqlite_point
0770: 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
0780: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
0790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
07a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
07b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
07c0: 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  [].){.  struct S
07d0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
07e0: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
07f0: 6f 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  o;.  char zBuf[1
0800: 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  00];.  if( objc!
0810: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
0820: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
0830: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 1, objv, "SQL
0840: 49 54 45 2d 43 4f 4e 4e 45 43 54 49 4f 4e 22 29  ITE-CONNECTION")
0850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
0860: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
0870: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
0880: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
0890: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
08a0: 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
08b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
08c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
08d0: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
08e0: 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  nd: ",.         
08f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
0900: 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
0910: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
0920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0930: 20 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c   p = (struct Sql
0940: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
0950: 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  bjClientData;.  
0960: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
0970: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
0980: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0990: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
09a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
09b0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
09c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
09d0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
09e0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
09f0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
0a00: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0a10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0a30: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0a40: 7b 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74  {.  struct Sqlit
0a50: 65 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d  eDb *p;.  Tcl_Cm
0a60: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
0a70: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
0a80: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
0a90: 7a 41 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  zA, &cmdInfo) ){
0aa0: 0a 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74  .    p = (struct
0ab0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
0ac0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
0ad0: 3b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 70 2d  ;.    *ppDb = p-
0ae0: 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >db;.  }else{.  
0af0: 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74    *ppDb = (sqlit
0b00: 65 33 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  e3*)sqlite3TestT
0b10: 65 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20  extToPtr(zA);.  
0b20: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
0b30: 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
0b40: 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 44 65  _OS_WIN./*.** De
0b50: 63 6f 64 65 20 61 20 57 69 6e 33 32 20 48 41 4e  code a Win32 HAN
0b60: 44 4c 45 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69  DLE object..*/.i
0b70: 6e 74 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c  nt getWin32Handl
0b80: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
0b90: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
0ba0: 20 2a 7a 41 2c 20 4c 50 48 41 4e 44 4c 45 20 70   *zA, LPHANDLE p
0bb0: 68 46 69 6c 65 29 7b 0a 20 20 2a 70 68 46 69 6c  hFile){.  *phFil
0bc0: 65 20 3d 20 28 48 41 4e 44 4c 45 29 73 71 6c 69  e = (HANDLE)sqli
0bd0: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
0be0: 28 7a 41 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (zA);.  return T
0bf0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
0c00: 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68  .extern const ch
0c10: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
0c20: 6d 65 28 69 6e 74 29 3b 0a 23 64 65 66 69 6e 65  me(int);.#define
0c30: 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c   t1ErrorName sql
0c40: 69 74 65 33 45 72 72 4e 61 6d 65 0a 0a 2f 2a 0a  ite3ErrName../*.
0c50: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71  ** Convert an sq
0c60: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f  lite3_stmt* into
0c70: 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54   an sqlite3*.  T
0c80: 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  his depends on t
0c90: 68 65 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20  he.** fact that 
0ca0: 74 68 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20  the sqlite3* is 
0cb0: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
0cc0: 69 6e 20 74 68 65 20 56 64 62 65 20 73 74 72 75  in the Vdbe stru
0cd0: 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cture..*/.#defin
0ce0: 65 20 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20  e StmtToDb(X)   
0cf0: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
0d00: 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e(X)../*.** Chec
0d10: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
0d20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
0d30: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
0d40: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
0d50: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0d60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0d70: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
0d80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0da0: 20 72 63 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   rc){.  if( sqli
0db0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
0dc0: 3d 3d 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ==0 && rc!=SQLIT
0dd0: 45 5f 4d 49 53 55 53 45 20 26 26 20 72 63 21 3d  E_MISUSE && rc!=
0de0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
0df0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e00: 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20 20 63  db)!=rc ){.    c
0e10: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
0e20: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
0e30: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
0e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
0e50: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
0e60: 66 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20  f), zBuf,.      
0e70: 20 22 65 72 72 6f 72 20 63 6f 64 65 20 25 73 20   "error code %s 
0e80: 28 25 64 29 20 64 6f 65 73 20 6e 6f 74 20 6d 61  (%d) does not ma
0e90: 74 63 68 20 73 71 6c 69 74 65 33 5f 65 72 72 63  tch sqlite3_errc
0ea0: 6f 64 65 20 25 73 20 28 25 64 29 22 2c 0a 20 20  ode %s (%d)",.  
0eb0: 20 20 20 20 20 74 31 45 72 72 6f 72 4e 61 6d 65       t1ErrorName
0ec0: 28 72 63 29 2c 20 72 63 2c 20 74 31 45 72 72 6f  (rc), rc, t1Erro
0ed0: 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29 3b 0a  rName(r2), r2);.
0ee0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0ef0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0f00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0f10: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0f20: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
0f30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0f50: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0f60: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
0f70: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
0f80: 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f 69 6e   int getStmtPoin
0f90: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
0fa0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
0fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
0fc0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
0fd0: 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a   **ppStmt.){.  *
0fe0: 70 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65  ppStmt = (sqlite
0ff0: 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65 33 54  3_stmt*)sqlite3T
1000: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 72  estTextToPtr(zAr
1010: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  g);.  return TCL
1020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
1030: 6e 65 72 61 74 65 20 61 20 74 65 78 74 20 72 65  nerate a text re
1040: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1050: 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 63  a pointer that c
1060: 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f 6f 64  an be understood
1070: 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74 44 62  .** by the getDb
1080: 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65 74 56  Pointer and getV
1090: 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65  mPointer routine
10a0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  s above..**.** T
10b0: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f  he problem is, o
10c0: 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20  n some machines 
10d0: 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79 6f 75  (Solaris) if you
10e0: 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77 69 74   do a printf wit
10f0: 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20 63 61  h.** "%p" you ca
1100: 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75 6e 64  nnot turn around
1110: 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e 66 20   and do a scanf 
1120: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 22 25  with the same "%
1130: 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f  p" and.** get yo
1140: 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e  ur pointer back.
1150: 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20 70 72    You have to pr
1160: 65 70 65 6e 64 20 61 20 22 30 78 22 20 62 65 66  epend a "0x" bef
1170: 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77  ore it will.** w
1180: 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65 61 73  ork.  Or at leas
1190: 74 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69  t that is what i
11a0: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
11b0: 20 28 64 72 68 29 2e 20 20 42 75 74 20 74 68 69   (drh).  But thi
11c0: 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20 76 61  s.** behavior va
11d0: 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e  ries from machin
11e0: 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54  e to machine.  T
11f0: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64  he solution used
1200: 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65   her is.** to te
1210: 73 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 69  st the string ri
1220: 67 68 74 20 61 66 74 65 72 20 69 74 20 69 73 20  ght after it is 
1230: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 65 65  generated to see
1240: 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a   if it can be.**
1250: 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79 20 73   understood by s
1260: 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74  canf, and if not
1270: 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69 6e 67  , try prepending
1280: 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65 65 20   an "0x" to see 
1290: 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c 70 73  if.** that helps
12a0: 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f  .  If nothing wo
12b0: 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65 72 72  rks, a fatal err
12c0: 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  or is generated.
12d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
12e0: 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
12f0: 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  r(Tcl_Interp *in
1300: 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50 74 72  terp, char *zPtr
1310: 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71  , void *p){.  sq
1320: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
1330: 30 30 2c 20 7a 50 74 72 2c 20 22 25 70 22 2c 20  00, zPtr, "%p", 
1340: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
1350: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1360: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
1370: 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 65  ne for sqlite3_e
1380: 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a 2a 2f  xec_printf()..*/
1390: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
13a0: 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69 64 20  _printf_cb(void 
13b0: 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67 63 2c  *pArg, int argc,
13c0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
13d0: 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54 63  ar **name){.  Tc
13e0: 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72 20 3d  l_DString *str =
13f0: 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a 29 70   (Tcl_DString*)p
1400: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  Arg;.  int i;.. 
1410: 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69 6e 67   if( Tcl_DString
1420: 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30 20 29  Length(str)==0 )
1430: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1440: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1450: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
1460: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c  pendElement(str,
1470: 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b   name[i] ? name[
1480: 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  i] : "NULL");.  
1490: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
14a0: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
14b0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
14c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
14d0: 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61 72 67  r, argv[i] ? arg
14e0: 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  v[i] : "NULL");.
14f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1500: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f  }../*.** The I/O
1510: 20 74 72 61 63 69 6e 67 20 63 61 6c 6c 62 61 63   tracing callbac
1520: 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  k..*/.#if !defin
1530: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
1540: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
1550: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
1560: 4f 54 52 41 43 45 29 0a 73 74 61 74 69 63 20 46  OTRACE).static F
1570: 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f 66 69 6c  ILE *iotrace_fil
1580: 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f  e = 0;.static vo
1590: 69 64 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c  id io_trace_call
15a0: 62 61 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  back(const char 
15b0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
15c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
15d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
15e0: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
15f0: 66 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 2c 20  f(iotrace_file, 
1600: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1610: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 66  va_end(ap);.  ff
1620: 6c 75 73 68 28 69 6f 74 72 61 63 65 5f 66 69 6c  lush(iotrace_fil
1630: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e);.}.#endif../*
1640: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f 5f 74  .** Usage:  io_t
1650: 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a  race FILENAME.**
1660: 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74 72 61  .** Turn I/O tra
1670: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  cing on or off. 
1680: 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20   If FILENAME is 
1690: 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72  not an empty str
16a0: 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72 61 63  ing,.** I/O trac
16b0: 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69 6e 67  ing begins going
16c0: 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45 2e 20   into FILENAME. 
16d0: 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20 61  If FILENAME is a
16e0: 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e  n empty.** strin
16f0: 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 69  g, I/O tracing i
1700: 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  s turned off..*/
1710: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1720: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69  TE_TCLAPI test_i
1730: 6f 5f 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20  o_trace(.  void 
1740: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1750: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1760: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1770: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1780: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1790: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
17a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
17b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
17c0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
17d0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
17e0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
17f0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1800: 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
1810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1820: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1830: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
1840: 43 45 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d  CE).  if( argc!=
1850: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1860: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1870: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1880: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1890: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
18a0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
18b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18d0: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18e0: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f  le ){.    if( io
18f0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f  trace_file!=stdo
1900: 75 74 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69  ut && iotrace_fi
1910: 6c 65 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20  le!=stderr ){.  
1920: 20 20 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61      fclose(iotra
1930: 63 65 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  ce_file);.    }.
1940: 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65      iotrace_file
1950: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1960: 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
1970: 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b  }.  if( argv[1][
1980: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  0] ){.    if( st
1990: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74  rcmp(argv[1],"st
19a0: 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  dout")==0 ){.   
19b0: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
19c0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
19d0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
19e0: 72 67 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29  rgv[1],"stderr")
19f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74  ==0 ){.      iot
1a00: 72 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65  race_file = stde
1a10: 72 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rr;.    }else{. 
1a20: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
1a30: 65 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31  e = fopen(argv[1
1a40: 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20  ], "w");.    }. 
1a50: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
1a60: 65 20 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c  e = io_trace_cal
1a70: 6c 62 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  lback;.  }.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1a90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1aa0: 65 3a 20 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69  e:  clang_saniti
1ab0: 7a 65 5f 61 64 64 72 65 73 73 20 0a 2a 2a 0a 2a  ze_address .**.*
1ac0: 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69  * Returns true i
1ad0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 77 61  f the program wa
1ae0: 73 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67  s compiled using
1af0: 20 63 6c 61 6e 67 20 77 69 74 68 20 74 68 65 20   clang with the 
1b00: 0a 2a 2a 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61  .** -fsanitize=a
1b10: 64 64 72 65 73 73 20 73 77 69 74 63 68 20 6f 6e  ddress switch on
1b20: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1b30: 65 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  e. False otherwi
1b40: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  se..**.** Also r
1b50: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1b60: 65 20 4f 4d 49 54 5f 4d 49 53 55 53 45 20 65 6e  e OMIT_MISUSE en
1b70: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1b80: 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74  le exists..*/.st
1b90: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1ba0: 54 43 4c 41 50 49 20 63 6c 61 6e 67 5f 73 61 6e  TCLAPI clang_san
1bb0: 69 74 69 7a 65 5f 61 64 64 72 65 73 73 28 0a 20  itize_address(. 
1bc0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
1bd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1be0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1bf0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1c00: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1c10: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1c20: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
1c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1c50: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
1c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
1c70: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
1c80: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  t */.){.  int re
1c90: 73 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e  s = 0;.#if defin
1ca0: 65 64 28 5f 5f 68 61 73 5f 66 65 61 74 75 72 65  ed(__has_feature
1cb0: 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f 66 65 61  ).# if __has_fea
1cc0: 74 75 72 65 28 61 64 64 72 65 73 73 5f 73 61 6e  ture(address_san
1cd0: 69 74 69 7a 65 72 29 0a 20 20 72 65 73 20 3d 20  itizer).  res = 
1ce0: 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  1;.# endif.#endi
1cf0: 66 0a 23 69 66 64 65 66 20 5f 5f 53 41 4e 49 54  f.#ifdef __SANIT
1d00: 49 5a 45 5f 41 44 44 52 45 53 53 5f 5f 0a 20 20  IZE_ADDRESS__.  
1d10: 72 65 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  res = 1;.#endif.
1d20: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
1d30: 67 65 74 65 6e 76 28 22 4f 4d 49 54 5f 4d 49 53  getenv("OMIT_MIS
1d40: 55 53 45 22 29 21 3d 30 20 29 20 72 65 73 20 3d  USE")!=0 ) res =
1d50: 20 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   1;.  Tcl_SetObj
1d60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73  cl_NewIntObj(res
1d80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1d90: 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20  _OK;.}.  ./*.** 
1da0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1db0: 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42 20  exec_printf  DB 
1dc0: 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a   FORMAT  STRING.
1dd0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
1de0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72   sqlite3_exec_pr
1df0: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
1e00: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
1e10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
1e20: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
1e30: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
1e40: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
1e50: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
1e60: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
1e70: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
1e80: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
1e90: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
1ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1eb0: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1ec0: 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20 76  exec_printf(.  v
1ed0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1ee0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ef0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1f00: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1f10: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1f20: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1f30: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
1f40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f60: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1f70: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
1f80: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
1f90: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1fa0: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
1fb0: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
1fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
1fd0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   0;.  char *zSql
1fe0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
1ff0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  ];.  if( argc!=4
2000: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2020: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2030: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2040: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2050: 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49  " DB FORMAT STRI
2060: 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  NG", 0);.    ret
2070: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2080: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2090: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
20a0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
20b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
20d0: 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20  t(&str);.  zSql 
20e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20f0: 66 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b  f(argv[2], argv[
2100: 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  3]);.  rc = sqli
2110: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2120: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
2130: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
2140: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2150: 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
2160: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2170: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
2180: 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41  d", rc);.  Tcl_A
2190: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
21a0: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  erp, zBuf);.  Tc
21b0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
21c0: 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49  interp, rc==SQLI
21d0: 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72  TE_OK ? Tcl_DStr
21e0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a  ingValue(&str) :
21f0: 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53   zErr);.  Tcl_DS
2200: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
2210: 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73 71  .  if( zErr ) sq
2220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
2230: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
2240: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
2250: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
2260: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2270: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2280: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
2290: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65   sqlite3_exec_he
22a0: 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a  x  DB  HEX.**.**
22b0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
22c0: 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61 20  te3_exec() on a 
22d0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6f  string that is o
22e0: 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e 73  btained by trans
22f0: 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69 6e  lating.** HEX in
2300: 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74 20  to ASCII.  Most 
2310: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 74  characters are t
2320: 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73 2e  ranslated as is.
2330: 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a 2a    %HH becomes.**
2340: 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65 72   a hex character
2350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2360: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2370: 73 74 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76  st_exec_hex(.  v
2380: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23a0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23b0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23c0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23d0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23e0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
23f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2400: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2410: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2420: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2430: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2440: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2450: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
2460: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
2470: 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a  , i, j;.  char *
2480: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zErr = 0;.  char
2490: 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a   *zHex;.  char z
24a0: 53 71 6c 5b 35 30 31 5d 3b 0a 20 20 63 68 61 72  Sql[501];.  char
24b0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
24c0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
24d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24e0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
24f0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2500: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2510: 0a 20 20 20 20 20 20 20 22 20 44 42 20 48 45 58  .       " DB HEX
2520: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2540: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2550: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2560: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2580: 7a 48 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  zHex = argv[2];.
2590: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 28    for(i=j=0; i<(
25a0: 73 69 7a 65 6f 66 28 7a 53 71 6c 29 2d 31 29 20  sizeof(zSql)-1) 
25b0: 26 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c  && zHex[j]; i++,
25c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   j++){.    if( z
25d0: 48 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a  Hex[j]=='%' && z
25e0: 48 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78  Hex[j+2] && zHex
25f0: 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a  [j+2] ){.      z
2600: 53 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65  Sql[i] = (testHe
2610: 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d  xToInt(zHex[j+1]
2620: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2630: 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b  oInt(zHex[j+2]);
2640: 0a 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20  .      j += 2;. 
2650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2660: 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a  zSql[i] = zHex[j
2670: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
2680: 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63  Sql[i] = 0;.  Tc
2690: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
26a0: 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  tr);.  rc = sqli
26b0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
26c0: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
26d0: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
26e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
26f0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
2700: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  , zBuf, "%d", rc
2710: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
2720: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
2730: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
2740: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2750: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
2760: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
2770: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
2780: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2790: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
27a0: 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f   zErr ) sqlite3_
27b0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66  free(zErr);.  if
27c0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
27d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
27e0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
27f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
2800: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2810: 2a 2a 20 55 73 61 67 65 3a 20 20 64 62 5f 65 6e  ** Usage:  db_en
2820: 74 65 72 20 44 42 0a 2a 2a 20 20 20 20 20 20 20  ter DB.**       
2830: 20 20 64 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a    db_leave DB.**
2840: 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c 65 61  .** Enter or lea
2850: 76 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ve the mutex on 
2860: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2870: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2880: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2890: 50 49 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76  PI db_enter(.  v
28a0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
28b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28c0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
28d0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
28e0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
28f0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2900: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2910: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2920: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2930: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2940: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2950: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2960: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2970: 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
2980: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
2990: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
29b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
29c0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
29d0: 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
29e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29f0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2a00: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2a10: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2a20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2a30: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OR;.  sqlite3_mu
2a40: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
2a50: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
2a60: 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  CL_OK;.}.static 
2a70: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2a80: 49 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  I db_leave(.  vo
2a90: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2aa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2ab0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2ac0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2ad0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2ae0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2af0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2b20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2b30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2b40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2b50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2b60: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
2b70: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
2b80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2b90: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2ba0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2bb0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2bc0: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2bd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2be0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2bf0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2c00: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2c10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c20: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
2c30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
2c40: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
2c50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2c60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2c70: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
2c80: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2c90: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2ca0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2cb0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2cd0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2ce0: 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _exec(.  void *N
2cf0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2d00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2d10: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2d20: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2d30: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2d40: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2d70: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2d80: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2d90: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2da0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2db0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2dc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
2dd0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
2de0: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2df0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
2e00: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
2e10: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2e20: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2e30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2e40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2e50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2e60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
2e70: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
2e80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2e90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ea0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2eb0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2ec0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2ed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
2ee0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
2ef0: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
2f00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2f10: 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  s", argv[2]);.  
2f20: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b  for(i=j=0; zSql[
2f30: 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i];){.    if( zS
2f40: 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20  ql[i]=='%' ){.  
2f50: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2f60: 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53  (testHexToInt(zS
2f70: 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74  ql[i+1])<<4) + t
2f80: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
2f90: 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20  [i+2]);.      i 
2fa0: 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  += 3;.    }else{
2fb0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
2fc0: 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20   = zSql[i++];.  
2fd0: 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a    }.  }.  zSql[j
2fe0: 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  ] = 0;.  rc = sq
2ff0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
3000: 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66  Sql, exec_printf
3010: 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  _cb, &str, &zErr
3020: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3030: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zSql);.  sqlit
3040: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3050: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
3060: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
3070: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3080: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3090: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
30a0: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
30b0: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
30c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
30d0: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
30e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
30f0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
3100: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
3110: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
3120: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
3130: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
3140: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3150: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3170: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
3180: 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a  nr  DB  SQL.**.*
3190: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
31a0: 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72 66  ite3_exec interf
31b0: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
31c0: 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  en database DB. 
31d0: 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c 20   Discard.** all 
31e0: 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74 69  results.*/.stati
31f0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
3200: 41 50 49 20 74 65 73 74 5f 65 78 65 63 5f 6e 72  API test_exec_nr
3210: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3220: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3230: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3240: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3250: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3260: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3270: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3290: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
32a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32c0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
32d0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
32e0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
32f0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
3300: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63   = 0;.  if( argc
3310: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
3320: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3330: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3340: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
3350: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
3360: 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29     " DB SQL", 0)
3370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3380: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3390: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
33a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
33b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
33c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
33d0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
33e0: 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20   argv[2], 0, 0, 
33f0: 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  &zErr);.  if( sq
3400: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
3410: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
3420: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3430: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
3440: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3450: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
3460: 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53  printf_z_test  S
3470: 45 50 41 52 41 54 4f 52 20 20 41 52 47 30 20 20  EPARATOR  ARG0  
3480: 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  ARG1 ....**.** T
3490: 65 73 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61  est the %z forma
34a0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
34b0: 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74  ntf().  Use mult
34c0: 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63  iple mprintf() c
34d0: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63  alls to .** conc
34e0: 61 74 65 6e 61 74 65 20 61 72 67 30 20 74 68 72  atenate arg0 thr
34f0: 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20  ough argn using 
3500: 73 65 70 61 72 61 74 6f 72 20 61 73 20 74 68 65  separator as the
3510: 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52   separator..** R
3520: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
3530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3540: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3550: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
3560: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3570: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3580: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3590: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
35a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
35b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
35c0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
35d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
35f0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3600: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3610: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3620: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
3630: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
3640: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
3650: 20 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32   i<argc && (i==2
3660: 20 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b   || zResult); i+
3670: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
3680: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3690: 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  f("%z%s%s", zRes
36a0: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
36b0: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
36c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
36d0: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
36e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
36f0: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
3700: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3710: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3720: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
3730: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
3740: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
3750: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
3760: 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74  _mprintf().  Ret
3770: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
3780: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
3790: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
37a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
37b0: 50 49 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  PI test_mprintf_
37c0: 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  n(.  void *NotUs
37d0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
37e0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
37f0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3800: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3810: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3820: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3840: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3850: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3860: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3870: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3880: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
3890: 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20  ar *zStr;.  int 
38a0: 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20  n = 0;.  zStr = 
38b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
38c0: 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c  "%s%n", argv[1],
38d0: 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   &n);.  sqlite3_
38e0: 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20 54 63  free(zStr);.  Tc
38f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
3900: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
3910: 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75  tObj(n));.  retu
3920: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
3930: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3940: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
3950: 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20 20 49    SIZE FORMAT  I
3960: 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  NT.**.** Test th
3970: 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 6e 70  e of sqlite3_snp
3980: 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e 65 2e  rintf() routine.
3990: 20 20 53 49 5a 45 20 69 73 20 74 68 65 20 73 69    SIZE is the si
39a0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ze of the.** out
39b0: 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
39c0: 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69 6d 75  tes.  The maximu
39d0: 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e 20 20  m size is 100.  
39e0: 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a  FORMAT is the.**
39f0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20   format string. 
3a00: 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67 6c 65   INT is a single
3a10: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
3a20: 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a  t.  The FORMAT.*
3a30: 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20 72 65  * string must re
3a40: 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68  quire no more th
3a50: 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e 74 65  an this one inte
3a60: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  ger argument.  I
3a70: 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20 69 6e  f.** You pass in
3a80: 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67   a format string
3a90: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6d   that requires m
3aa0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 72 67  ore than one arg
3ab0: 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68  ument,.** bad th
3ac0: 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70 65 6e  ings will happen
3ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3af0: 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28  st_snprintf_int(
3b00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3b10: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3b20: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3b30: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3b40: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3b50: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3b60: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3b80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3b90: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3bb0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3bc0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
3bd0: 20 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e   zStr[100];.  in
3be0: 74 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b  t n = atoi(argv[
3bf0: 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  1]);.  const cha
3c00: 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67  r *zFormat = arg
3c10: 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d  v[2];.  int a1 =
3c20: 20 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a   atoi(argv[3]);.
3c30: 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a    if( n>sizeof(z
3c40: 53 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f  Str) ) n = sizeo
3c50: 66 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  f(zStr);.  sqlit
3c60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3c70: 6f 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20  of(zStr), zStr, 
3c80: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
3c90: 70 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20  pqrstuvwxyz");. 
3ca0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3cb0: 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d  f(n, zStr, zForm
3cc0: 61 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41  at, a1);.  Tcl_A
3cd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3ce0: 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20  rp, zStr, 0);.  
3cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d10: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a  _OMIT_GET_TABLE.
3d20: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3d30: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
3d40: 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52  _printf  DB  FOR
3d50: 4d 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d  MAT  STRING  ?--
3d60: 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a  no-counts?.**.**
3d70: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
3d80: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3d90: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
3da0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
3db0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
3dc0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
3dd0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
3de0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
3df0: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
3e00: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
3e10: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
3e20: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
3e30: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
3e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
3e50: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
3e60: 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
3e70: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3e80: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3e90: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3ea0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3eb0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3ec0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3ed0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3ef0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3f20: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
3f30: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
3f40: 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f  ite3 *db;.  Tcl_
3f50: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69  DString str;.  i
3f60: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
3f70: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Err = 0;.  int n
3f80: 52 6f 77 20 3d 20 30 2c 20 6e 43 6f 6c 20 3d 20  Row = 0, nCol = 
3f90: 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73  0;.  char **aRes
3fa0: 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
3fb0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
3fc0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
3fd0: 6e 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31  nt resCount = -1
3fe0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3ff0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
4000: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
4010: 67 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74  gv[4], &resCount
4020: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4030: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4040: 61 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21  argc!=4 && argc!
4050: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
4060: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4070: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4080: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4090: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
40a0: 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54    " DB FORMAT ST
40b0: 52 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30  RING ?COUNT?", 0
40c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
40d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
40e0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
40f0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4100: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4110: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
4120: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4130: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
4140: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
4150: 5b 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20  [2],argv[3]);.  
4160: 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20  if( argc==5 ){. 
4170: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4180: 67 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53  get_table(db, zS
4190: 71 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c  ql, &aResult, 0,
41a0: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65   0, &zErr);.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
41c0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28  lite3_get_table(
41d0: 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75  db, zSql, &aResu
41e0: 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c  lt, &nRow, &nCol
41f0: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65  , &zErr);.    re
4200: 73 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31  sCount = (nRow+1
4210: 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71  )*nCol;.  }.  sq
4220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
4230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
4240: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
4250: 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72  ), zBuf, "%d", r
4260: 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  c);.  Tcl_Append
4270: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4280: 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
4290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
42a0: 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b    if( argc==4 ){
42b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
42c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
42d0: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22  Buf), zBuf, "%d"
42e0: 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54  , nRow);.      T
42f0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4300: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
4310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4320: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
4330: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
4340: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63   nCol);.      Tc
4350: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4360: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4370: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
4380: 3b 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b  ; i<resCount; i+
4390: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
43a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
43b0: 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f  rp, aResult[i] ?
43c0: 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e   aResult[i] : "N
43d0: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
43e0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
43f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4400: 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  rp, zErr);.  }. 
4410: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61   sqlite3_free_ta
4420: 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20  ble(aResult);.  
4430: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
4440: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
4450: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
4460: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
4470: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
4480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
4490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
44a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
44b0: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20  _OMIT_GET_TABLE 
44c0: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  */.../*.** Usage
44d0: 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  :  sqlite3_last_
44e0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a  insert_rowid DB.
44f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
4500: 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
4510: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
4520: 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74  nt insert..*/.st
4530: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
4540: 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 61 73 74  TCLAPI test_last
4550: 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20 2a  _rowid(.  void *
4560: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4570: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4580: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4590: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
45a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
45b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
45c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
45d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
45e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
45f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
4600: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4610: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
4630: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
4640: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
4650: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4660: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4670: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4680: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4690: 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c 20  gv[0], " DB\"", 
46a0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
46b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
46c0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
46d0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
46e0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
46f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
4700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4710: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
4720: 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65  , "%lld", sqlite
4730: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
4740: 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  wid(db));.  Tcl_
4750: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4760: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
4770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4780: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4790: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20  e:  sqlite3_key 
47a0: 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74  DB KEY.**.** Set
47b0: 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a   the codec key..
47c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
47d0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
47e0: 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _key(.  void *No
47f0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4800: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4810: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4820: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4830: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4840: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4860: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4870: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4880: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4890: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
48a0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23  argument */.){.#
48b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
48c0: 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
48d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
48e0: 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
48f0: 54 43 4c 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  TCL).  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  );.  sqlite3_key
4a20: 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  (db, zKey, nKey)
4a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4a40: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4a50: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4a60: 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a  e3_rekey DB KEY.
4a70: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
4a80: 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73   codec key..*/.s
4a90: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
4aa0: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 6b  _TCLAPI test_rek
4ab0: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4ac0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4ad0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4ae0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4af0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4b00: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4b10: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4b30: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4b40: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4b50: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4b60: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4b70: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
4b80: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
4b90: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4ba0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4bb0: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4bc0: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4bd0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4be0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4bf0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4c00: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4c10: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4c20: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4c30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4c40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4c50: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
4c60: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4c70: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4c80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
4c90: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4ca0: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4cb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4cc0: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4cd0: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4ce0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4cf0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4d00: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4d10: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4d20: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4d30: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
4d50: 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69  LITE_TCLAPI sqli
4d60: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20  te_test_close(. 
4d70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4d80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4d90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4da0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4db0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4dc0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4dd0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4df0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4e00: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4e20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4e30: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4e40: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
4e50: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
4e60: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
4e70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
4e80: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
4e90: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
4ea0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
4eb0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
4ec0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4ed0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4ee0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
4ef0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
4f00: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
4f10: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
4f20: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
4f30: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
4f40: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
4f50: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
4f60: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
4f70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
4f90: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
4fa0: 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65  2 DB.**.** Close
4fb0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  s the database o
4fc0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
4fd0: 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  _open..*/.static
4fe0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
4ff0: 50 49 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  PI sqlite_test_c
5000: 6c 6f 73 65 5f 76 32 28 0a 20 20 76 6f 69 64 20  lose_v2(.  void 
5010: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
5020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5030: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
5040: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
5050: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
5060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5070: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5090: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
50a0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
50b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
50c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
50d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
50e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
50f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
5100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5110: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
5120: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
5130: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
5140: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
5150: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
5160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5170: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
5180: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
5190: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
51a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
51b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
51c0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 3b 0a 20 20  close_v2(db);.  
51d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
51e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
51f0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
5200: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
5210: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5220: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5230: 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f  tion of the x_co
5240: 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f  alesce() functio
5250: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  n..** Return the
5260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
5270: 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5290: 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28  d t1_ifnullFunc(
52a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
52b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
52c0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
52d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
52e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
52f0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
5300: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
5310: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
5320: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
5330: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  v[i]) ){.      i
5340: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt n = sqlite3_v
5350: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
5360: 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i]);.      sqlit
5370: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5380: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
5390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
53a0: 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20  t(argv[i]),.    
53b0: 20 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f        n, SQLITE_
53c0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
53d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
53e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73   }.}../*.** Thes
53f0: 65 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74  e are test funct
5400: 69 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20  ions.    hex8() 
5410: 69 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61  interprets its a
5420: 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54  rgument as.** UT
5430: 46 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  F8 and returns a
5440: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20   hex encoding.  
5450: 68 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70  hex16le() interp
5460: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
5470: 74 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20  t.** as UTF16le 
5480: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
5490: 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  x encoding..*/.s
54a0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46  tatic void hex8F
54b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
54c0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
54d0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
54e0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
54f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5500: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5510: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
5520: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5530: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5540: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
5550: 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32  zeof(zBuf)/2 - 2
5560: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
5570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5580: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
5590: 29 2d 69 2a 32 2c 20 26 7a 42 75 66 5b 69 2a 32  )-i*2, &zBuf[i*2
55a0: 5d 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 29  ], "%02x", z[i])
55b0: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32  ;.  }.  zBuf[i*2
55c0: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
55d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20  _result_text(p, 
55e0: 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c  (char*)zBuf, -1,
55f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5600: 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  T);.}.#ifndef SQ
5610: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
5620: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 31  static void hex1
5630: 36 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  6Func(sqlite3_co
5640: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72  ntext *p, int ar
5650: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5660: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
5670: 73 74 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  st unsigned shor
5680: 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20  t int *z;.  int 
5690: 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34  i;.  char zBuf[4
56a0: 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  00];.  z = sqlit
56b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
56c0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
56d0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
56e0: 75 66 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69  uf)/4 - 4 && z[i
56f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
5700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5710: 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 34 2c 20  zeof(zBuf)-i*4, 
5720: 26 7a 42 75 66 5b 69 2a 34 5d 2c 22 25 30 34 78  &zBuf[i*4],"%04x
5730: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
5740: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d   }.  zBuf[i*4] =
5750: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
5760: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
5770: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
5780: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5790: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
57a0: 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74   A structure int
57b0: 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d  o which to accum
57c0: 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73  ulate text..*/.s
57d0: 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69  truct dstr {.  i
57e0: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53  nt nAlloc;  /* S
57f0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  pace allocated *
5800: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
5810: 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a   /* Space used *
5820: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
5830: 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f   /* The space */
5840: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .};../*.** Appen
5850: 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72  d text to a dstr
5860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5870: 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63  dstrAppend(struc
5880: 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74  t dstr *p, const
5890: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69   char *z, int di
58a0: 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  vider){.  int n 
58b0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
58c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
58d0: 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41   + n + 2 > p->nA
58e0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72  lloc ){.    char
58f0: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e   *zNew;.    p->n
5900: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
5910: 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20  c*2 + n + 200;. 
5920: 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65     zNew = sqlite
5930: 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  3_realloc(p->z, 
5940: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
5950: 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( zNew==0 ){. 
5960: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5970: 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d  e(p->z);.      m
5980: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5990: 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72  of(*p));.      r
59a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
59b0: 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20   p->z = zNew;.  
59c0: 7d 0a 20 20 69 66 28 20 64 69 76 69 64 65 72 20  }.  if( divider 
59d0: 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b  && p->nUsed>0 ){
59e0: 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73  .    p->z[p->nUs
59f0: 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b  ed++] = divider;
5a00: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
5a10: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a  ->z[p->nUsed], z
5a20: 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73  , n+1);.  p->nUs
5a30: 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  ed += n;.}../*.*
5a40: 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61  * Invoked for ea
5a50: 63 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d  ch callback from
5a60: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
5a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
5a80: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28  xecFuncCallback(
5a90: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
5aa0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
5ab0: 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73  gv, char **NotUs
5ac0: 65 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  ed){.  struct ds
5ad0: 74 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  tr *p = (struct 
5ae0: 64 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69  dstr*)pData;.  i
5af0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5b00: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
5b10: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d     if( argv[i]==
5b20: 30 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41  0 ){.      dstrA
5b30: 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c  ppend(p, "NULL",
5b40: 20 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   ' ');.    }else
5b50: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
5b60: 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27  nd(p, argv[i], '
5b70: 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   ');.    }.  }. 
5b80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5b90: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5ba0: 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69  on of the x_sqli
5bb0: 74 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69  te_exec() functi
5bc0: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
5bd0: 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69  on takes.** a si
5be0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e  ngle argument an
5bf0: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78  d attempts to ex
5c00: 65 63 75 74 65 20 74 68 61 74 20 61 72 67 75 6d  ecute that argum
5c10: 65 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e  ent as SQL code.
5c20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65  .** This is ille
5c30: 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73  gal and should s
5c40: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49  et the SQLITE_MI
5c50: 53 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65  SUSE flag on the
5c60: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
5c70: 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57   2004-Jan-07:  W
5c80: 65 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 74  e have changed t
5c90: 68 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c  his to make it l
5ca0: 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
5cb0: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
5cc0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e  rom within a fun
5cd0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a  ction call.  .**
5ce0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
5cf0: 65 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20  e simulates the 
5d00: 65 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67  effect of having
5d10: 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 74   two threads att
5d20: 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74  empt to.** use t
5d30: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5d40: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5d50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5d60: 64 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  d sqlite3ExecFun
5d70: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5d80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
5d90: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
5da0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5db0: 61 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74  argv.){.  struct
5dc0: 20 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65   dstr x;.  memse
5dd0: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
5de0: 78 29 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  x));.  (void)sql
5df0: 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74  ite3_exec((sqlit
5e00: 65 33 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  e3*)sqlite3_user
5e10: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a  _data(context),.
5e20: 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
5e30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5e40: 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20  argv[0]),.      
5e50: 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b  execFuncCallback
5e60: 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , &x, 0);.  sqli
5e70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5e80: 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e  context, x.z, x.
5e90: 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52  nUsed, SQLITE_TR
5ea0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
5eb0: 74 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d  te3_free(x.z);.}
5ec0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
5ed0: 74 61 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31  tation of tkt221
5ee0: 33 66 75 6e 63 28 29 2c 20 61 20 73 63 61 6c 61  3func(), a scala
5ef0: 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  r function that 
5f00: 74 61 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a  takes exactly.**
5f10: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20 49   one argument. I
5f20: 74 20 68 61 73 20 74 77 6f 20 69 6e 74 65 72 65  t has two intere
5f30: 73 74 69 6e 67 20 66 65 61 74 75 72 65 73 3a 0a  sting features:.
5f40: 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73  **.** * It calls
5f50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5f60: 65 78 74 28 29 20 33 20 74 69 6d 65 73 20 6f 6e  ext() 3 times on
5f70: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 73 71   the argument sq
5f80: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a  lite3_value*..**
5f90: 20 20 20 49 66 20 74 68 65 20 74 68 72 65 65 20     If the three 
5fa0: 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65  pointers returne
5fb0: 64 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  d are not the sa
5fc0: 6d 65 20 61 6e 20 53 51 4c 20 65 72 72 6f 72 20  me an SQL error 
5fd0: 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a  is raised..**.**
5fe0: 20 2a 20 4f 74 68 65 72 77 69 73 65 20 69 74 20   * Otherwise it 
5ff0: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
6000: 66 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  f the text repre
6010: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74 73  sentation of its
6020: 20 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20   .**   argument 
6030: 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
6040: 20 74 68 65 20 56 44 42 45 20 72 65 70 72 65 73   the VDBE repres
6050: 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 4d 65  entation is a Me
6060: 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69  m* cell .**   wi
6070: 74 68 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20  th the MEM_Term 
6080: 66 6c 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a  flag clear. .**.
6090: 2a 2a 20 54 69 63 6b 65 74 20 23 32 32 31 33 20  ** Ticket #2213 
60a0: 63 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65  can therefore be
60b0: 20 74 65 73 74 65 64 20 62 79 20 65 76 61 6c 75   tested by evalu
60c0: 61 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  ating the follow
60d0: 69 6e 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65  ing.** SQL expre
60e0: 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74  ssion:.**.**   t
60f0: 6b 74 32 32 31 33 66 75 6e 63 28 74 6b 74 32 32  kt2213func(tkt22
6100: 31 33 66 75 6e 63 28 27 61 20 73 74 72 69 6e 67  13func('a string
6110: 27 29 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '));.*/.static v
6120: 6f 69 64 20 74 6b 74 32 32 31 33 46 75 6e 63 74  oid tkt2213Funct
6130: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
6140: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6150: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a   .  int argc,  .
6160: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6170: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
6180: 6e 54 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65  nText;.  unsigne
6190: 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  d char const *zT
61a0: 65 78 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ext1;.  unsigned
61b0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65   char const *zTe
61c0: 78 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt2;.  unsigned 
61d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78  char const *zTex
61e0: 74 33 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73  t3;..  nText = s
61f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6200: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  es(argv[0]);.  z
6210: 54 65 78 74 31 20 3d 20 73 71 6c 69 74 65 33 5f  Text1 = sqlite3_
6220: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6230: 30 5d 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20  0]);.  zText2 = 
6240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6250: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
6260: 54 65 78 74 33 20 3d 20 73 71 6c 69 74 65 33 5f  Text3 = sqlite3_
6270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6280: 30 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78  0]);..  if( zTex
6290: 74 31 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54  t1!=zText2 || zT
62a0: 65 78 74 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a  ext2!=zText3 ){.
62b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
62c0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
62d0: 2c 20 22 74 6b 74 32 32 31 33 20 69 73 20 6e 6f  , "tkt2213 is no
62e0: 74 20 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20  t fixed", -1);. 
62f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
6300: 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20   *zCopy = (char 
6310: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6320: 28 6e 54 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d  (nText);.    mem
6330: 63 70 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74  cpy(zCopy, zText
6340: 31 2c 20 6e 54 65 78 74 29 3b 0a 20 20 20 20 73  1, nText);.    s
6350: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6360: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70  xt(context, zCop
6370: 79 2c 20 6e 54 65 78 74 2c 20 73 71 6c 69 74 65  y, nText, sqlite
6380: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
6390: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
63a0: 69 6e 67 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ing SQL function
63b0: 20 74 61 6b 65 73 20 34 20 61 72 67 75 6d 65 6e   takes 4 argumen
63c0: 74 73 2e 20 20 54 68 65 20 32 6e 64 20 61 6e 64  ts.  The 2nd and
63d0: 0a 2a 2a 20 34 74 68 20 61 72 67 75 6d 65 6e 74  .** 4th argument
63e0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
63f0: 74 68 65 73 65 20 73 74 72 69 6e 67 73 3a 20 20  these strings:  
6400: 27 74 65 78 74 27 2c 20 27 74 65 78 74 31 36 27  'text', 'text16'
6410: 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63  ,.** or 'blob' c
6420: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6430: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  API functions.**
6440: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
6450: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a  _value_text().**
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20  lue_text16().** 
6480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6490: 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20  ue_blob().**.** 
64a0: 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
64b0: 6e 74 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  nt is a string, 
64c0: 65 69 74 68 65 72 20 27 62 79 74 65 73 27 20 6f  either 'bytes' o
64d0: 72 20 27 62 79 74 65 73 31 36 27 20 6f 72 20 27  r 'bytes16' or '
64e0: 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73  noop',.** corres
64f0: 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 73 3a  ponding to APIs:
6500: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
6510: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6520: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6530: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
6540: 29 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a  ).**      noop.*
6550: 2a 0a 2a 2a 20 54 68 65 20 41 50 49 73 20 64 65  *.** The APIs de
6560: 73 69 67 6e 61 74 65 64 20 62 79 20 74 68 65 20  signated by the 
6570: 32 6e 64 20 74 68 72 6f 75 67 68 20 34 74 68 20  2nd through 4th 
6580: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
6590: 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  plied.** to the 
65a0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
65b0: 6e 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 65  n order.  If the
65c0: 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e   pointers return
65d0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 65 63  ed by the.** sec
65e0: 6f 6e 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61  ond and fourth a
65f0: 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68  re different, th
6600: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6610: 6e 73 20 31 2e 20 20 4f 74 68 65 72 77 69 73 65  ns 1.  Otherwise
6620: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
6630: 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a  e returns 0..**.
6640: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6650: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
6660: 20 74 6f 20 73 65 65 20 77 68 65 6e 20 72 65 74   to see when ret
6670: 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 73 20 66  urned pointers f
6680: 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74  rom.** the _text
6690: 28 29 2c 20 5f 74 65 78 74 31 36 28 29 20 61 6e  (), _text16() an
66a0: 64 20 5f 62 6c 6f 62 28 29 20 41 50 49 73 20 62  d _blob() APIs b
66b0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74 65  ecome invalidate
66c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
66d0: 64 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f  d ptrChngFunctio
66e0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
66f0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
6700: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
6710: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6720: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
6730: 76 6f 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20  void *p1, *p2;. 
6740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
6750: 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  d;.  if( argc!=4
6760: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d   ) return;.  zCm
6770: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6780: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6790: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
67a0: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
67b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
67c0: 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d  mp(zCmd,"text")=
67d0: 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28  =0 ){.    p1 = (
67e0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
67f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6800: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
6820: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
6830: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78  trcmp(zCmd, "tex
6840: 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t16")==0 ){.    
6850: 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p1 = (const void
6860: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6870: 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b  text16(argv[0]);
6880: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6890: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
68a0: 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20   "blob")==0 ){. 
68b0: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
68c0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
68d0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
68e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
68f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d  eturn;.  }.  zCm
6900: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6910: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6920: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
6930: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
6940: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
6950: 6d 70 28 7a 43 6d 64 2c 22 62 79 74 65 73 22 29  mp(zCmd,"bytes")
6960: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6970: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
6980: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6990: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
69a0: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
69b0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74  trcmp(zCmd, "byt
69c0: 65 73 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  es16")==0 ){.   
69d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
69e0: 79 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b  ytes16(argv[0]);
69f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6a00: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6a10: 20 22 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20   "noop")==0 ){. 
6a20: 20 20 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67     /* do nothing
6a30: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
6a40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
6a50: 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Cmd = (const cha
6a60: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6a70: 5f 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a  _text(argv[3]);.
6a80: 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20    if( zCmd==0 ) 
6a90: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74  return;.  if( st
6aa0: 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22  rcmp(zCmd,"text"
6ab0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d  )==0 ){.    p2 =
6ac0: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6ad0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6ae0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64  (argv[0]);.#ifnd
6af0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
6b00: 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28  TF16.  }else if(
6b10: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74   strcmp(zCmd, "t
6b20: 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20  ext16")==0 ){.  
6b30: 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p2 = (const vo
6b40: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
6b50: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
6b60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
6b70: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
6b80: 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b  d, "blob")==0 ){
6b90: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6ba0: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6bb0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
6bc0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
6bd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
6be0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6bf0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70  t(context, p1!=p
6c00: 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  2);.}../*.** Thi
6c10: 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72  s SQL function r
6c20: 65 74 75 72 6e 73 20 61 20 64 69 66 66 65 72 65  eturns a differe
6c30: 6e 74 20 61 6e 73 77 65 72 20 65 61 63 68 20 74  nt answer each t
6c40: 69 6d 65 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ime it is called
6c50: 2c 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  , even if.** the
6c60: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74   arguments are t
6c70: 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
6c80: 69 63 20 76 6f 69 64 20 6e 6f 6e 64 65 74 65 72  ic void nondeter
6c90: 6d 69 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e  ministicFunction
6ca0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6cb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6cc0: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
6cd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6ce0: 72 67 76 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  rgv.){.  static 
6cf0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 73  int cnt = 0;.  s
6d00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6d10: 74 28 63 6f 6e 74 65 78 74 2c 20 63 6e 74 2b 2b  t(context, cnt++
6d20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
6d30: 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  e:  sqlite3_crea
6d40: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a  te_function DB.*
6d50: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
6d60: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6d70: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
6d80: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
6d90: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
6da0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
6db0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73   named "x_coales
6dc0: 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ce".  This funct
6dd0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
6de0: 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68  e thing.** as th
6df0: 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e  e "coalesce" fun
6e00: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
6e10: 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73  ction also regis
6e20: 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63  ters an SQL func
6e30: 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78  tion.** named "x
6e40: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68  _sqlite_exec" th
6e50: 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  at invokes sqlit
6e60: 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f  e3_exec().  Invo
6e70: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65  king sqlite3_exe
6e80: 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77  c().** in this w
6e90: 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65  ay is illegal re
6ea0: 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75  cursion and shou
6eb0: 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ld raise an SQLI
6ec0: 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e  TE_MISUSE error.
6ed0: 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69  .** The effect i
6ee0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79  s similar to try
6ef0: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73  ing to use the s
6f00: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
6f10: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  nection from.** 
6f20: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74  two threads at t
6f30: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a  he same time..**
6f40: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
6f50: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
6f60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
6f70: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
6f80: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
6f90: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6fa0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  on function whil
6fb0: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
6fc0: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
6fd0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
6fe0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
6ff0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a  etection logic..
7000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
7010: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
7020: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7030: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7040: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
7050: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
7060: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
7070: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7080: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7090: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
70a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
70b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
70c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
70e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
70f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
7100: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
7110: 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  db;..  if( argc!
7120: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
7130: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7140: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
7150: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
7160: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
7170: 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20   " DB\"", 0);.  
7180: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7190: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
71a0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
71b0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
71c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
71d0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
71e0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
71f0: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65  ion(db, "x_coale
7200: 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  sce", -1, SQLITE
7210: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
7220: 20 20 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63     t1_ifnullFunc
7230: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
7240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7260: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7270: 28 64 62 2c 20 22 68 65 78 38 22 2c 20 31 2c 20  (db, "hex8", 1, 
7280: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
7290: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
72a0: 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c  IC,.          0,
72b0: 20 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29   hex8Func, 0, 0)
72c0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
72d0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
72e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
72f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7300: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7310: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78  unction(db, "hex
7320: 31 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  16", 1, SQLITE_U
7330: 54 46 31 36 20 7c 20 53 51 4c 49 54 45 5f 44 45  TF16 | SQLITE_DE
7340: 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20  TERMINISTIC,.   
7350: 20 20 20 20 20 20 20 30 2c 20 68 65 78 31 36 46         0, hex16F
7360: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
7370: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 3d  #endif.  if( rc=
7380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
73a0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
73b0: 62 2c 20 22 74 6b 74 32 32 31 33 66 75 6e 63 22  b, "tkt2213func"
73c0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
73d0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74   0, .          t
73e0: 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20  kt2213Function, 
73f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7400: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7410: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7420: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7430: 6f 6e 28 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f  on(db, "pointer_
7440: 63 68 61 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49  change", 4, SQLI
7450: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7460: 20 20 20 20 20 20 70 74 72 43 68 6e 67 46 75 6e        ptrChngFun
7470: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
7480: 7d 0a 0a 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  }..  /* Function
7490: 73 20 63 6f 75 6e 74 65 72 31 28 29 20 61 6e 64  s counter1() and
74a0: 20 63 6f 75 6e 74 65 72 32 28 29 20 68 61 76 65   counter2() have
74b0: 20 74 68 65 20 73 61 6d 65 20 69 6d 70 6c 65 6d   the same implem
74c0: 65 6e 74 61 74 69 6f 6e 20 2d 20 74 68 65 79 0a  entation - they.
74d0: 20 20 2a 2a 20 62 6f 74 68 20 72 65 74 75 72 6e    ** both return
74e0: 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
74f0: 74 65 67 65 72 20 77 69 74 68 20 65 61 63 68 20  teger with each 
7500: 63 61 6c 6c 2e 20 20 42 75 74 20 63 6f 75 6e 74  call.  But count
7510: 65 72 31 28 29 20 69 73 20 6d 61 72 6b 65 64 0a  er1() is marked.
7520: 20 20 2a 2a 20 61 73 20 6e 6f 6e 2d 64 65 74 65    ** as non-dete
7530: 72 6d 69 6e 69 73 74 69 63 20 61 6e 64 20 63 6f  rministic and co
7540: 75 6e 74 65 72 32 28 29 20 69 73 20 6d 61 72 6b  unter2() is mark
7550: 65 64 20 61 73 20 64 65 74 65 72 6d 69 6e 69 73  ed as determinis
7560: 74 69 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tic..  */.  if( 
7570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7580: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7590: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
75a0: 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 31 22  n(db, "counter1"
75b0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
75c0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  8,.          0, 
75d0: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
75e0: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
75f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
7600: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7610: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7620: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7630: 20 22 63 6f 75 6e 74 65 72 32 22 2c 20 2d 31 2c   "counter2", -1,
7640: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c   SQLITE_UTF8|SQL
7650: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7660: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7670: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
7680: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
7690: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
76a0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
76b0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c    /* Use the sql
76c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
76d0: 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72  tion16() API her
76e0: 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75  e. Mainly for fu
76f0: 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a  n, but also .  *
7700: 2a 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  * because it is 
7710: 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68  not tested anywh
7720: 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69  ere else. */.  i
7730: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7740: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f   ){.    const vo
7750: 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20  id *zUtf16;.    
7760: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
7770: 56 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Val;.    sqlite3
7780: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
7790: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61  >mutex);.    pVa
77a0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
77b0: 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
77c0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
77d0: 70 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c  pVal, -1, "x_sql
77e0: 69 74 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54  ite_exec", SQLIT
77f0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
7800: 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66  TATIC);.    zUtf
7810: 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  16 = sqlite3Valu
7820: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
7830: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
7840: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
7850: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7860: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7870: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
7880: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7890: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
78a0: 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36  ion16(db, zUtf16
78b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
78c0: 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46     1, SQLITE_UTF
78d0: 31 36 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45  16, db, sqlite3E
78e0: 78 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  xecFunc, 0, 0);.
78f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7900: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
7910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7920: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7930: 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
7940: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ..  if( sqlite3T
7950: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
7960: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
7970: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7980: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
7990: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
79a0: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
79b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
79c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
79d0: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
79e0: 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28  ent the x_count(
79f0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
7a00: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f  tion..**.** x_co
7a10: 75 6e 74 28 29 20 63 6f 75 6e 74 73 20 74 68 65  unt() counts the
7a20: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e   number of non-n
7a30: 75 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ull arguments.  
7a40: 42 75 74 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  But there are.**
7a50: 20 73 6f 6d 65 20 74 77 69 73 74 73 20 66 6f 72   some twists for
7a60: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
7a70: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
7a80: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f  argument to x_co
7a90: 75 6e 74 28 29 20 69 73 20 34 30 20 74 68 65 6e  unt() is 40 then
7aa0: 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69   a UTF-8 error i
7ab0: 73 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e  s reported.** on
7ac0: 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
7ad0: 6f 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e 74 28  on.  If x_count(
7ae0: 34 31 29 20 69 73 20 73 65 65 6e 2c 20 74 68 65  41) is seen, the
7af0: 6e 20 61 20 55 54 46 2d 31 36 20 65 72 72 6f 72  n a UTF-16 error
7b00: 0a 2a 2a 20 69 73 20 72 65 70 6f 72 74 65 64 20  .** is reported 
7b10: 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  on the step func
7b20: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 74 6f  tion.  If the to
7b30: 74 61 6c 20 63 6f 75 6e 74 20 69 73 20 34 32 2c  tal count is 42,
7b40: 20 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38   then.** a UTF-8
7b50: 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
7b60: 65 64 20 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69  ed on the finali
7b70: 7a 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ze function..*/.
7b80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 74  typedef struct t
7b90: 31 43 6f 75 6e 74 43 74 78 20 74 31 43 6f 75 6e  1CountCtx t1Coun
7ba0: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 74 31 43  tCtx;.struct t1C
7bb0: 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20  ountCtx {.  int 
7bc0: 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69  n;.};.static voi
7bd0: 64 20 74 31 43 6f 75 6e 74 53 74 65 70 28 0a 20  d t1CountStep(. 
7be0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7bf0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
7c00: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
7c10: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7c20: 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70  .  t1CountCtx *p
7c30: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
7c40: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
7c50: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
7c60: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61  f(*p));.  if( (a
7c70: 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  rgc==0 || SQLITE
7c80: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
7c90: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
7ca0: 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20 20  ]) ) && p ){.   
7cb0: 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69   p->n++;.  }.  i
7cc0: 66 28 20 61 72 67 63 3e 30 20 29 7b 0a 20 20 20  f( argc>0 ){.   
7cd0: 20 69 6e 74 20 76 20 3d 20 73 71 6c 69 74 65 33   int v = sqlite3
7ce0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7cf0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  0]);.    if( v==
7d00: 34 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  40 ){.      sqli
7d10: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7d20: 28 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c 75 65  (context, "value
7d30: 20 6f 66 20 34 30 20 68 61 6e 64 65 64 20 74 6f   of 40 handed to
7d40: 20 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a   x_count", -1);.
7d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d60: 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7d 65  MIT_UTF16.    }e
7d70: 6c 73 65 20 69 66 28 20 76 3d 3d 34 31 20 29 7b  lse if( v==41 ){
7d80: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
7d90: 72 20 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 5d  r zUtf16ErrMsg[]
7da0: 20 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c   = { 0, 0x61, 0,
7db0: 20 30 78 36 32 2c 20 30 2c 20 30 78 36 33 2c 20   0x62, 0, 0x63, 
7dc0: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20  0, 0, 0};.      
7dd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7de0: 72 72 6f 72 31 36 28 63 6f 6e 74 65 78 74 2c 20  rror16(context, 
7df0: 26 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 31 2d  &zUtf16ErrMsg[1-
7e00: 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e  SQLITE_BIGENDIAN
7e10: 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  ], -1);.#endif. 
7e20: 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74     }.  }.}   .st
7e30: 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e  atic void t1Coun
7e40: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7e50: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7e60: 78 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  xt){.  t1CountCt
7e70: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7e80: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7e90: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
7ea0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
7eb0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
7ec0: 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20  ->n==42 ){.     
7ed0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7ee0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
7ef0: 78 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74  x_count totals t
7f00: 6f 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20  o 42", -1);.    
7f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7f20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
7f30: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
7f40: 6e 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  n : 0);.    }.  
7f50: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
7f60: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
7f70: 54 45 44 0a 73 74 61 74 69 63 20 76 6f 69 64 20  TED.static void 
7f80: 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 28  legacyCountStep(
7f90: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7fa0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7fb0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7fc0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7fd0: 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  ){.  /* no-op */
7fe0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7ff0: 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c  legacyCountFinal
8000: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
8010: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
8020: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8030: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
8040: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
8050: 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a  ount(context));.
8060: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8070: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
8080: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
8090: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74   DB.**.** Call t
80a0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
80b0: 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f  e_function API o
80c0: 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  n the given data
80d0: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  base in order.**
80e0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e   to create a fun
80f0: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63  ction named "x_c
8100: 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66 75 6e  ount".  This fun
8110: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
8120: 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 69 6c 74  .** to the built
8130: 2d 69 6e 20 63 6f 75 6e 74 28 29 20 66 75 6e 63  -in count() func
8140: 74 69 6f 6e 2c 20 77 69 74 68 20 61 20 66 65 77  tion, with a few
8150: 20 73 70 65 63 69 61 6c 20 71 75 69 72 6b 73 0a   special quirks.
8160: 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74  ** for testing t
8170: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  he sqlite3_resul
8180: 74 5f 65 72 72 6f 72 28 29 20 41 50 49 73 2e 0a  t_error() APIs..
8190: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
81a0: 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f  al motivation fo
81b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
81c0: 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  as to be able to
81d0: 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c   call the.** sql
81e0: 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
81f0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77  egate function w
8200: 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20  hile a query is 
8210: 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f  in progress in o
8220: 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20  rder.** to test 
8230: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
8240: 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69  E detection logi
8250: 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65 2e 74  c.  See misuse.t
8260: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  est..**.** This 
8270: 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61 74 65  routine was late
8280: 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 65  r extended to te
8290: 73 74 20 74 68 65 20 75 73 65 20 6f 66 20 73 71  st the use of sq
82a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
82b0: 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61  or().** within a
82c0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
82d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a  ns..**.** Later:
82e0: 20 49 74 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20   It is now also 
82f0: 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65 67 69  extended to regi
8300: 73 74 65 72 20 74 68 65 20 61 67 67 72 65 67 61  ster the aggrega
8310: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  te function.** "
8320: 6c 65 67 61 63 79 5f 63 6f 75 6e 74 28 29 22 20  legacy_count()" 
8330: 77 69 74 68 20 74 68 65 20 73 75 70 70 6c 69 65  with the supplie
8340: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
8350: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  e. This is used.
8360: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 64  ** to test the d
8370: 65 70 72 65 63 61 74 65 64 20 73 71 6c 69 74 65  eprecated sqlite
8380: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
8390: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
83a0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
83b0: 4c 41 50 49 20 74 65 73 74 5f 63 72 65 61 74 65  LAPI test_create
83c0: 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f  _aggregate(.  vo
83d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
83e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
83f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8490: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
84a0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
84b0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
84c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
84d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
84e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
84f0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8500: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
8510: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
8520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8530: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
8540: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
8550: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
8560: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8570: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
8580: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8590: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
85a0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
85b0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74 31  , 0, 0,.      t1
85c0: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
85d0: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66  tFinalize);.  if
85e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
85f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
8600: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8610: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74  ion(db, "x_count
8620: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
8630: 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  8, 0, 0,.       
8640: 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43   t1CountStep,t1C
8650: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20  ountFinalize);. 
8660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
8670: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
8680: 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  D.  if( rc==SQLI
8690: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
86a0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
86b0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c  _function(db, "l
86c0: 65 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c  egacy_count", 0,
86d0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
86e0: 30 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61 63  0,.        legac
86f0: 79 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67 61  yCountStep, lega
8700: 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a  cyCountFinalize.
8710: 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
8720: 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  f.  if( sqlite3T
8730: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
8740: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
8750: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8760: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
8770: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
8780: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
8790: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
87a0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
87b0: 73 61 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45  sage:  printf TE
87c0: 58 54 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75  XT.**.** Send ou
87d0: 74 70 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20  tput to printf. 
87e0: 20 55 73 65 20 74 68 69 73 20 72 61 74 68 65 72   Use this rather
87f0: 20 74 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65   than puts to me
8800: 72 67 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  rge the output.*
8810: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
8820: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 64   sequence with d
8830: 65 62 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73  ebugging printfs
8840: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43   inserted into C
8850: 20 63 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75   code..** Puts u
8860: 73 65 73 20 61 20 73 65 70 61 72 61 74 65 20 62  ses a separate b
8870: 75 66 66 65 72 20 61 6e 64 20 64 65 62 75 67 67  uffer and debugg
8880: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77  ing statements w
8890: 69 6c 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a  ill be out of.**
88a0: 20 73 65 71 75 65 6e 63 65 20 69 66 20 69 74 20   sequence if it 
88b0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  is used..*/.stat
88c0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
88d0: 4c 41 50 49 20 74 65 73 74 5f 70 72 69 6e 74 66  LAPI test_printf
88e0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
88f0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
8900: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
8910: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
8920: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
8930: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
8940: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
8950: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8960: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8970: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
8980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8990: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
89a0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ment */.){.  if(
89b0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
89c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
89d0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
89e0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
89f0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8a00: 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22         " TEXT\""
8a10: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
8a20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
8a30: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
8a40: 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74   argv[1]);.  ret
8a50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
8a60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
8a70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8a80: 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  nt FORMAT INTEGE
8a90: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8aa0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8ab0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8ac0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
8ad0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
8ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
8af0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8b00: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
8b10: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8b20: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8b30: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8b40: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8b50: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8b60: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8b80: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8ba0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8bb0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8bc0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8bd0: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
8be0: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
8bf0: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
8c00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8c10: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8c20: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8c30: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8c40: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
8c50: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
8c60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8c70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
8c80: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
8c90: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
8ca0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
8cb0: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
8cc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8cd0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8ce0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
8cf0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
8d00: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
8d10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8d20: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
8d30: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
8d40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
8d50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8d60: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8d70: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
8d80: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8d90: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8da0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8db0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
8dc0: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
8dd0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
8de0: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
8df0: 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f  intf_int64(.  vo
8e00: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
8e10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8e20: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8e30: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8e40: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8e50: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8e60: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8e70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8e80: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8e90: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8ea0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8eb0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8ec0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
8ed0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33  sqlite_int64 a[3
8ee0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
8ef0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8f00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8f10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8f20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8f30: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8f40: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
8f50: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
8f60: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8f70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8f80: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
8f90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8fa0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 61 72 67  qlite3Atoi64(arg
8fb0: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 73  v[i], &a[i-2], s
8fc0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 61  qlite3Strlen30(a
8fd0: 72 67 76 5b 69 5d 29 2c 20 53 51 4c 49 54 45 5f  rgv[i]), SQLITE_
8fe0: 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20 20 54  UTF8) ){.      T
8ff0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9000: 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65 6e  interp, "argumen
9010: 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
9020: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 22   64-bit integer"
9030: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
9040: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9050: 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71    }.  }.  z = sq
9060: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9070: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9080: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9090: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
90a0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
90b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
90c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
90d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
90e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
90f0: 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54  _long FORMAT INT
9100: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
9110: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
9120: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
9130: 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20  ee long integer 
9140: 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54 68 69  arguments.   Thi
9150: 73 20 6d 69 67 68 74 20 62 65 20 74 68 65 0a 2a  s might be the.*
9160: 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  * same as sqlite
9170: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72  3_mprintf_int or
9180: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9190: 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64 69 6e  _int64, dependin
91a0: 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  g on.** platform
91b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
91c0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
91d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
91e0: 6e 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ng(.  void *NotU
91f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9200: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9210: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9220: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9230: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9240: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9260: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9270: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9280: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9290: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
92a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
92b0: 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74  nt i;.  long int
92c0: 20 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33   a[3];.  int b[3
92d0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
92e0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
92f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9310: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9320: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9330: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
9340: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
9350: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9360: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9370: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
9380: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
9390: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
93a0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d  , argv[i], &b[i-
93b0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
93c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d  _ERROR;.    a[i-
93d0: 32 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62  2] = (long int)b
93e0: 5b 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32  [i-2];.    a[i-2
93f0: 5d 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c  ] &= (((u64)1)<<
9400: 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29  (sizeof(int)*8))
9410: 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  -1;.  }.  z = sq
9420: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9430: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9440: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9460: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
9470: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
9480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9490: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
94a0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
94b0: 5f 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45  _str FORMAT INTE
94c0: 47 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49  GER INTEGER STRI
94d0: 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  NG.**.** Call mp
94e0: 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69  rintf with two i
94f0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
9500: 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20   and one string 
9510: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  argument.*/.stat
9520: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
9530: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
9540: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
9550: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9560: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9570: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9580: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9590: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
95a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
95b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
95c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
95d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
95e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
95f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9600: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
9610: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
9620: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
9630: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
9640: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
9650: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9660: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9670: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9680: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9690: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
96a0: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
96b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
96c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
96d0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
96e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
96f0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9700: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9710: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9720: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9730: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9740: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9750: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
9760: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
9770: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9780: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
9790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
97a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
97b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
97c0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
97d0: 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45  rintf_str INTEGE
97e0: 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  R FORMAT INTEGER
97f0: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9800: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9810: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9820: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9830: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9840: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9850: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
9860: 49 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  I sqlite3_snprin
9870: 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  tf_str(.  void *
9880: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9890: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
98a0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
98b0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
98c0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
98d0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
98e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
98f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
9900: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
9910: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9920: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9930: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9940: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
9950: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
9960: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 35  *z;.  if( argc<5
9970: 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20 20   || argc>6 ){.  
9980: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9990: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
99a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
99b0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
99c0: 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20 46  ,.       " INT F
99d0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53  ORMAT INT INT ?S
99e0: 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20  TRING?\"", 0);. 
99f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9a00: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
9a10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9a20: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29  , argv[1], &n) )
9a30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9a40: 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  R;.  if( n<0 ){.
9a50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 20  sult(interp, "N 
9a70: 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  must be non-nega
9a80: 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  tive", 0);.    r
9a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9aa0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20  .  }.  for(i=3; 
9ab0: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
9ac0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9ad0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ae0: 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72 6e  a[i-3]) ) return
9af0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9b00: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    z = sqlite3_ma
9b10: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73  lloc( n+1 );.  s
9b20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9b30: 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61  n, z, argv[2], a
9b40: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
9b50: 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55  4 ? argv[5] : NU
9b60: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
9b70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9b80: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9b90: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9ba0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9bb0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9bc0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
9bd0: 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  le FORMAT INTEGE
9be0: 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45  R INTEGER DOUBLE
9bf0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9c00: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
9c10: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
9c20: 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72  nd one double ar
9c30: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
9c40: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
9c50: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
9c60: 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  tf_double(.  voi
9c70: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9c80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9c90: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9ca0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9cb0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9cc0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9cd0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9ce0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9cf0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9d00: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9d10: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9d20: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9d30: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
9d40: 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  i;.  double r;. 
9d50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
9d60: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
9d70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9d80: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9d90: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9da0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
9db0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
9dc0: 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22  NT INT DOUBLE\""
9dd0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9de0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9df0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
9e00: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9e10: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9e20: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32   argv[i], &a[i-2
9e30: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9e40: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
9e50: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
9e60: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
9e70: 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &r) ) return TCL
9e80: 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
9e90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9ea0: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9eb0: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
9ec0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9ed0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
9ee0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9ef0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9f00: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9f10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9f20: 61 6c 65 64 20 46 4f 52 4d 41 54 20 44 4f 55 42  aled FORMAT DOUB
9f30: 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20  LE DOUBLE.**.** 
9f40: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9f50: 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c  h a single doubl
9f60: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
9f70: 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74 20   is the product 
9f80: 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72  of the.** two ar
9f90: 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62  guments given ab
9fa0: 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  ove.  This is us
9fb0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f  ed to generate o
9fc0: 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65  verflow and unde
9fd0: 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73  rflow.** doubles
9fe0: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68   to test that th
9ff0: 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ey are converted
a000: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74   properly..*/.st
a010: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
a020: 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d  TCLAPI sqlite3_m
a030: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20  printf_scaled(. 
a040: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
a050: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a060: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a070: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a080: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a090: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a0a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
a0b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a0c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a0d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
a0f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
a100: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
a110: 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a  .  double r[2];.
a120: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
a130: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
a140: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a150: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a160: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a170: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a180: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
a190: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22  DOUBLE DOUBLE\""
a1a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a1b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a1c0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
a1d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
a1e0: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
a1f0: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b  rp, argv[i], &r[
a200: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
a210: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a220: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a230: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30  ntf(argv[1], r[0
a240: 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  ]*r[1]);.  Tcl_A
a250: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a260: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
a270: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
a280: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a290: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
a2a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2b0: 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53  stronly FORMAT S
a2c0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
a2d0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
a2e0: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
a2f0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
a300: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
a310: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
a320: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
a330: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
a340: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
a350: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
a360: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
a370: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
a380: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
a390: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
a3a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
a3b0: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
a3c0: 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f  tf_stronly(.  vo
a3d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
a3e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a3f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
a440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
a460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
a470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
a480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
a490: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
a4a0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
a4b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a4c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a4d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a4e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a4f0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a500: 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20  RMAT STRING\"", 
a510: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a520: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a530: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a540: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67  ntf(argv[1], arg
a550: 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
a560: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a570: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
a580: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
a590: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a5a0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
a5b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
a5c0: 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48  xdouble FORMAT H
a5d0: 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  EX.**.** Call mp
a5e0: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a5f0: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a600: 65 6e 74 20 77 68 69 63 68 20 69 73 20 64 65 72  ent which is der
a610: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ived from the.**
a620: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63   hexadecimal enc
a630: 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45  oding of an IEEE
a640: 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
a650: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
a660: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
a670: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a  intf_hexdouble(.
a680: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a690: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a6a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a6b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a6c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a6d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a6e0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a6f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a700: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a710: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
a730: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a740: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
a750: 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a  *z;.  double r;.
a760: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
a770: 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f  1, x2;.  sqlite_
a780: 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20  uint64 d;.  if( 
a790: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
a7a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a7b0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
a7c0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a7d0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
a7e0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53        " FORMAT S
a7f0: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
a800: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a810: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73  OR;.  }.  if( ss
a820: 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25  canf(argv[2], "%
a830: 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26  08x%08x", &x2, &
a840: 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  x1)!=2 ){.    Tc
a850: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a860: 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75  nterp, "2nd argu
a870: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31  ment should be 1
a880: 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  6-characters of 
a890: 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  hex", 0);.    re
a8a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a8b0: 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20    }.  d = x2;.  
a8c0: 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31  d = (d<<32) + x1
a8d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26  ;.  memcpy(&r, &
a8e0: 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  d, sizeof(r));. 
a8f0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
a900: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29  intf(argv[1], r)
a910: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
a920: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
a930: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
a940: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
a950: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a960: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a970: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
a980: 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  che ?BOOLEAN?.**
a990: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
a9a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a9b0: 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69  RED_CACHE).stati
a9c0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
a9d0: 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  API test_enable_
a9e0: 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65 6e 74  shared(.  Client
a9f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
aa00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
aa10: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
aa20: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
aa30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
aa40: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
aa50: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
aa60: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
aa70: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
aa80: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
aa90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
aaa0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
aab0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
aac0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
aad0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
aae0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
aaf0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20  t enable;.  int 
ab00: 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ret = 0;..  if( 
ab10: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
ab20: 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
ab30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ab40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f  p, 1, objv, "?BO
ab50: 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65  OLEAN?");.    re
ab60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ab70: 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69    }.  ret = sqli
ab80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
ab90: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
aba0: 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d  ed;..  if( objc=
abb0: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  =2 ){.    if( Tc
abc0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
abd0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
abe0: 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b  [1], &enable) ){
abf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ac00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ac10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ac20: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
ac30: 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20  che(enable);.   
ac40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ac50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
ac60: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ac70: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
ac80: 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c  3ErrStr(rc), TCL
ac90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
aca0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
acb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63  ;.    }.  }.  Tc
acc0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
acd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
ace0: 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a  oleanObj(ret));.
acf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ad00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  .}.#endif..../*.
ad10: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
ad20: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
ad30: 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20 20 20  t_codes   DB    
ad40: 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74  BOOLEAN.**.*/.st
ad50: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
ad60: 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78 74 65  TCLAPI test_exte
ad70: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
ad80: 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
ad90: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
ada0: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
adb0: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
adc0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
add0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
ade0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
adf0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
ae00: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
ae10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
ae20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ae30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ae40: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
ae50: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
ae60: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
ae70: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
ae80: 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c  nt enable;.  sql
ae90: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
aea0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
aeb0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
aec0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
aed0: 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b  , "DB BOOLEAN");
aee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aef0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
af00: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
af10: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
af20: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
af30: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
af40: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
af50: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
af60: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
af70: 32 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72  2], &enable) ) r
af80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
af90: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  .  sqlite3_exten
afa0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
afb0: 28 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20  (db, enable);.  
afc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
afd0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
afe0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
aff0: 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73  n_number.**.*/.s
b000: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
b010: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 69 62  _TCLAPI test_lib
b020: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a  version_number(.
b030: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b040: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b050: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b060: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b070: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b080: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b090: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b0a0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b0b0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b0c0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b0e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b0f0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b100: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b110: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b120: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
b130: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b140: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b150: 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  bj(sqlite3_libve
b160: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29  rsion_number()))
b170: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
b180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
b190: 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  e: sqlite3_table
b1a0: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
b1b0: 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61   DB dbname tblna
b1c0: 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f  me colname.**.*/
b1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
b1e0: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74  TE_TCLAPI test_t
b1f0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
b200: 64 61 74 61 28 0a 20 20 43 6c 69 65 6e 74 44 61  data(.  ClientDa
b210: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
b220: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
b230: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
b240: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
b250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
b270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
b280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
b290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
b2a0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
b2b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
b2c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
b2d0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b2e0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
b2f0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
b300: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
b310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
b320: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b330: 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zTbl;.  const ch
b340: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20  ar *zCol;.  int 
b350: 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rc;.  Tcl_Obj *p
b360: 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  Ret;..  const ch
b370: 61 72 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20  ar *zDatatype;. 
b380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
b390: 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74  llseq;.  int not
b3a0: 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d  null;.  int prim
b3b0: 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75  arykey;.  int au
b3c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20  toincrement;..  
b3d0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
b3e0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
b3f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b400: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
b410: 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61  "DB dbname tblna
b420: 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20  me colname");.  
b430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b440: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
b450: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
b460: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b470: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
b480: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b490: 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f  OR;.  zDb = Tcl_
b4a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
b4b0: 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c  ]);.  zTbl = Tcl
b4c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b4d0: 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 6f 62  3]);.  zCol = ob
b4e0: 6a 63 3d 3d 35 20 3f 20 54 63 6c 5f 47 65 74 53  jc==5 ? Tcl_GetS
b4f0: 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 20 3a  tring(objv[4]) :
b500: 20 30 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65   0;..  if( strle
b510: 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20  n(zDb)==0 ) zDb 
b520: 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 0;..  rc = sql
b530: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
b540: 6e 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a  n_metadata(db, z
b550: 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20  Db, zTbl, zCol, 
b560: 0a 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70  .      &zDatatyp
b570: 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e  e, &zCollseq, &n
b580: 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79  otnull, &primary
b590: 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d  key, &autoincrem
b5a0: 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  ent);..  if( rc!
b5b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b5c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
b5e0: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
b5f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b600: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
b610: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
b620: 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
b630: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b640: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b650: 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74  StringObj(zDatat
b660: 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ype, -1));.  Tcl
b670: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b680: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
b690: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b6a0: 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a  zCollseq, -1));.
b6b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b6c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
b6d0: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
b6e0: 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54  j(notnull));.  T
b6f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b700: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b710: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70   Tcl_NewIntObj(p
b720: 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54  rimarykey));.  T
b730: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b740: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b750: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61   Tcl_NewIntObj(a
b760: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a  utoincrement));.
b770: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
b780: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
b790: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
b7a0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
b7b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
b7c0: 4c 4f 42 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  LOB..static int 
b7d0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 62 6c  SQLITE_TCLAPI bl
b7e0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
b7f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b800: 6e 74 65 72 70 2c 20 0a 20 20 54 63 6c 5f 4f 62  nterp, .  Tcl_Ob
b810: 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73 71 6c 69 74  j *pObj,.  sqlit
b820: 65 33 5f 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62  e3_blob **ppBlob
b830: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
b840: 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54   int n;..  z = T
b850: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
b860: 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20  Obj(pObj, &n);. 
b870: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
b880: 20 2a 70 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20   *ppBlob = 0;.  
b890: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
b8a0: 6f 74 55 73 65 64 3b 0a 20 20 20 20 54 63 6c 5f  otUsed;.    Tcl_
b8b0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
b8c0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
b8d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
b8e0: 20 20 0a 20 20 20 20 63 68 61 6e 6e 65 6c 20 3d    .    channel =
b8f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
b900: 69 6e 74 65 72 70 2c 20 7a 2c 20 26 6e 6f 74 55  interp, z, &notU
b910: 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 21 63  sed);.    if( !c
b920: 68 61 6e 6e 65 6c 20 29 20 72 65 74 75 72 6e 20  hannel ) return 
b930: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  TCL_ERROR;..    
b940: 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 6e 65  Tcl_Flush(channe
b950: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 65 6b  l);.    Tcl_Seek
b960: 28 63 68 61 6e 6e 65 6c 2c 20 30 2c 20 53 45 45  (channel, 0, SEE
b970: 4b 5f 53 45 54 29 3b 0a 0a 20 20 20 20 69 6e 73  K_SET);..    ins
b980: 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f  tanceData = Tcl_
b990: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
b9a0: 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b  ceData(channel);
b9b0: 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20 2a  .    *ppBlob = *
b9c0: 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a  ((sqlite3_blob *
b9d0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b  *)instanceData);
b9e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
b9f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
ba00: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
ba10: 50 49 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f  PI test_blob_reo
ba20: 70 65 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  pen(.  ClientDat
ba30: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
ba40: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
ba50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ba60: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ba70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ba80: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
ba90: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
baa0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
bab0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bac0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
bad0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
bae0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
baf0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
bb00: 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69  .  Tcl_WideInt i
bb10: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
bb20: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
bb30: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
bb40: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
bb50: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
bb60: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
bb70: 22 43 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29  "CHANNEL ROWID")
bb80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
bb90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
bba0: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
bbb0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
bbc0: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
bbd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bbe0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57  ;.  if( Tcl_GetW
bbf0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
bc00: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
bc10: 69 52 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e  iRowid) ) return
bc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
bc30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
bc40: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
bc50: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63  Rowid);.  if( rc
bc60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bc70: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
bc80: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
bc90: 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
bca0: 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  rc), TCL_VOLATIL
bcb0: 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  E);.  }..  retur
bcc0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
bcd0: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
bce0: 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ERROR);.}..#endi
bcf0: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
bd00: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
bd10: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48  ollation_v2 DB-H
bd20: 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50  ANDLE NAME CMP-P
bd30: 52 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a  ROC DEL-PROC.**.
bd40: 2a 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72  **   This Tcl pr
bd50: 6f 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  oc is used for t
bd60: 65 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72  esting the exper
bd70: 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c  imental.**   sql
bd80: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
bd90: 61 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72  ation_v2() inter
bda0: 66 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  face..*/.struct 
bdb0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b  TestCollationX {
bdc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
bdd0: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
bde0: 20 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62   *pCmp;.  Tcl_Ob
bdf0: 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65  j *pDel;.};.type
be00: 64 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43  def struct TestC
be10: 6f 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f  ollationX TestCo
be20: 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63  llationX;.static
be30: 20 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65   void testCreate
be40: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69  CollationDel(voi
be50: 64 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74  d *pCtx){.  Test
be60: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20  CollationX *p = 
be70: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
be80: 2a 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72  *)pCtx;..  int r
be90: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
bea0: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
beb0: 70 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pDel, TCL_EVAL_D
bec0: 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47  IRECT|TCL_EVAL_G
bed0: 4c 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63  LOBAL);.  if( rc
bee0: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
bef0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
bf00: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
bf10: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
bf20: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29  efCount(p->pCmp)
bf30: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
bf40: 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20  ount(p->pDel);. 
bf50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76   sqlite3_free((v
bf60: 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74  oid *)p);.}.stat
bf70: 69 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74  ic int testCreat
bf80: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20  eCollationCmp(. 
bf90: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
bfa0: 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73  nt nLeft,.  cons
bfb0: 74 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20  t void *zLeft,. 
bfc0: 20 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63   int nRight,.  c
bfd0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68  onst void *zRigh
bfe0: 74 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  t.){.  TestColla
bff0: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
c000: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
c010: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  x;.  Tcl_Obj *pS
c020: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c  cript = Tcl_Dupl
c030: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70  icateObj(p->pCmp
c040: 29 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20  );.  int iRes = 
c050: 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  0;..  Tcl_IncrRe
c060: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
c070: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c090: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0a0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c0b0: 29 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b  )zLeft, nLeft));
c0c0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c0d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c0e0: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0f0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c100: 29 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29  )zRight,nRight))
c110: 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  ;..  if( TCL_OK!
c120: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
c130: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
c140: 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  t, TCL_EVAL_DIRE
c150: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
c160: 41 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  AL).   || TCL_OK
c170: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
c180: 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54  Obj(p->interp, T
c190: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
c1a0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65  p->interp), &iRe
c1b0: 73 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f  s).  ){.    Tcl_
c1c0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
c1d0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
c1e0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c1f0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20  nt(pScript);..  
c200: 72 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73  return iRes;.}.s
c210: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
c220: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 72 65  _TCLAPI test_cre
c230: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c240: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
c250: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
c260: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
c270: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c280: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c290: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c2a0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c2b0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c2c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c2d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c2e0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c2f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c300: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c310: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c320: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
c330: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
c340: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
c350: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
c360: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c370: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c380: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e  jv, "DB-HANDLE N
c390: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
c3a0: 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74  -PROC");.    ret
c3b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c3c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
c3d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
c3e0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c3f0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
c400: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
c410: 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61    p = (TestColla
c420: 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f  tionX *)sqlite3_
c430: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65  malloc(sizeof(Te
c440: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a  stCollationX));.
c450: 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76    p->pCmp = objv
c460: 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d  [3];.  p->pDel =
c470: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69   objv[4];.  p->i
c480: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
c490: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c4a0: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
c4b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c4c0: 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20  p->pDel);..  rc 
c4d0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c4e0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
c4f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c500: 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20  objv[2]), 16, . 
c510: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20       (void *)p, 
c520: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c530: 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61  ionCmp, testCrea
c540: 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20  teCollationDel. 
c550: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c560: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
c570: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c580: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ult(interp, "sql
c590: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c5a0: 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20  ate_v2() failed 
c5b0: 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20  to detect ".    
c5c0: 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e    "an invalid en
c5d0: 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29  coding", (char*)
c5e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
c5f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c600: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
c610: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c620: 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  (db, Tcl_GetStri
c630: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c  ng(objv[2]), SQL
c640: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
c650: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
c660: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c670: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
c680: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
c690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a  .}../*.** USAGE:
c6b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c6c0: 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e  function_v2 DB N
c6d0: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57  AME NARG ENC ?SW
c6e0: 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76  ITCHES?.**.** Av
c6f0: 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73  ailable switches
c700: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66   are:.**.**   -f
c710: 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a  unc    SCRIPT.**
c720: 20 20 20 2d 73 74 65 70 20 20 20 20 53 43 52 49     -step    SCRI
c730: 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20  PT.**   -final  
c740: 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65   SCRIPT.**   -de
c750: 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a  stroy SCRIPT.*/.
c760: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
c770: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
c780: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c790: 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74 65 46  ;.struct CreateF
c7a0: 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63  unctionV2 {.  Tc
c7b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c7c0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75  ;.  Tcl_Obj *pFu
c7d0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
c7e0: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
c7f0: 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63  r function invoc
c800: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ation */.  Tcl_O
c810: 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20  bj *pStep;      
c820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
c830: 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74  ript for agg. st
c840: 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  ep invocation */
c850: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e  .  Tcl_Obj *pFin
c860: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
c870: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
c880: 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69   agg. finalizati
c890: 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  on invocation */
c8a0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73  .  Tcl_Obj *pDes
c8b0: 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20  troy;           
c8c0: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
c8d0: 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74   script */.};.st
c8e0: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e  atic void cf2Fun
c8f0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
c900: 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
c910: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
c920: 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69  **aArg){.}.stati
c930: 63 20 76 6f 69 64 20 63 66 32 53 74 65 70 28 73  c void cf2Step(s
c940: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c950: 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73  ctx, int nArg, s
c960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c970: 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  Arg){.}.static v
c980: 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c  oid cf2Final(sql
c990: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
c9a0: 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  x){.}.static voi
c9b0: 64 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69  d cf2Destroy(voi
c9c0: 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65  d *pUser){.  Cre
c9d0: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
c9e0: 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74 69   = (CreateFuncti
c9f0: 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20  onV2 *)pUser;.. 
ca00: 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26   if( p->interp &
ca10: 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b  & p->pDestroy ){
ca20: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63  .    int rc = Tc
ca30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
ca40: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72  nterp, p->pDestr
ca50: 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  oy, 0);.    if( 
ca60: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c  rc!=TCL_OK ) Tcl
ca70: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
ca80: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
ca90: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63  ..  if( p->pFunc
caa0: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
cab0: 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a  unt(p->pFunc); .
cac0: 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29    if( p->pStep )
cad0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
cae0: 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20  t(p->pStep); .  
caf0: 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20  if( p->pFinal ) 
cb00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cb10: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
cb20: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
cb30: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
cb40: 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b  nt(p->pDestroy);
cb50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65   .  sqlite3_free
cb60: 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  (p);.}.static in
cb70: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
cb80: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
cb90: 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e  tion_v2(.  Clien
cba0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
cbb0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
cbc0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
cbd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cbf0: 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20  he invoking TCL 
cc00: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
cc10: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
cc40: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
cc50: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
cc60: 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  []           /* 
cc70: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
cc80: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
cc90: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
cca0: 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e  har *zFunc;.  in
ccb0: 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e  t nArg;.  int en
ccc0: 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74  c;.  CreateFunct
ccd0: 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20  ionV2 *p;.  int 
cce0: 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  i;.  int rc;..  
ccf0: 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20  struct EncTable 
cd00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
cd10: 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20   *zEnc;.    int 
cd20: 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20  enc;.  } aEnc[] 
cd30: 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c  = {.    {"utf8",
cd40: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
cd50: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c  },.    {"utf16",
cd60: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20     SQLITE_UTF16 
cd70: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65  },.    {"utf16le
cd80: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
cd90: 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  E },.    {"utf16
cda0: 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  be", SQLITE_UTF1
cdb0: 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79  6BE },.    {"any
cdc0: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e  ",     SQLITE_AN
cdd0: 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30  Y },.    {"0", 0
cde0: 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f   }.  };..  if( o
cdf0: 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32  bjc<5 || (objc%2
ce00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )==0 ){.    Tcl_
ce10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ce20: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
ce30: 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20  B NAME NARG ENC 
ce40: 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20  SWITCHES...");. 
ce50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ce60: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
ce70: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ce80: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ce90: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
cea0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ceb0: 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20  RROR;.  zFunc = 
cec0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ced0: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
cee0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
cef0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
cf00: 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e   &nArg) ) return
cf10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
cf20: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
cf30: 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65  omObjStruct(inte
cf40: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e  rp, objv[4], aEn
cf50: 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30  c, sizeof(aEnc[0
cf60: 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  ]), .          "
cf70: 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65  encoding", 0, &e
cf80: 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  nc).  ){.    ret
cf90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cfa0: 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b   }.  enc = aEnc[
cfb0: 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d  enc].enc;..  p =
cfc0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
cfd0: 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e  sizeof(CreateFun
cfe0: 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73  ctionV2));.  ass
cff0: 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73  ert( p );.  mems
d000: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
d010: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
d020: 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  ));.  p->interp 
d030: 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72  = interp;..  for
d040: 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b  (i=5; i<objc; i+
d050: 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77  =2){.    int iSw
d060: 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20  itch;.    const 
d070: 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d  char *azSwitch[]
d080: 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73   = {"-func", "-s
d090: 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20  tep", "-final", 
d0a0: 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a  "-destroy", 0};.
d0b0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
d0c0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
d0d0: 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53  rp, objv[i], azS
d0e0: 77 69 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c  witch, "switch",
d0f0: 20 30 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b   0, &iSwitch) ){
d100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
d110: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ree(p);.      re
d120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d130: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
d140: 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20  h( iSwitch ){.  
d150: 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70      case 0: p->p
d160: 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Func = objv[i+1]
d170: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d180: 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70      case 1: p->p
d190: 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Step = objv[i+1]
d1a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d1b0: 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70      case 2: p->p
d1c0: 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31  Final = objv[i+1
d1d0: 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];     break;.  
d1e0: 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70      case 3: p->p
d1f0: 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69  Destroy = objv[i
d200: 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  +1];   break;.  
d210: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
d220: 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e  >pFunc ) p->pFun
d230: 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  c = Tcl_Duplicat
d240: 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20  eObj(p->pFunc); 
d250: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20  .  if( p->pStep 
d260: 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c  ) p->pStep = Tcl
d270: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
d280: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
d290: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70  p->pFinal ) p->p
d2a0: 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c  Final = Tcl_Dupl
d2b0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e  icateObj(p->pFin
d2c0: 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  al); .  if( p->p
d2d0: 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65  Destroy ) p->pDe
d2e0: 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c  stroy = Tcl_Dupl
d2f0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73  icateObj(p->pDes
d300: 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70  troy); ..  if( p
d310: 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e  ->pFunc ) Tcl_In
d320: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46  crRefCount(p->pF
d330: 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  unc); .  if( p->
d340: 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72  pStep ) Tcl_Incr
d350: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65  RefCount(p->pSte
d360: 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46  p); .  if( p->pF
d370: 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52  inal ) Tcl_IncrR
d380: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61  efCount(p->pFina
d390: 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44  l); .  if( p->pD
d3a0: 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63  estroy ) Tcl_Inc
d3b0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65  rRefCount(p->pDe
d3c0: 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d  stroy); ..  rc =
d3d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d3e0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
d3f0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
d400: 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20  , (void *)p, .  
d410: 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20      (p->pFunc ? 
d420: 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20  cf2Func : 0),.  
d430: 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20      (p->pStep ? 
d440: 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20  cf2Step : 0),.  
d450: 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f      (p->pFinal ?
d460: 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a   cf2Final : 0),.
d470: 20 20 20 20 20 20 63 66 32 44 65 73 74 72 6f 79        cf2Destroy
d480: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
d490: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4a0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
d4b0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
d4c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d4d0: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
d4e0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
d4f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d500: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
d510: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
d520: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
d530: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
d540: 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20   DB-HANDLE FILE 
d550: 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63  ?PROC?.*/.static
d560: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
d570: 50 49 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74  PI test_load_ext
d580: 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ension(.  Client
d590: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
d5a0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
d5b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d5c0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d5d0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d5e0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d5f0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d600: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d610: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d620: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d630: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d640: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d650: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d660: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
d670: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
d680: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
d690: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  rc;.  char *zDb;
d6a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
d6b0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20    char *zProc = 
d6c0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
d6d0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
d6e0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=4 && objc!=3 )
d6f0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
d700: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d710: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
d720: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29  LE FILE ?PROC?")
d730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d740: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
d750: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
d760: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46  g(objv[1]);.  zF
d770: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
d780: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
d790: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
d7a0: 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47     zProc = Tcl_G
d7b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
d7c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  );.  }..  /* Ext
d7d0: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
d7e0: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
d7f0: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
d800: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
d810: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
d820: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
d830: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
d840: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d850: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
d860: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
d870: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
d880: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d890: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
d8a0: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
d8b0: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
d8c0: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
d8d0: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
d8e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64   /* Call the und
d8f0: 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69  erlying C functi
d900: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
d910: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
d920: 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f  o .  ** TCL_ERRO
d930: 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65  R and load any e
d940: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f  rror string into
d950: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
d960: 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72  . If no .  ** er
d970: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d980: 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20  rc to TCL_OK..  
d990: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d9a0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
d9b0: 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49  SION.  rc = SQLI
d9c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72  TE_ERROR;.  zErr
d9d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
d9e0: 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f  tf("this build o
d9f0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
da00: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
da10: 0a 20 20 28 76 6f 69 64 29 7a 50 72 6f 63 3b 0a  .  (void)zProc;.
da20: 20 20 28 76 6f 69 64 29 7a 46 69 6c 65 3b 0a 23    (void)zFile;.#
da30: 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69  else.  rc = sqli
da40: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
da50: 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  on(db, zFile, zP
da60: 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e  roc, &zErr);.#en
da70: 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
da80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
da90: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
daa0: 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72  erp, zErr ? zErr
dab0: 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54   : "", TCL_VOLAT
dac0: 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  ILE);.    rc = T
dad0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  CL_ERROR;.  }els
dae0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  e{.    rc = TCL_
daf0: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
db00: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20  3_free(zErr);.. 
db10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
db20: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
db30: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
db40: 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e  extension DB-HAN
db50: 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61  DLE ONOFF.*/.sta
db60: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
db70: 43 4c 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c  CLAPI test_enabl
db80: 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74  e_load(.  Client
db90: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
dba0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
dbb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dbc0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
dbd0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
dbe0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
dbf0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
dc00: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
dc10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dc20: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
dc30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
dc40: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
dc50: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
dc60: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
dc70: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
dc80: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
dc90: 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f   *zDb;.  int ono
dca0: 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ff;..  if( objc!
dcb0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
dcc0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dcd0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
dce0: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a  HANDLE ONOFF");.
dcf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dd00: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
dd10: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
dd20: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  objv[1]);..  /* 
dd30: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
dd40: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
dd50: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
dd60: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
dd70: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
dd80: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
dd90: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
dda0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ddb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
ddc0: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
ddd0: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
dde0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ddf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
de00: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
de10: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
de20: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
de30: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
de40: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f  ..  /* Get the o
de50: 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a  noff parameter *
de60: 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  /.  if( Tcl_GetB
de70: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
de80: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
de90: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65  onoff) ){.    re
dea0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
deb0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
dec0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
ded0: 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70  ENSION.  Tcl_App
dee0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
def0: 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  , "this build om
df00: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
df10: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
df20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
df30: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  OR;.#else.  sqli
df40: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
df50: 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e  extension(db, on
df60: 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  off);.  return T
df70: 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  CL_OK;.#endif.}.
df80: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
df90: 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a  qlite_abort.**.*
dfa0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
dfb0: 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65  rocess immediate
dfc0: 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74  ly.  This is not
dfd0: 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77   a clean shutdow
dfe0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  n..** This comma
dff0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  nd is used to te
e000: 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61 62  st the recoverab
e010: 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61 62  ility of a datab
e020: 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76  ase in.** the ev
e030: 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d  ent of a program
e040: 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69   crash..*/.stati
e050: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
e060: 41 50 49 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  API sqlite_abort
e070: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
e080: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
e090: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
e0a0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
e0b0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
e0c0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
e0d0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
e0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e0f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e100: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
e110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e120: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
e130: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 64  ment */.){.#if d
e140: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
e150: 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68 69 73  .  /* We do this
e160: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20  , otherwise the 
e170: 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74 20 77  test will halt w
e180: 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65 73 73  ith a popup mess
e190: 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20 77 65  age.   * that we
e1a0: 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b 20 61   have to click a
e1b0: 77 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 74  way before the t
e1c0: 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  est will continu
e1d0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74 5f  e..   */.  _set_
e1e0: 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72 28 20  abort_behavior( 
e1f0: 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54 46  0, _CALL_REPORTF
e200: 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20  AULT );.#endif. 
e210: 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20 61 73   exit(255);.  as
e220: 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20  sert( interp==0 
e230: 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c  );   /* This wil
e240: 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f  l always fail */
e250: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
e260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
e270: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
e280: 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e   is a user-defin
e290: 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ed SQL function 
e2a0: 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a  whose purpose.**
e2b0: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20   is to test the 
e2c0: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
e2d0: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
e2e0: 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63  ic void testFunc
e2f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e300: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
e310: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
e320: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68  ue **argv){.  wh
e330: 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a  ile( argc>=2 ){.
e340: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e350: 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73  zArg0 = (char*)s
e360: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e370: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
e380: 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20  if( zArg0 ){.   
e390: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
e3a0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20  3StrICmp(zArg0, 
e3b0: 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  "int") ){.      
e3c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e3d0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
e3e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
e3f0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e400: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e410: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e420: 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20  "int64")==0 ){. 
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
e440: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
e450: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
e460: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
e470: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
e480: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e490: 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67  mp(zArg0,"string
e4a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e4b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e4c0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
e4d0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
e4e0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
e4f0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
e500: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
e510: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NT);.      }else
e520: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e530: 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c  Cmp(zArg0,"doubl
e540: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
e550: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e560: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
e570: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
e580: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b  ouble(argv[1]));
e590: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e5a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e5b0: 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30  zArg0,"null")==0
e5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e5d0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
e5e0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
e5f0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
e600: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
e610: 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20  value")==0 ){.  
e620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
e630: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
e640: 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33  xt, argv[sqlite3
e650: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
e660: 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1])]);.      }el
e670: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  se{.        goto
e680: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
e690: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e6a0: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
e6b0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
e6c0: 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72  rgc -= 2;.    ar
e6d0: 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  gv += 2;.  }.  r
e6e0: 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75  eturn;..error_ou
e6f0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  t:.  sqlite3_res
e700: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
e710: 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  t,"first argumen
e720: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
e730: 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74  of: ".      "int
e740: 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f   int64 string do
e750: 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22  uble null value"
e760: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
e770: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f  Usage:   sqlite_
e780: 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
e790: 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45  nction  DB  NAME
e7a0: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
e7b0: 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e  the test SQL fun
e7c0: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
e7d0: 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74  abase DB under t
e7e0: 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f  he name NAME..*/
e7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
e800: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72  TE_TCLAPI test_r
e810: 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20  egister_func(.  
e820: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
e830: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e840: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e850: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e860: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e870: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e880: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
e890: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e8a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e8b0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
e8c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
e8d0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
e8e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e8f0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
e900: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
e910: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e920: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
e930: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
e940: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
e950: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
e960: 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22  B FUNCTION-NAME"
e970: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
e980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
e990: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
e9a0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
e9b0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
e9c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
e9d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
e9e0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
e9f0: 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
ea00: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20  ITE_UTF8, 0, .  
ea10: 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c      testFunc, 0,
ea20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
ea30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ea40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ea50: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
ea60: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
ea70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ea80: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  }.  if( sqlite3T
ea90: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
eaa0: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
eab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
ead0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
eae0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
eaf0: 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46  e  STMT .**.** F
eb00: 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d  inalize a statem
eb10: 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
eb20: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
eb30: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 66 69 6e  _TCLAPI test_fin
eb40: 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20  alize(.  void * 
eb50: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
eb60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
eb70: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
eb80: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
eb90: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
eba0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
ebb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
ebc0: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20  te3 *db = 0;..  
ebd0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
ebe0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ebf0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
ec00: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
ec10: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
ec20: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
ec30: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
ec40: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
ec50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ec60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
ec70: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
ec80: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
ec90: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
eca0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
ecb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
ecc0: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
ecd0: 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62     db = StmtToDb
ece0: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
ecf0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
ed00: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54  lize(pStmt);.  T
ed10: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ed20: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
ed30: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
ed40: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
ed50: 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65   db && sqlite3Te
ed60: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
ed70: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
ed80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ed90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
eda0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
edb0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
edc0: 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20  tus  STMT  CODE 
edd0: 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a   RESETFLAG.**.**
ede0: 20 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Get the value o
edf0: 66 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74  f a status count
ee00: 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d  er from a statem
ee10: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
ee20: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
ee30: 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
ee40: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
ee50: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
ee60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ee70: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
ee80: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ee90: 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75  ].){.  int iValu
eea0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d  e;.  int i, op =
eeb0: 20 30 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20   0, resetFlag;. 
eec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
eed0: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Name;.  sqlite3_
eee0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
eef0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
ef00: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
ef10: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ef20: 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70   int op;.  } aOp
ef30: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
ef40: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ef50: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20  FULLSCAN_STEP", 
ef60: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ef70: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
ef80: 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  P   },.    { "SQ
ef90: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
efa0: 53 4f 52 54 22 2c 20 20 20 20 20 20 20 20 20 20  SORT",          
efb0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
efc0: 54 55 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20  TUS_SORT        
efd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
efe0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
eff0: 41 55 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20  AUTOINDEX",     
f000: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f010: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20  TUS_AUTOINDEX   
f020: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f030: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f040: 56 4d 5f 53 54 45 50 22 2c 20 20 20 20 20 20 20  VM_STEP",       
f050: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f060: 54 55 53 5f 56 4d 5f 53 54 45 50 20 20 20 20 20  TUS_VM_STEP     
f070: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f080: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f090: 52 45 50 52 45 50 41 52 45 22 2c 20 20 20 20 20  REPREPARE",     
f0a0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f0b0: 54 55 53 5f 52 45 50 52 45 50 41 52 45 20 20 20  TUS_REPREPARE   
f0c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f0d0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f0e0: 52 55 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  RUN",           
f0f0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f100: 54 55 53 5f 52 55 4e 20 20 20 20 20 20 20 20 20  TUS_RUN         
f110: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f120: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f130: 4d 45 4d 55 53 45 44 22 2c 20 20 20 20 20 20 20  MEMUSED",       
f140: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f150: 54 55 53 5f 4d 45 4d 55 53 45 44 20 20 20 20 20  TUS_MEMUSED     
f160: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66      },.  };.  if
f170: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
f180: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f190: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
f1a0: 76 2c 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54  v, "STMT PARAMET
f1b0: 45 52 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a  ER RESETFLAG");.
f1c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f1d0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
f1e0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
f1f0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f200: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
f210: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
f220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70  TCL_ERROR;.  zOp
f230: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
f240: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
f250: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
f260: 79 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29  ySize(aOp); i++)
f270: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
f280: 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  (aOp[i].zName, z
f290: 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  OpName)==0 ){.  
f2a0: 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e      op = aOp[i].
f2b0: 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
f2c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f2d0: 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f   i>=ArraySize(aO
f2e0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  p) ){.    if( Tc
f2f0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f300: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
f310: 20 26 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54   &op) ) return T
f320: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f330: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
f340: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
f350: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65  , objv[3], &rese
f360: 74 46 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20  tFlag) ) return 
f370: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61  TCL_ERROR;.  iVa
f380: 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  lue = sqlite3_st
f390: 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c  mt_status(pStmt,
f3a0: 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b   op, resetFlag);
f3b0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
f3c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
f3d0: 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65  NewIntObj(iValue
f3e0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
f3f0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
f400: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f410: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a  T_SCANSTATUS./*.
f420: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f430: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f440: 75 73 20 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73  us STMT IDX.*/.s
f450: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
f460: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d  _TCLAPI test_stm
f470: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 0a 20 20  t_scanstatus(.  
f480: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f490: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
f4a0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
f4b0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
f4c0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
f4d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
f4e0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
f4f0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
f500: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ent */.  int idx
f510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f520: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
f530: 6e 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 0a  nd argument */..
f540: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
f550: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
f560: 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 73  r *zExplain;.  s
f570: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f  qlite3_int64 nLo
f580: 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  op;.  sqlite3_in
f590: 74 36 34 20 6e 56 69 73 69 74 3b 0a 20 20 64 6f  t64 nVisit;.  do
f5a0: 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 69 6e 74  uble rEst;.  int
f5b0: 20 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   res;..  if( obj
f5c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f5d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f5e0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
f5f0: 54 4d 54 20 49 44 58 22 29 3b 0a 20 20 20 20 72  TMT IDX");.    r
f600: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f610: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
f620: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
f630: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
f640: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
f650: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f660: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
f670: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
f680: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
f690: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
f6a0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65 73 20  L_ERROR;..  res 
f6b0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
f6c0: 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c  canstatus(pStmt,
f6d0: 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41   idx, SQLITE_SCA
f6e0: 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
f6f0: 69 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20 20 69  id*)&nLoop);.  i
f700: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
f710: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
f720: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
f730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f750: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
f760: 6e 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c 20 2d  ngObj("nLoop", -
f770: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f780: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f790: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f7a0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 4c 6f  ewWideIntObj(nLo
f7b0: 6f 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  op));.    sqlite
f7c0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f7d0: 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51  s(pStmt, idx, SQ
f7e0: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56  LITE_SCANSTAT_NV
f7f0: 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56  ISIT, (void*)&nV
f800: 69 73 69 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  isit);.    Tcl_L
f810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f820: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f830: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
f840: 56 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a 20 20  Visit", -1));.  
f850: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f860: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f870: 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  et, Tcl_NewWideI
f880: 6e 74 4f 62 6a 28 6e 56 69 73 69 74 29 29 3b 0a  ntObj(nVisit));.
f890: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f8a0: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f8b0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f8c0: 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f  CANSTAT_EST, (vo
f8d0: 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20  id*)&rEst);.    
f8e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f8f0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f900: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f910: 62 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29 29 3b  bj("nEst", -1));
f920: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f930: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f940: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 44 6f   pRet, Tcl_NewDo
f950: 75 62 6c 65 4f 62 6a 28 72 45 73 74 29 29 3b 0a  ubleObj(rEst));.
f960: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f970: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f980: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f990: 43 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20 28 76  CANSTAT_NAME, (v
f9a0: 6f 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a 20 20  oid*)&zName);.  
f9b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f9c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f9d0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f9e0: 67 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20 2d 31  gObj("zName", -1
f9f0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
fa00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fa10: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
fa20: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65  wStringObj(zName
fa30: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  , -1));.    sqli
fa40: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fa50: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
fa60: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
fa70: 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29  EXPLAIN, (void*)
fa80: 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  &zExplain);.    
fa90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
faa0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
fab0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fac0: 62 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c 20 2d  bj("zExplain", -
fad0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
fae0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
faf0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
fb00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 78 70  ewStringObj(zExp
fb10: 6c 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20 20 20  lain, -1));.    
fb20: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
fb30: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
fb40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
fb50: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
fb60: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  erp);.  }.  retu
fb70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
fb80: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
fb90: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fba0: 74 75 73 5f 72 65 73 65 74 20 20 53 54 4d 54 0a  tus_reset  STMT.
fbb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
fbc0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
fbd0: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
fbe0: 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a  _reset(.  void *
fbf0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
fc00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fc10: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
fc20: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
fc30: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
fc40: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fc60: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f  irst argument */
fc70: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
fc80: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
fc90: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fca0: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
fcb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fcc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
fcd0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
fce0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
fcf0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
fd00: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
fd10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
fd20: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
fd30: 74 61 74 75 73 5f 72 65 73 65 74 28 70 53 74 6d  tatus_reset(pStm
fd40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
fd50: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
fd60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fd70: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
fd80: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
fd90: 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 0a 2a  _config_sqllog.*
fda0: 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 53 51  *.** Zero the SQ
fdb0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
fdc0: 4f 47 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  OG configuration
fdd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
fde0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
fdf0: 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 28  t_config_sqllog(
fe00: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
fe10: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
fe20: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
fe30: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
fe40: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
fe50: 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  ){.  if( objc!=1
fe60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
fe70: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fe80: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
fe90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fea0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
feb0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
fec0: 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 2c 20  _CONFIG_SQLLOG, 
fed0: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
fee0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
fef0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
ff00: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 73  sqlite3_config_s
ff10: 6f 72 74 65 72 72 65 66 0a 2a 2a 0a 2a 2a 20 53  orterref.**.** S
ff20: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 43 4f  et the SQLITE_CO
ff30: 4e 46 49 47 5f 53 4f 52 54 45 52 52 45 46 5f 53  NFIG_SORTERREF_S
ff40: 49 5a 45 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  IZE configuratio
ff50: 6e 20 6f 70 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  n option.*/.stat
ff60: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
ff70: 4c 41 50 49 20 74 65 73 74 5f 63 6f 6e 66 69 67  LAPI test_config
ff80: 5f 73 6f 72 74 65 72 72 65 66 28 0a 20 20 76 6f  _sorterref(.  vo
ff90: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
ffa0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
ffb0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
ffc0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
ffd0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
ffe0: 69 6e 74 20 69 56 61 6c 3b 0a 20 20 69 66 28 20  int iVal;.  if( 
fff0: 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10000 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10010 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10020 20 22 4e 42 59 54 45 22 29 3b 0a 20 20 20 20 72   "NBYTE");.    r
10030 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10040 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
10050 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
10060 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 69  erp, objv[1], &i
10070 56 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  Val) ) return TC
10080 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
10090 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
100a0 5f 43 4f 4e 46 49 47 5f 53 4f 52 54 45 52 52 45  _CONFIG_SORTERRE
100b0 46 5f 53 49 5a 45 2c 20 69 56 61 6c 29 3b 0a 20  F_SIZE, iVal);. 
100c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
100d0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
100e0 76 66 73 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  vfs_current_time
100f0 5f 69 6e 74 36 34 0a 2a 2a 0a 2a 2a 20 52 65 74  _int64.**.** Ret
10100 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  urn the value re
10110 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 64 65  turned by the de
10120 66 61 75 6c 74 20 56 46 53 27 73 20 78 43 75 72  fault VFS's xCur
10130 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 6d 65  rentTimeInt64 me
10140 74 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  thod..*/.static 
10150 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
10160 49 20 76 66 73 43 75 72 72 65 6e 74 54 69 6d 65  I vfsCurrentTime
10170 49 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  Int64(.  void * 
10180 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10190 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
101a0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
101b0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
101c0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 36 34 20 74  bjv[].){.  i64 t
101d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  ;.  sqlite3_vfs 
101e0 2a 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  *pVfs = sqlite3_
101f0 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69  vfs_find(0);.  i
10200 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
10210 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
10220 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
10230 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74  jv, "");.    ret
10240 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10250 20 7d 0a 20 20 70 56 66 73 2d 3e 78 43 75 72 72   }.  pVfs->xCurr
10260 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66  entTimeInt64(pVf
10270 73 2c 20 26 74 29 3b 0a 20 20 54 63 6c 5f 53 65  s, &t);.  Tcl_Se
10280 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
10290 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
102a0 74 4f 62 6a 28 74 29 29 3b 0a 20 20 72 65 74 75  tObj(t));.  retu
102b0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69  rn TCL_OK;.}..#i
102c0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
102d0 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
102e0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
102f0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 20 44 42  _snapshot_get DB
10300 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69   DBNAME.*/.stati
10310 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
10320 41 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f  API test_snapsho
10330 74 5f 67 65 74 28 0a 20 20 76 6f 69 64 20 2a 20  t_get(.  void * 
10340 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10350 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10360 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10370 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10380 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72  bjv[].){.  int r
10390 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c;.  sqlite3 *db
103a0 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  ;.  char *zName;
103b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  .  sqlite3_snaps
103c0 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 20 3d  hot *pSnapshot =
103d0 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   0;..  if( objc!
103e0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
103f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10400 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
10410 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65  DBNAME");.    re
10420 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10430 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
10440 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
10450 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10460 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
10470 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10480 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65    zName = Tcl_Ge
10490 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
104a0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
104b0 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 64  3_snapshot_get(d
104c0 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 53 6e 61 70  b, zName, &pSnap
104d0 73 68 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 21  shot);.  if( rc!
104e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
104f0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10500 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
10510 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
10520 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
10530 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  -1));.    return
10540 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
10550 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42  lse{.    char zB
10560 75 66 5b 31 30 30 5d 3b 0a 20 20 20 20 69 66 28  uf[100];.    if(
10570 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
10580 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
10590 70 2c 20 7a 42 75 66 2c 20 70 53 6e 61 70 73 68  p, zBuf, pSnapsh
105a0 6f 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ot) ) return TCL
105b0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
105c0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
105d0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
105e0 6e 67 4f 62 6a 28 7a 42 75 66 2c 20 2d 31 29 29  ngObj(zBuf, -1))
105f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
10600 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
10610 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10620 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
10630 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10640 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
10650 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
10660 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76 65  _snapshot_recove
10670 72 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73  r DB DBNAME.*/.s
10680 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
10690 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61  _TCLAPI test_sna
106a0 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 0a 20  pshot_recover(. 
106b0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
106c0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
106d0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
106e0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
106f0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
10700 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
10710 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
10720 20 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 69 66 28 20   *zName;..  if( 
10730 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
10740 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10750 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10760 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20   "DB DBNAME");. 
10770 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10780 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
10790 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
107a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
107b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
107c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
107d0 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54  ROR;.  zName = T
107e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
107f0 76 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73  v[2]);..  rc = s
10800 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
10810 72 65 63 6f 76 65 72 28 64 62 2c 20 7a 4e 61 6d  recover(db, zNam
10820 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  e);.  if( rc!=SQ
10830 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
10840 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10850 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
10860 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
10870 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29  ErrName(rc), -1)
10880 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
10890 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65  L_ERROR;.  }else
108a0 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  {.    Tcl_ResetR
108b0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
108c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
108d0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
108e0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
108f0 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65  APSHOT */..#ifde
10900 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
10910 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55  SNAPSHOT./*.** U
10920 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
10930 61 70 73 68 6f 74 5f 6f 70 65 6e 20 44 42 20 44  apshot_open DB D
10940 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 0a 2a  BNAME SNAPSHOT.*
10950 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
10960 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
10970 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20  snapshot_open(. 
10980 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
10990 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
109a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
109b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
109c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
109d0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
109e0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
109f0 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74   *zName;.  sqlit
10a00 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e  e3_snapshot *pSn
10a10 61 70 73 68 6f 74 3b 0a 0a 20 20 69 66 28 20 6f  apshot;..  if( o
10a20 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
10a30 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10a40 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
10a50 22 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53  "DB DBNAME SNAPS
10a60 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  HOT");.    retur
10a70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10a80 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
10a90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10aa0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
10ab0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
10ac0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
10ad0 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
10ae0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
10af0 20 70 53 6e 61 70 73 68 6f 74 20 3d 20 28 73 71   pSnapshot = (sq
10b00 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29  lite3_snapshot*)
10b10 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
10b20 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69  oPtr(Tcl_GetStri
10b30 6e 67 28 6f 62 6a 76 5b 33 5d 29 29 3b 0a 0a 20  ng(objv[3]));.. 
10b40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e   rc = sqlite3_sn
10b50 61 70 73 68 6f 74 5f 6f 70 65 6e 28 64 62 2c 20  apshot_open(db, 
10b60 7a 4e 61 6d 65 2c 20 70 53 6e 61 70 73 68 6f 74  zName, pSnapshot
10b70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10b80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
10b90 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10ba0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
10bb0 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45  ringObj(sqlite3E
10bc0 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29  rrName(rc), -1))
10bd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10be0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
10bf0 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
10c00 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
10c10 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
10c20 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
10c30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
10c40 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66  PSHOT */..#ifdef
10c50 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10c60 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73  NAPSHOT./*.** Us
10c70 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61  age: sqlite3_sna
10c80 70 73 68 6f 74 5f 66 72 65 65 20 53 4e 41 50 53  pshot_free SNAPS
10c90 48 4f 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  HOT.*/.static in
10ca0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
10cb0 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 66 72  test_snapshot_fr
10cc0 65 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ee(.  void * cli
10cd0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10ce0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10cf0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10d00 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10d10 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
10d20 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
10d30 68 6f 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  hot;.  if( objc!
10d40 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
10d50 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
10d60 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4e 41  p, 1, objv, "SNA
10d70 50 53 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74  PSHOT");.    ret
10d80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10d90 20 7d 0a 20 20 70 53 6e 61 70 73 68 6f 74 20 3d   }.  pSnapshot =
10da0 20 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68   (sqlite3_snapsh
10db0 6f 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  ot*)sqlite3TestT
10dc0 65 78 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74  extToPtr(Tcl_Get
10dd0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29  String(objv[1]))
10de0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ;.  sqlite3_snap
10df0 73 68 6f 74 5f 66 72 65 65 28 70 53 6e 61 70 73  shot_free(pSnaps
10e00 68 6f 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  hot);.  return T
10e10 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
10e20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10e30 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
10e40 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10e50 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
10e60 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
10e70 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 20 53 4e  _snapshot_cmp SN
10e80 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48 4f 54  APSHOT1 SNAPSHOT
10e90 32 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  2.*/.static int 
10ea0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
10eb0 73 74 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28  st_snapshot_cmp(
10ec0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
10ed0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
10ee0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
10ef0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
10f00 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
10f10 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20  ){.  int res;.  
10f20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10f30 20 2a 70 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *p1;.  sqlite3_
10f40 73 6e 61 70 73 68 6f 74 20 2a 70 32 3b 0a 20 20  snapshot *p2;.  
10f50 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
10f60 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10f70 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
10f80 62 6a 76 2c 20 22 53 4e 41 50 53 48 4f 54 31 20  bjv, "SNAPSHOT1 
10f90 53 4e 41 50 53 48 4f 54 32 22 29 3b 0a 20 20 20  SNAPSHOT2");.   
10fa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10fb0 52 3b 0a 20 20 7d 0a 20 20 70 31 20 3d 20 28 73  R;.  }.  p1 = (s
10fc0 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a  qlite3_snapshot*
10fd0 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74  )sqlite3TestText
10fe0 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72  ToPtr(Tcl_GetStr
10ff0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20  ing(objv[1]));. 
11000 20 70 32 20 3d 20 28 73 71 6c 69 74 65 33 5f 73   p2 = (sqlite3_s
11010 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74 65 33  napshot*)sqlite3
11020 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 54 63  TestTextToPtr(Tc
11030 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11040 5b 32 5d 29 29 3b 0a 20 20 72 65 73 20 3d 20 73  [2]));.  res = s
11050 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
11060 63 6d 70 28 70 31 2c 20 70 32 29 3b 0a 20 20 54  cmp(p1, p2);.  T
11070 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11080 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
11090 6e 74 4f 62 6a 28 72 65 73 29 29 3b 0a 20 20 72  ntObj(res));.  r
110a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
110b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
110c0 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
110d0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
110e0 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
110f0 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  OT./*.** Usage: 
11100 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11110 5f 67 65 74 5f 62 6c 6f 62 20 44 42 20 44 42 4e  _get_blob DB DBN
11120 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  AME.*/.static in
11130 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
11140 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 67 65  test_snapshot_ge
11150 74 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  t_blob(.  void *
11160 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
11170 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
11180 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
11190 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
111a0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
111b0 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
111c0 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  b;.  char *zName
111d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ;.  sqlite3_snap
111e0 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 20  shot *pSnapshot 
111f0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
11200 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
11210 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11220 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
11230 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72   DBNAME");.    r
11240 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11250 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
11260 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
11270 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11280 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
11290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
112a0 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47  .  zName = Tcl_G
112b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
112c0 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
112d0 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28  e3_snapshot_get(
112e0 64 62 2c 20 7a 4e 61 6d 65 2c 20 26 70 53 6e 61  db, zName, &pSna
112f0 70 73 68 6f 74 29 3b 0a 20 20 69 66 28 20 72 63  pshot);.  if( rc
11300 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11310 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
11320 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
11330 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
11340 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
11350 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72   -1));.    retur
11360 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11370 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65  else{.    Tcl_Se
11380 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
11390 70 2c 20 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  p, .        Tcl_
113a0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
113b0 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29  (unsigned char*)
113c0 70 53 6e 61 70 73 68 6f 74 2c 20 73 69 7a 65 6f  pSnapshot, sizeo
113d0 66 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  f(sqlite3_snapsh
113e0 6f 74 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  ot)).    );.    
113f0 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11400 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29  _free(pSnapshot)
11410 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
11420 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
11430 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
11440 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
11450 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
11460 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 20 20 2f 2a  LE_SNAPSHOT.  /*
11470 0a 20 20 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  .  ** Usage: sql
11480 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  ite3_snapshot_op
11490 65 6e 5f 62 6c 6f 62 20 44 42 20 44 42 4e 41 4d  en_blob DB DBNAM
114a0 45 20 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73 74  E SNAPSHOT.*/.st
114b0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
114c0 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70  TCLAPI test_snap
114d0 73 68 6f 74 5f 6f 70 65 6e 5f 62 6c 6f 62 28 0a  shot_open_blob(.
114e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
114f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
11500 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
11510 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
11520 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
11530 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
11540 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
11550 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 75 6e 73 69  r *zName;.  unsi
11560 67 6e 65 64 20 63 68 61 72 20 2a 70 42 6c 6f 62  gned char *pBlob
11570 3b 0a 20 20 69 6e 74 20 6e 42 6c 6f 62 3b 0a 0a  ;.  int nBlob;..
11580 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
11590 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
115a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
115b0 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d   objv, "DB DBNAM
115c0 45 20 53 4e 41 50 53 48 4f 54 22 29 3b 0a 20 20  E SNAPSHOT");.  
115d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
115e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
115f0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
11600 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
11610 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
11620 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
11630 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63  OR;.  zName = Tc
11640 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11650 5b 32 5d 29 3b 0a 20 20 70 42 6c 6f 62 20 3d 20  [2]);.  pBlob = 
11660 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
11670 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
11680 20 26 6e 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20   &nBlob);.  if( 
11690 6e 42 6c 6f 62 21 3d 73 69 7a 65 6f 66 28 73 71  nBlob!=sizeof(sq
116a0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 29 20  lite3_snapshot) 
116b0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
116c0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
116d0 22 62 61 64 20 53 4e 41 50 53 48 4f 54 22 2c 20  "bad SNAPSHOT", 
116e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
116f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
11700 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61  rc = sqlite3_sna
11710 70 73 68 6f 74 5f 6f 70 65 6e 28 64 62 2c 20 7a  pshot_open(db, z
11720 4e 61 6d 65 2c 20 28 73 71 6c 69 74 65 33 5f 73  Name, (sqlite3_s
11730 6e 61 70 73 68 6f 74 2a 29 70 42 6c 6f 62 29 3b  napshot*)pBlob);
11740 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11750 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
11760 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11770 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
11780 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72  ngObj(sqlite3Err
11790 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a  Name(rc), -1));.
117a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
117b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75  RROR;.  }.  retu
117c0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
117d0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
117e0 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f  ABLE_SNAPSHOT */
117f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
11800 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a  ENABLE_SNAPSHOT.
11810 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
11820 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63 6d  ite3_snapshot_cm
11830 70 5f 62 6c 6f 62 20 53 4e 41 50 53 48 4f 54 31  p_blob SNAPSHOT1
11840 20 53 4e 41 50 53 48 4f 54 32 0a 2a 2f 0a 73 74   SNAPSHOT2.*/.st
11850 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
11860 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70  TCLAPI test_snap
11870 73 68 6f 74 5f 63 6d 70 5f 62 6c 6f 62 28 0a 20  shot_cmp_blob(. 
11880 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
11890 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
118a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
118b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
118c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
118d0 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 75 6e  .  int res;.  un
118e0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 31 3b  signed char *p1;
118f0 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
11900 20 2a 70 32 3b 0a 20 20 69 6e 74 20 6e 31 3b 0a   *p2;.  int n1;.
11910 20 20 69 6e 74 20 6e 32 3b 0a 0a 20 20 69 66 28    int n2;..  if(
11920 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
11930 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11940 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11950 2c 20 22 53 4e 41 50 53 48 4f 54 31 20 53 4e 41  , "SNAPSHOT1 SNA
11960 50 53 48 4f 54 32 22 29 3b 0a 20 20 20 20 72 65  PSHOT2");.    re
11970 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11980 20 20 7d 0a 0a 20 20 70 31 20 3d 20 54 63 6c 5f    }..  p1 = Tcl_
11990 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
119a0 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 6e 31  Obj(objv[1], &n1
119b0 29 3b 0a 20 20 70 32 20 3d 20 54 63 6c 5f 47 65  );.  p2 = Tcl_Ge
119c0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
119d0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 32 29 3b  j(objv[2], &n2);
119e0 0a 0a 20 20 69 66 28 20 6e 31 21 3d 73 69 7a 65  ..  if( n1!=size
119f0 6f 66 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  of(sqlite3_snaps
11a00 68 6f 74 29 20 7c 7c 20 6e 31 21 3d 6e 32 20 29  hot) || n1!=n2 )
11a10 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11a20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11a30 62 61 64 20 53 4e 41 50 53 48 4f 54 22 2c 20 30  bad SNAPSHOT", 0
11a40 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11a50 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
11a60 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e  res = sqlite3_sn
11a70 61 70 73 68 6f 74 5f 63 6d 70 28 28 73 71 6c 69  apshot_cmp((sqli
11a80 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 70 31  te3_snapshot*)p1
11a90 2c 20 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  , (sqlite3_snaps
11aa0 68 6f 74 2a 29 70 32 29 3b 0a 20 20 54 63 6c 5f  hot*)p2);.  Tcl_
11ab0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11ac0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
11ad0 62 6a 28 72 65 73 29 29 3b 0a 20 20 72 65 74 75  bj(res));.  retu
11ae0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
11af0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
11b00 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f  ABLE_SNAPSHOT */
11b10 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
11b20 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64 61  qlite3_delete_da
11b30 74 61 62 61 73 65 20 46 49 4c 45 4e 41 4d 45 0a  tabase FILENAME.
11b40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
11b50 65 6c 65 74 65 5f 64 61 74 61 62 61 73 65 28 63  elete_database(c
11b60 6f 6e 73 74 20 63 68 61 72 2a 29 3b 20 20 20 2f  onst char*);   /
11b70 2a 20 69 6e 20 74 65 73 74 5f 64 65 6c 65 74 65  * in test_delete
11b80 2e 63 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .c */.static int
11b90 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
11ba0 65 73 74 5f 64 65 6c 65 74 65 5f 64 61 74 61 62  est_delete_datab
11bb0 61 73 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ase(.  void * cl
11bc0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
11bd0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
11be0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
11bf0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
11c00 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  v[].){.  int rc;
11c10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11c20 46 69 6c 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63  File;.  if( objc
11c30 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
11c40 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
11c50 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
11c60 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  LE");.    return
11c70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11c80 20 20 7a 46 69 6c 65 20 3d 20 28 63 6f 6e 73 74    zFile = (const
11c90 20 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 53 74   char*)Tcl_GetSt
11ca0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
11cb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64 65   rc = sqlite3_de
11cc0 6c 65 74 65 5f 64 61 74 61 62 61 73 65 28 7a 46  lete_database(zF
11cd0 69 6c 65 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74  ile);..  Tcl_Set
11ce0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
11cf0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
11d00 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d  bj(sqlite3ErrNam
11d10 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 72  e(rc), -1));.  r
11d20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
11d30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 74  ./*.** Usage: at
11d40 6f 6d 69 63 5f 62 61 74 63 68 5f 77 72 69 74 65  omic_batch_write
11d50 20 50 41 54 48 0a 2a 2f 0a 73 74 61 74 69 63 20   PATH.*/.static 
11d60 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
11d70 49 20 74 65 73 74 5f 61 74 6f 6d 69 63 5f 62 61  I test_atomic_ba
11d80 74 63 68 5f 77 72 69 74 65 28 0a 20 20 76 6f 69  tch_write(.  voi
11d90 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
11da0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
11db0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
11dc0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
11dd0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
11de0 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 30 3b 20  har *zFile = 0; 
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e00 2a 20 50 61 74 68 20 74 6f 20 66 69 6c 65 20 74  * Path to file t
11e10 6f 20 74 65 73 74 20 2a 2f 0a 20 20 73 71 6c 69  o test */.  sqli
11e20 74 65 33 20 2a 64 62 20 3d 20 30 3b 20 20 20 20  te3 *db = 0;    
11e30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
11e40 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a  atabase handle *
11e50 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
11e60 20 2a 70 46 64 20 3d 20 30 3b 20 20 20 20 20 20   *pFd = 0;      
11e70 20 20 20 20 2f 2a 20 53 51 4c 69 74 65 20 66 64      /* SQLite fd
11e80 20 6f 70 65 6e 20 6f 6e 20 7a 46 69 6c 65 20 2a   open on zFile *
11e90 2f 0a 20 20 69 6e 74 20 62 52 65 73 20 3d 20 30  /.  int bRes = 0
11ea0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11eb0 20 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 72      /* Integer r
11ec0 65 73 75 6c 74 20 6f 66 20 74 68 69 73 20 63 6f  esult of this co
11ed0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 64  mmand */.  int d
11ee0 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  c = 0;          
11ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65             /* De
11f00 76 69 63 65 2d 63 68 61 72 61 63 74 65 72 69 73  vice-characteris
11f10 74 69 63 73 20 6d 61 73 6b 20 2a 2f 0a 20 20 69  tics mask */.  i
11f20 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11f40 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  * sqlite3_open()
11f50 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   return code */.
11f60 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
11f70 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
11f80 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
11f90 2c 20 6f 62 6a 76 2c 20 22 50 41 54 48 22 29 3b  , objv, "PATH");
11fa0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11fb0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69  ERROR;.  }.  zFi
11fc0 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  le = Tcl_GetStri
11fd0 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20  ng(objv[1]);..  
11fe0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
11ff0 6e 28 7a 46 69 6c 65 2c 20 26 64 62 29 3b 0a 20  n(zFile, &db);. 
12000 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12010 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  OK ){.    Tcl_Ap
12020 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12030 70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  p, sqlite3_errms
12040 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 73  g(db), 0);.    s
12050 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
12060 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
12070 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
12080 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
12090 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d 61  _control(db, "ma
120a0 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  in", SQLITE_FCNT
120b0 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 2c 20  L_FILE_POINTER, 
120c0 28 76 6f 69 64 2a 29 26 70 46 64 29 3b 0a 20 20  (void*)&pFd);.  
120d0 64 63 20 3d 20 70 46 64 2d 3e 70 4d 65 74 68 6f  dc = pFd->pMetho
120e0 64 73 2d 3e 78 44 65 76 69 63 65 43 68 61 72 61  ds->xDeviceChara
120f0 63 74 65 72 69 73 74 69 63 73 28 70 46 64 29 3b  cteristics(pFd);
12100 0a 20 20 69 66 28 20 64 63 20 26 20 53 51 4c 49  .  if( dc & SQLI
12110 54 45 5f 49 4f 43 41 50 5f 42 41 54 43 48 5f 41  TE_IOCAP_BATCH_A
12120 54 4f 4d 49 43 20 29 7b 0a 20 20 20 20 62 52 65  TOMIC ){.    bRe
12130 73 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 54 63  s = 1;.  }..  Tc
12140 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
12150 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
12160 74 4f 62 6a 28 62 52 65 73 29 29 3b 0a 20 20 73  tObj(bRes));.  s
12170 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
12180 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
12190 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
121a0 65 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  e:  sqlite3_next
121b0 5f 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a  _stmt  DB  STMT.
121c0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
121d0 20 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69   next statment i
121e0 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
121f0 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
12200 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
12210 50 49 20 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d  PI test_next_stm
12220 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
12230 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
12240 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
12250 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
12260 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
12270 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
12280 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 73 71  tmt *pStmt;.  sq
12290 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 20  lite3 *db = 0;. 
122a0 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
122b0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
122c0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
122d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
122e0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
122f0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
12300 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
12310 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
12320 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54 4d 54  ], 0), " DB STMT
12330 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
12340 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
12350 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ..  if( getDbPoi
12360 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
12370 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
12380 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
12390 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
123a0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
123b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
123c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
123d0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
123e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
123f0 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 33   pStmt = sqlite3
12400 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c 20 70  _next_stmt(db, p
12410 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74  Stmt);.  if( pSt
12420 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
12430 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
12440 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
12450 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
12460 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12470 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
12480 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
12490 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
124a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
124b0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
124c0 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f  lite3_stmt_reado
124d0 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  nly  STMT.**.** 
124e0 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53  Return true if S
124f0 54 4d 54 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f  TMT is a NULL po
12500 69 6e 74 65 72 20 6f 72 20 61 20 70 6f 69 6e 74  inter or a point
12510 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e  er to a statemen
12520 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 67 75 61  t.** that is gua
12530 72 61 6e 74 65 65 64 20 74 6f 20 6c 65 61 76 65  ranteed to leave
12540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 75 6e   the database un
12550 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73 74 61  modified..*/.sta
12560 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
12570 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f  CLAPI test_stmt_
12580 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69 64  readonly(.  void
12590 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
125a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
125b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
125c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
125d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
125e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
125f0 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
12600 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
12610 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
12620 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
12630 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
12640 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
12650 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
12660 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
12670 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b  0), " STMT", 0);
12680 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12690 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
126a0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
126b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
126c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
126d0 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
126e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
126f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  c = sqlite3_stmt
12700 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29  _readonly(pStmt)
12710 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
12720 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
12730 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72  _NewBooleanObj(r
12740 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
12750 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
12760 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
12770 74 6d 74 5f 62 75 73 79 20 20 53 54 4d 54 0a 2a  tmt_busy  STMT.*
12780 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
12790 20 69 66 20 53 54 4d 54 20 69 73 20 61 20 6e 6f   if STMT is a no
127a0 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 74  n-NULL pointer t
127b0 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  o a statement.**
127c0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 73   that has been s
127d0 74 65 70 70 65 64 20 62 75 74 20 6e 6f 74 20 74  tepped but not t
127e0 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2f  o completion..*/
127f0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
12800 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
12810 74 6d 74 5f 62 75 73 79 28 0a 20 20 76 6f 69 64  tmt_busy(.  void
12820 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
12830 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
12840 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
12850 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
12860 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
12870 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
12880 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
12890 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
128a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
128b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
128c0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
128d0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
128e0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
128f0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
12900 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b  0), " STMT", 0);
12910 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12920 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
12930 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
12940 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
12950 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
12960 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
12970 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
12980 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  c = sqlite3_stmt
12990 5f 62 75 73 79 28 70 53 74 6d 74 29 3b 0a 20 20  _busy(pStmt);.  
129a0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
129b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
129c0 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b  BooleanObj(rc));
129d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
129e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
129f0 3a 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  :  uses_stmt_jou
12a00 72 6e 61 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  rnal  STMT.**.**
12a10 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
12a20 53 54 4d 54 20 75 73 65 73 20 61 20 73 74 61 74  STMT uses a stat
12a30 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
12a40 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
12a50 49 54 45 5f 54 43 4c 41 50 49 20 75 73 65 73 5f  ITE_TCLAPI uses_
12a60 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20  stmt_journal(.  
12a70 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
12a80 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
12a90 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
12aa0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
12ab0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
12ac0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12ad0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
12ae0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
12af0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
12b00 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
12b10 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
12b20 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
12b30 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
12b40 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
12b50 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
12b60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12b70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
12b80 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
12b90 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
12ba0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
12bb0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
12bc0 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
12bd0 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70  _stmt_readonly(p
12be0 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
12bf0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12c00 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
12c10 4f 62 6a 28 28 28 56 64 62 65 20 2a 29 70 53 74  Obj(((Vdbe *)pSt
12c20 6d 74 29 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  mt)->usesStmtJou
12c30 72 6e 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  rnal));.  return
12c40 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
12c50 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
12c60 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a  e3_reset  STMT .
12c70 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73 74  **.** Reset a st
12c80 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a  atement handle..
12c90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
12ca0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
12cb0 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a  _reset(.  void *
12cc0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
12cd0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
12ce0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
12cf0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
12d00 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
12d10 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
12d20 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
12d30 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
12d40 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
12d50 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
12d60 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
12d70 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
12d80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
12d90 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
12da0 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b  , " <STMT>", 0);
12db0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12dc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
12dd0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
12de0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
12df0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
12e00 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
12e10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
12e20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
12e30 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
12e40 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65   pStmt && sqlite
12e50 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
12e60 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
12e70 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20  tmt), rc) ){.   
12e80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12e90 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
12ea0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
12eb0 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
12ec0 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
12ed0 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63  IC);./*.  if( rc
12ee0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
12ef0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f  CL_ERROR;.  }.*/
12f00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12f10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
12f20 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72  :  sqlite3_expir
12f30 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  ed STMT .**.** R
12f40 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
12f50 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
12f60 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
12f70 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a  s recommended..*
12f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
12f90 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
12fa0 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69 64 20  expired(.  void 
12fb0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
12fc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12fd0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
12fe0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
12ff0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
13000 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
13010 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69  EPRECATED.  sqli
13020 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13030 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
13040 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
13050 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
13060 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
13070 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
13080 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
13090 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
130a0 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22  ], 0), " <STMT>"
130b0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
130c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
130d0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
130e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
130f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13100 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
13110 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13120 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
13130 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
13140 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71  NewBooleanObj(sq
13150 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70 53  lite3_expired(pS
13160 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20  tmt)));.#endif. 
13170 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
13180 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
13190 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65   sqlite3_transfe
131a0 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d 53  r_bindings FROMS
131b0 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a  TMT TOSTMT.**.**
131c0 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62 69   Transfer all bi
131d0 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f 4d  ndings from FROM
131e0 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f 53  STMT over to TOS
131f0 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  TMT.*/.static in
13200 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
13210 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69  test_transfer_bi
13220 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nd(.  void * cli
13230 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
13240 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
13250 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
13260 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
13270 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
13280 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
13290 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73  ATED.  sqlite3_s
132a0 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53  tmt *pStmt1, *pS
132b0 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63  tmt2;.  if( objc
132c0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
132d0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
132e0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
132f0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
13300 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
13310 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
13320 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52  bjv[0], 0), " FR
13330 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22  OM-STMT TO-STMT"
13340 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
13350 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
13360 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
13370 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
13380 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13390 31 5d 29 2c 20 26 70 53 74 6d 74 31 29 29 20 72  1]), &pStmt1)) r
133a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
133b0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
133c0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
133d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
133e0 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32 29 29 20  [2]), &pStmt2)) 
133f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13400 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
13410 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
13420 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
13430 28 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65  (sqlite3_transfe
13440 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74  r_bindings(pStmt
13450 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a 23 65 6e  1,pStmt2)));.#en
13460 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
13470 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
13480 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68  age:  sqlite3_ch
13490 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52  anges DB.**.** R
134a0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
134b0 20 6f 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65   of changes made
134c0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
134d0 20 62 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c   by the last SQL
134e0 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  .** execution..*
134f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
13500 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
13510 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20  changes(.  void 
13520 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
13530 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13540 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
13550 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
13560 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
13570 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
13580 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
13590 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
135a0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
135b0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
135c0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c   \"",.       Tcl
135d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
135e0 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
135f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13600 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
13610 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
13620 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
13630 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
13640 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13650 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
13660 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
13670 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
13680 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
13690 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  b)));.  return T
136a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
136b0 54 68 69 73 20 69 73 20 74 68 65 20 22 73 74 61  This is the "sta
136c0 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20  tic_bind_value" 
136d0 74 68 61 74 20 76 61 72 69 61 62 6c 65 73 20 61  that variables a
136e0 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e  re bound to when
136f0 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74  .** the FLAG opt
13700 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62  ion of sqlite3_b
13710 69 6e 64 20 69 73 20 22 73 74 61 74 69 63 22 0a  ind is "static".
13720 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
13730 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
13740 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74  nd_value = 0;.st
13750 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
13760 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
13770 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73  e = 0;../*.** Us
13780 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62 69  age:  sqlite3_bi
13790 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56 41 4c  nd  VM  IDX  VAL
137a0 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20  UE  FLAGS.**.** 
137b0 53 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f  Sets the value o
137c0 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63 63  f the IDX-th occ
137d0 75 72 72 65 6e 63 65 20 6f 66 20 22 3f 22 20 69  urrence of "?" i
137e0 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
137f0 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56  QL.** string.  V
13800 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20  ALUE is the new 
13810 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53  value.  If FLAGS
13820 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41  =="null" then VA
13830 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  LUE is.** ignore
13840 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
13850 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
13860 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74   If FLAGS=="stat
13870 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ic" then.** the 
13880 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
13890 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
138a0 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e  tatic variable n
138b0 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  amed.** "sqlite_
138c0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
138d0 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  e".  If FLAGS=="
138e0 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63  normal" then a c
138f0 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41  opy.** of the VA
13900 4c 55 45 20 69 73 20 6d 61 64 65 2e 20 20 49 66  LUE is made.  If
13910 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22   FLAGS=="blob10"
13920 20 74 68 65 6e 20 61 20 56 41 4c 55 45 20 69 73   then a VALUE is
13930 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61   ignored.** an a
13940 20 31 30 2d 62 79 74 65 20 62 6c 6f 62 20 22 61   10-byte blob "a
13950 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22  bc\000xyz\000pq"
13960 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   is inserted..*/
13970 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
13980 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
13990 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ind(.  void *Not
139a0 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
139b0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
139c0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
139d0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
139e0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
139f0 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
13a00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
13a10 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
13a20 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
13a30 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
13a40 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
13a50 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
13a60 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
13a70 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
13a80 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20   int idx;.  if( 
13a90 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
13aa0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13ab0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
13ac0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
13ad0 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
13ae0 20 20 20 20 20 20 20 22 20 56 4d 20 49 44 58 20         " VM IDX 
13af0 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61 74  VALUE (null|stat
13b00 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20 30  ic|normal)\"", 0
13b10 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
13b20 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
13b30 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
13b40 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
13b50 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ], &pStmt) ) ret
13b60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13b70 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
13b80 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
13b90 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
13ba0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
13bb0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
13bc0 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  "null")==0 ){.  
13bd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
13be0 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
13bf0 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  idx);.  }else if
13c00 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
13c10 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20 29 7b  ,"static")==0 ){
13c20 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
13c30 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
13c40 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73  t, idx, sqlite_s
13c50 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
13c60 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  , -1, 0);.  }els
13c70 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
13c80 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e 62 79  v[4],"static-nby
13c90 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tes")==0 ){.    
13ca0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
13cb0 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
13cc0 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
13cd0 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20 20 20  _bind_value,.   
13ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d00 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61 74 69      sqlite_stati
13d10 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 30 29  c_bind_nbyte, 0)
13d20 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
13d30 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f  rcmp(argv[4],"no
13d40 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rmal")==0 ){.   
13d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
13d60 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
13d70 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c  dx, argv[3], -1,
13d80 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
13d90 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  T);.  }else if( 
13da0 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
13db0 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b 0a 20  blob10")==0 ){. 
13dc0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
13dd0 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
13de0 20 69 64 78 2c 20 22 61 62 63 5c 30 30 30 78 79   idx, "abc\000xy
13df0 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c 20 53 51  z\000pq", 10, SQ
13e00 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
13e10 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41  }else{.    Tcl_A
13e20 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13e30 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d 65 6e  rp, "4th argumen
13e40 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  t should be ".  
13e50 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20        "\"null\" 
13e60 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20 6f 72  or \"static\" or
13e70 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29   \"normal\"", 0)
13e80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
13e90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
13ea0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
13eb0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
13ec0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
13ed0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13ee0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
13ef0 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
13f00 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  50];.    sqlite3
13f10 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
13f20 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28  (zBuf), zBuf, "(
13f30 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
13f40 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
13f50 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
13f60 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
13f70 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
13f80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
13f90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
13fa0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
13fb0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
13fc0 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
13fd0 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20  est_collate <db 
13fe0 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  ptr> <utf8> <utf
13ff0 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a  16le> <utf16be>.
14000 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
14010 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74  ion is used to t
14020 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
14030 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72  selects the corr
14040 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  ect collation.**
14050 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61   sequence callba
14060 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ck when multiple
14070 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64   versions (for d
14080 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e  ifferent text en
14090 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20  codings).** are 
140a0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
140b0 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
140c0 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20  utine registers 
140d0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
140e0 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c  quence "test_col
140f0 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61  late".** with da
14100 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64  tabase handle <d
14110 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  b>. The second a
14120 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
14130 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a  a list of three.
14140 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  ** boolean value
14150 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
14160 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20  is true, then a 
14170 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f  version of test_
14180 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65  collate is.** re
14190 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
141a0 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  -8, if the secon
141b0 64 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72  d is true, a ver
141c0 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  sion is register
141d0 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36  ed for.** UTF-16
141e0 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  le, if the third
141f0 20 69 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d   is true, a UTF-
14200 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20  16be version is 
14210 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72  available..** Pr
14220 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
14230 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  of test_collate 
14240 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
14250 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** The collation
14260 20 73 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63   sequence test_c
14270 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d  ollate is implem
14280 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ented by calling
14290 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
142a0 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
142b0 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c  .**   "test_coll
142c0 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20  ate <enc> <lhs> 
142d0 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65  <rhs>".**.** The
142e0 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e   <lhs> and <rhs>
142f0 20 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c   are the two val
14300 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72  ues being compar
14310 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ed, encoded in U
14320 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e  TF-8..** The <en
14330 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  c> parameter is 
14340 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
14350 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
14360 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53  nction that.** S
14370 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64 20 74  QLite selected t
14380 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20  o call. The TCL 
14390 74 65 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c  test script impl
143a0 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74  ements the.** "t
143b0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f  est_collate" pro
143c0 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  c..**.** Note th
143d0 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c  at this will onl
143e0 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20  y work with one 
143f0 69 6e 74 65 72 70 72 65 74 65 72 20 61 74 20 61  interpreter at a
14400 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a   time, as the.**
14410 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65 72 20   interp pointer 
14420 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76 61 6c  to use when eval
14430 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c 20 73  uating the TCL s
14440 63 72 69 70 74 20 69 73 20 73 74 6f 72 65 64 20  cript is stored 
14450 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61  in.** pTestColla
14460 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61  teInterp..*/.sta
14470 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20  tic Tcl_Interp* 
14480 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
14490 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74  rp;.static int t
144a0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
144b0 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
144c0 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74  .  int nA, const
144d0 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74   void *zA,.  int
144e0 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nB, const void 
144f0 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  *zB.){.  Tcl_Int
14500 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74 43 6f  erp *i = pTestCo
14510 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20 20 69  llateInterp;.  i
14520 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54  nt encin = SQLIT
14530 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74  E_PTR_TO_INT(pCt
14540 78 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  x);.  int res;. 
14550 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74   int n;..  sqlit
14560 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
14570 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a    Tcl_Obj *pX;..
14580 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
14590 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f  ringObj("test_co
145a0 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54  llate", -1);.  T
145b0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
145c0 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  pX);..  switch( 
145d0 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63 61 73  encin ){.    cas
145e0 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20  e SQLITE_UTF8:. 
145f0 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
14600 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
14610 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  pX,Tcl_NewString
14620 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29 29  Obj("UTF-8",-1))
14630 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14640 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
14650 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 54 63  TF16LE:.      Tc
14660 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
14670 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
14680 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
14690 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20  F-16LE",-1));.  
146a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
146b0 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ase SQLITE_UTF16
146c0 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  BE:.      Tcl_Li
146d0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
146e0 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53  nt(i,pX,Tcl_NewS
146f0 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
14700 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  BE",-1));.      
14710 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
14720 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
14730 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  (0);.  }..  sqli
14740 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14750 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d  lloc();.  pVal =
14760 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
14770 28 30 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 20  (0);.  if( pVal 
14780 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
14790 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
147a0 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53  nA, zA, encin, S
147b0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
147c0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76     n = sqlite3_v
147d0 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29  alue_bytes(pVal)
147e0 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
147f0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
14800 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  ,pX,.        Tcl
14810 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
14820 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
14830 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
14840 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
14850 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
14860 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53  nB, zB, encin, S
14870 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
14880 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76     n = sqlite3_v
14890 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29  alue_bytes(pVal)
148a0 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
148b0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
148c0 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  ,pX,.        Tcl
148d0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
148e0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
148f0 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
14900 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
14910 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
14920 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
14930 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
14940 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
14950 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  i, pX, 0);.  Tcl
14960 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
14970 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46  );.  Tcl_GetIntF
14980 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65  romObj(i, Tcl_Ge
14990 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26  tObjResult(i), &
149a0 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  res);.  return r
149b0 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  es;.}.static int
149c0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
149d0 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76  est_collate(.  v
149e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
149f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
14a00 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
14a10 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
14a20 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
14a30 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
14a40 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74  int val;.  sqlit
14a50 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
14a60 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
14a70 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20   objc!=5 ) goto 
14a80 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65 73  bad_args;.  pTes
14a90 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d  tCollateInterp =
14aa0 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20 67   interp;.  if( g
14ab0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
14ac0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
14ad0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
14ae0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14af0 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f  ROR;..  if( TCL_
14b00 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
14b10 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
14b20 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
14b30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14b40 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
14b50 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
14b60 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
14b70 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
14b80 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 20  UTF8, .         
14b90 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
14ba0 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63  UTF8, val?test_c
14bb0 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
14bc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14bd0 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
14be0 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20   void *zUtf16;. 
14bf0 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
14c00 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
14c10 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
14c20 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
14c30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14c50 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
14c60 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  n(db, "test_coll
14c70 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
14c80 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  16LE, .         
14c90 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
14ca0 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74  E_UTF16LE, val?t
14cb0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
14cc0 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c  :0);.    if( TCL
14cd0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
14ce0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
14cf0 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c  p, objv[4], &val
14d00 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14d10 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20  RROR;..#if 0.   
14d20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61   if( sqlite3_iMa
14d30 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20  llocFail>0 ){.  
14d40 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
14d50 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d  locFail++;.    }
14d60 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
14d70 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
14d80 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
14d90 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
14da0 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
14db0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
14dc0 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65  tr(pVal, -1, "te
14dd0 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
14de0 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
14df0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55  _STATIC);.    zU
14e00 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61  tf16 = sqlite3Va
14e10 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
14e20 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
14e30 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
14e40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
14e50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14e60 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
14e70 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
14e80 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
14e90 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74  lation16(db, zUt
14ea0 66 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  f16, SQLITE_UTF1
14eb0 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  6BE, .          
14ec0 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
14ed0 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74  TF16BE, val?test
14ee0 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
14ef0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14f00 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
14f10 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
14f20 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
14f30 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66  mutex);.  }.  if
14f40 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
14f50 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
14f60 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
14f70 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66  L_ERROR;.  .  if
14f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14f90 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
14fa0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14fb0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
14fc0 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
14fd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14fe0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
14ff0 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
15000 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15010 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
15020 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
15030 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c  e \"",.      Tcl
15040 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
15050 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
15060 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74   <DB> <utf8> <ut
15070 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e  f16le> <utf16be>
15080 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 0);.  return 
15090 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
150a0 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
150b0 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c  est_utf16bin_col
150c0 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 0a 2a 2a  late <db ptr>.**
150d0 0a 2a 2a 20 41 64 64 20 61 20 75 74 66 2d 31 36  .** Add a utf-16
150e0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
150f0 6e 63 65 20 6e 61 6d 65 64 20 22 75 74 66 31 36  nce named "utf16
15100 62 69 6e 22 20 74 6f 20 74 68 65 20 64 61 74 61  bin" to the data
15110 62 61 73 65 0a 2a 2a 20 68 61 6e 64 6c 65 2e 20  base.** handle. 
15120 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  This collation s
15130 65 71 75 65 6e 63 65 20 63 6f 6d 70 61 72 65 73  equence compares
15140 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 74 68   arguments in th
15150 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 74 68  e same way as th
15160 65 0a 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 63 6f  e.** built-in co
15170 6c 6c 61 74 69 6f 6e 20 22 62 69 6e 61 72 79 22  llation "binary"
15180 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15190 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f  test_utf16bin_co
151a0 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
151b0 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
151c0 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
151d0 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
151e0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
151f0 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 28 6e  .  int nCmp = (n
15200 41 3e 6e 42 20 3f 20 6e 42 20 3a 20 6e 41 29 3b  A>nB ? nB : nA);
15210 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
15220 63 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e 43 6d 70  cmp(zA, zB, nCmp
15230 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  );.  if( res==0 
15240 29 20 72 65 73 20 3d 20 6e 41 20 2d 20 6e 42 3b  ) res = nA - nB;
15250 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
15260 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
15270 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75  TE_TCLAPI test_u
15280 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 28  tf16bin_collate(
15290 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
152a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
152b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
152c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
152d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
152e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
152f0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
15300 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74  f( objc!=2 ) got
15310 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
15320 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
15330 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
15340 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
15350 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
15360 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
15370 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
15380 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74  ollation(db, "ut
15390 66 31 36 62 69 6e 22 2c 20 53 51 4c 49 54 45 5f  f16bin", SQLITE_
153a0 55 54 46 31 36 2c 20 30 2c 20 0a 20 20 20 20 20  UTF16, 0, .     
153b0 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63   test_utf16bin_c
153c0 6f 6c 6c 61 74 65 5f 66 75 6e 63 0a 20 20 29 3b  ollate_func.  );
153d0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
153e0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
153f0 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
15400 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15410 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
15420 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
15430 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15440 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
15450 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  B");.  return TC
15460 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_ERROR;.}../*.*
15470 2a 20 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61  * When the colla
15480 74 69 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c  tion needed call
15490 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c  back is invoked,
154a0 20 72 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65   record the name
154b0 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72 65 71 75   of .** the requ
154c0 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20  ested collating 
154d0 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 20  function here.  
154e0 54 68 65 20 72 65 63 6f 72 64 65 64 20 6e 61 6d  The recorded nam
154f0 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74  e is linked.** t
15500 6f 20 61 20 54 43 4c 20 76 61 72 69 61 62 6c 65  o a TCL variable
15510 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 6b   and used to mak
15520 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
15530 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
15540 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63  ion.** name is c
15550 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
15560 63 20 63 68 61 72 20 7a 4e 65 65 64 65 64 43 6f  c char zNeededCo
15570 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74  llation[200];.st
15580 61 74 69 63 20 63 68 61 72 20 2a 70 7a 4e 65 65  atic char *pzNee
15590 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a  dedCollation = z
155a0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b  NeededCollation;
155b0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20  .../*.** Called 
155c0 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67  when a collating
155d0 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 65 65   sequence is nee
155e0 64 65 64 2e 20 20 52 65 67 69 73 74 65 72 65 64  ded.  Registered
155f0 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
15600 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
15610 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  ed16()..*/.stati
15620 63 20 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c  c void test_coll
15630 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20  ate_needed_cb(. 
15640 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
15650 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
15660 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63  nt eTextRep,.  c
15670 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65  onst void *pName
15680 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20  .){.  int enc = 
15690 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e 74 20 69  ENC(db);.  int i
156a0 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66  ;.  char *z;.  f
156b0 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e  or(z = (char*)pN
156c0 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20  ame, i=0; *z || 
156d0 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20  z[1]; z++){.    
156e0 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64  if( *z ) zNeeded
156f0 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d  Collation[i++] =
15700 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64   *z;.  }.  zNeed
15710 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d  edCollation[i] =
15720 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72   0;.  sqlite3_cr
15730 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
15740 20 20 20 20 20 20 64 62 2c 20 22 74 65 73 74 5f        db, "test_
15750 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64 62  collate", ENC(db
15760 29 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  ), SQLITE_INT_TO
15770 5f 50 54 52 28 65 6e 63 29 2c 20 74 65 73 74 5f  _PTR(enc), test_
15780 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d  collate_func);.}
15790 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
157a0 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  dd_test_collate_
157b0 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61  needed DB.*/.sta
157c0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
157d0 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 6c 61  CLAPI test_colla
157e0 74 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69  te_needed(.  voi
157f0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15800 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15810 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15820 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15830 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
15840 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
15850 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
15860 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=2 ) goto bad_
15870 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44  args;.  if( getD
15880 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
15890 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
158a0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
158b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
158c0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
158d0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
158e0 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f  d16(db, 0, test_
158f0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
15900 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c  b);.  zNeededCol
15910 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20  lation[0] = 0;. 
15920 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
15930 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
15940 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
15950 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
15960 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
15970 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72  d_args:.  Tcl_Wr
15980 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15990 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
159a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
159b0 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
159c0 74 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c  tclcmd:   add_al
159d0 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c  ignment_test_col
159e0 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a  lations  DB.**.*
159f0 2a 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f  * Add two new co
15a00 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
15a10 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
15a20 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75  e DB.**.**     u
15a30 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20  tf16_aligned.** 
15a40 20 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67      utf16_unalig
15a50 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63  ned.**.** Both c
15a60 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
15a70 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  es use the same 
15a80 73 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42 49  sort order as BI
15a90 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  NARY..** The onl
15aa0 79 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  y difference is 
15ab0 74 68 61 74 20 74 68 65 20 75 74 66 31 36 5f 61  that the utf16_a
15ac0 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  ligned collating
15ad0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20  .** sequence is 
15ae0 64 65 63 6c 61 72 65 64 20 77 69 74 68 20 74 68  declared with th
15af0 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  e SQLITE_UTF16_A
15b00 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20  LIGNED flag..** 
15b10 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66  Both collating f
15b20 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65  unctions increme
15b30 6e 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  nt the unaligned
15b40 20 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a   utf16 counter.*
15b50 2a 20 77 68 65 6e 65 76 65 72 20 74 68 65 79 20  * whenever they 
15b60 73 65 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  see a string tha
15b70 74 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f  t begins on an o
15b80 64 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79  dd byte boundary
15b90 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15ba0 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
15bb0 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74  _counter = 0;.st
15bc0 61 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65  atic int alignme
15bd0 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  ntCollFunc(.  vo
15be0 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69  id *NotUsed,.  i
15bf0 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
15c00 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
15c10 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
15c20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
15c30 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
15c40 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
15c50 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
15c60 20 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20   if( nKey1>0 && 
15c70 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54  1==(1&(SQLITE_PT
15c80 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29 29  R_TO_INT(pKey1))
15c90 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  ) ) unaligned_st
15ca0 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ring_counter++;.
15cb0 20 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26    if( nKey2>0 &&
15cc0 20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50   1==(1&(SQLITE_P
15cd0 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32 29  TR_TO_INT(pKey2)
15ce0 29 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73  )) ) unaligned_s
15cf0 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b  tring_counter++;
15d00 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70  .  rc = memcmp(p
15d10 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b  Key1, pKey2, n);
15d20 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
15d30 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
15d40 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65   nKey2;.  }.  re
15d50 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
15d60 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
15d70 41 50 49 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  API add_alignmen
15d80 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
15d90 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
15da0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
15db0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
15dc0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
15dd0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
15de0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
15df0 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d  db;.  if( objc>=
15e00 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  2 ){.    if( get
15e10 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
15e20 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
15e30 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
15e40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15e50 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  R;.    sqlite3_c
15e60 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
15e70 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61 6c 69  db, "utf16_unali
15e80 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55 54  gned", SQLITE_UT
15e90 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  F16, .        0,
15ea0 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
15eb0 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nc);.    sqlite3
15ec0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
15ed0 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61 6c 69  n(db, "utf16_ali
15ee0 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55 54  gned", SQLITE_UT
15ef0 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a 20 20  F16_ALIGNED, .  
15f00 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65        0, alignme
15f10 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d  ntCollFunc);.  }
15f20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
15f30 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
15f40 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
15f50 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a 2f 0a  _OMIT_UTF16) */.
15f60 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
15f70 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  d_test_function 
15f80 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
15f90 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
15fa0 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
15fb0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
15fc0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
15fd0 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
15fe0 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a 2a 20  correct user.** 
15ff0 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63  function callbac
16000 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  k when multiple 
16010 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69  versions (for di
16020 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63  fferent text enc
16030 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61  odings).** are a
16040 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
16050 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
16060 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 75  tine registers u
16070 70 20 74 6f 20 74 68 72 65 65 20 76 65 72 73 69  p to three versi
16080 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65 72 20  ons of the user 
16090 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65 73  function.** "tes
160a0 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69 74 68  t_function" with
160b0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
160c0 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65 20 73   <db>.  If the s
160d0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
160e0 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  s.** true, then 
160f0 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73  a version of tes
16100 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  t_function is re
16110 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
16120 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74 68  -8, if the.** th
16130 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 76  ird is true, a v
16140 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74  ersion is regist
16150 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31 36 6c  ered for UTF-16l
16160 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72 74 68  e, if the fourth
16170 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20 55   is.** true, a U
16180 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20  TF-16be version 
16190 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 50  is available.  P
161a0 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
161b0 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e 63   of.** test_func
161c0 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74 65 64  tion are deleted
161d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65 72  ..**.** The user
161e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
161f0 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c  lemented by call
16200 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
16210 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
16220 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75 6e 63  .**   "test_func
16230 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67 3e  tion <enc> <arg>
16240 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 65  ".**.** Where <e
16250 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 54  nc> is one of UT
16260 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f 72  F-8, UTF-16LE or
16270 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20 3c 61   UTF16BE, and <a
16280 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73 69  rg> is the.** si
16290 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 70 61  ngle argument pa
162a0 73 73 65 64 20 74 6f 20 74 68 65 20 53 51 4c 20  ssed to the SQL 
162b0 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
162c0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 0a  lue returned by.
162d0 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  ** the TCL scrip
162e0 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  t is used as the
162f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
16300 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
16310 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61 73 73  n. It.** is pass
16320 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75 73 69  ed to SQLite usi
16330 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f 72 20  ng UTF-16BE for 
16340 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66 75 6e  a UTF-8 test_fun
16350 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a 2a  ction(), UTF-8.*
16360 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36 4c 45  * for a UTF-16LE
16370 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29   test_function()
16380 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45 20 66  , and UTF-16LE f
16390 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  or an implementa
163a0 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72 65  tion that.** pre
163b0 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e 0a 2a  fers UTF-16BE..*
163c0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
163d0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74  _OMIT_UTF16.stat
163e0 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
163f0 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73 71  ction_utf8(.  sq
16400 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
16410 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
16420 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
16430 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
16440 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16450 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
16460 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
16470 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
16480 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
16490 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
164a0 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
164b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
164c0 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
164d0 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
164e0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
164f0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
16500 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
16510 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
16520 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
16530 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
16540 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
16550 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
16560 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
16570 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
16580 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
16590 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
165a0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
165b0 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
165c0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
165d0 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74 65  nt(pX);.  sqlite
165e0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
165f0 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  tx, Tcl_GetStrin
16600 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
16610 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
16620 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20 3d  SIENT);.  pVal =
16630 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
16640 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
16650 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
16660 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
16670 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
16680 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
16690 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
166a0 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
166b0 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70  esult_text16be(p
166c0 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
166d0 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61 6c  ue_text16be(pVal
166e0 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
166f0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
16700 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
16710 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74  ee(pVal);.}.stat
16720 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
16730 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20  ction_utf16le(. 
16740 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
16750 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
16760 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
16770 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
16780 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16790 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
167a0 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
167b0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
167c0 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
167d0 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
167e0 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
167f0 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
16800 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
16810 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
16820 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
16830 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
16840 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
16850 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
16860 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
16870 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54  16LE", -1));.  T
16880 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
16890 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
168a0 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
168b0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
168c0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
168d0 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20  _text(argv[0]), 
168e0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
168f0 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58  ObjEx(interp, pX
16900 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
16910 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
16920 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
16930 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
16940 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
16950 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
16960 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
16970 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
16980 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
16990 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
169a0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
169b0 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73 71 6c  (pCtx,(char*)sql
169c0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
169d0 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45 5f  pVal),-1,SQLITE_
169e0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
169f0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
16a00 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Val);.}.static v
16a10 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
16a20 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71 6c  n_utf16be(.  sql
16a30 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
16a40 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
16a50 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
16a60 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c   **argv.){.  Tcl
16a70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
16a80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
16a90 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
16aa0 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20  *pVal;.  interp 
16ab0 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  = (Tcl_Interp *)
16ac0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
16ad0 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20  a(pCtx);.  pX = 
16ae0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
16af0 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  ("test_function"
16b00 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
16b10 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
16b20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
16b30 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
16b40 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72  , pX, Tcl_NewStr
16b50 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45  ingObj("UTF-16BE
16b60 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
16b70 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
16b80 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
16b90 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
16ba0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
16bb0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
16bc0 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
16bd0 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
16be0 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
16bf0 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
16c00 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c  ount(pX);.  pVal
16c10 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
16c20 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
16c30 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
16c40 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
16c50 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
16c60 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
16c70 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
16c80 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
16c90 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28 70  _result_text16(p
16ca0 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
16cb0 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
16cc0 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
16cd0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
16ce0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
16cf0 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
16d00 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
16d10 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
16d20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
16d30 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
16d40 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
16d50 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16le(pCtx, sqlit
16d60 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
16d70 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
16d80 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
16d90 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
16da0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
16db0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
16dc0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
16dd0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
16de0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 66  TE_TCLAPI test_f
16df0 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  unction(.  void 
16e00 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
16e10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
16e20 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
16e30 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
16e40 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
16e50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
16e60 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
16e70 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a  db;.  int val;..
16e80 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20    if( objc!=5 ) 
16e90 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
16ea0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
16eb0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16ec0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16ed0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
16ee0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66  TCL_ERROR;..  if
16ef0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
16f00 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
16f10 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
16f20 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
16f30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16f40 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
16f50 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
16f60 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
16f70 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
16f80 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
16f90 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
16fa0 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c  unction_utf8, 0,
16fb0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
16fc0 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
16fd0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
16fe0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
16ff0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
17000 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
17010 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
17020 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
17030 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
17040 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
17050 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20  UTF16LE, .      
17060 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
17070 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c  unction_utf16le,
17080 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
17090 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
170a0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
170b0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
170c0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
170d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
170e0 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
170f0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
17100 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
17110 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
17120 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20  TE_UTF16BE, .   
17130 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73       interp, tes
17140 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
17150 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  be, 0, 0);.  }..
17160 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17170 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c  .bad_args:.  Tcl
17180 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
17190 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
171a0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
171b0 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65  "",.      Tcl_Ge
171c0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
171d0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44  bjv[0], 0), " <D
171e0 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  B> <utf8> <utf16
171f0 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20  le> <utf16be>", 
17200 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
17210 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
17220 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
17230 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
17240 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 73  Usage:         s
17250 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73  qlite3_test_errs
17260 74 72 20 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a  tr <err code>.**
17270 0a 2a 2a 20 54 65 73 74 20 74 68 61 74 20 74 68  .** Test that th
17280 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e english langua
17290 67 65 20 73 74 72 69 6e 67 20 65 71 75 69 76 61  ge string equiva
172a0 6c 65 6e 74 73 20 66 6f 72 20 73 71 6c 69 74 65  lents for sqlite
172b0 20 65 72 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20   error codes.** 
172c0 61 72 65 20 73 61 6e 65 2e 20 54 68 65 20 70 61  are sane. The pa
172d0 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 69 6e  rameter is an in
172e0 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 69  teger representi
172f0 6e 67 20 61 6e 20 73 71 6c 69 74 65 20 65 72 72  ng an sqlite err
17300 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20  or code..** The 
17310 72 65 73 75 6c 74 20 69 73 20 61 20 6c 69 73 74  result is a list
17320 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   of two elements
17330 2c 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  , the string rep
17340 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
17350 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  he.** error code
17360 20 61 6e 64 20 74 68 65 20 65 6e 67 6c 69 73 68   and the english
17370 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
17380 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
17390 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
173a0 50 49 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a  PI test_errstr(.
173b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
173c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
173d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
173e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
173f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17400 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
17410 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
17420 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
17430 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
17440 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
17450 20 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29   "<error code>")
17460 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d  ;.  }..  zCode =
17470 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17480 62 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[1]);.  for(i
17490 3d 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b  =0; i<200; i++){
174a0 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63  .    if( 0==strc
174b0 6d 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69  mp(t1ErrorName(i
174c0 29 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61  ), zCode) ) brea
174d0 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  k;.  }.  Tcl_Set
174e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
174f0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
17500 72 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72  rStr(i), 0);.  r
17510 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
17520 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
17530 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a   breakpoint.**.*
17540 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
17550 78 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75  xists for one pu
17560 72 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69  rpose - to provi
17570 64 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75  de a place to pu
17580 74 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e  t a.** breakpoin
17590 74 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20  t with GDB that 
175a0 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64  can be triggered
175b0 20 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e   using TCL code.
175c0 20 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72    The use.** for
175d0 20 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20   this is when a 
175e0 70 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20  particular test 
175f0 66 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74  fails on (say) t
17600 68 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74  he 1485th iterat
17610 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54  ion..** In the T
17620 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20  CL test script, 
17630 77 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20  we can add code 
17640 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
17650 20 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38       if {$i==148
17660 35 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a  5} breakpoint.**
17670 0a 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73  .** Then run tes
17680 74 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20  tfixture in the 
17690 64 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69  debugger and wai
176a0 74 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70  t for the breakp
176b0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e  oint to.** fire.
176c0 20 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61    Then additiona
176d0 6c 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61  l breakpoints ca
176e0 6e 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63  n be set to trac
176f0 65 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a  e down the bug..
17700 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
17710 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
17720 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76  _breakpoint(.  v
17730 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
17740 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17750 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
17760 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
17770 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
17780 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
17790 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
177a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
177b0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
177c0 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
177d0 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
177e0 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
177f0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54  */.){.  return T
17800 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  CL_OK;         /
17810 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
17820 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17830 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a    sqlite3_bind_z
17840 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49 44  eroblob  STMT ID
17850 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  X N.**.** Test t
17860 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
17870 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61  zeroblob interfa
17880 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
17890 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
178a0 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65  t..** IDX is the
178b0 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
178c0 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
178d0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
178e0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
178f0 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20   binds a N-byte 
17900 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42  zero-filled BLOB
17910 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
17920 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17930 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
17940 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
17950 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
17960 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
17970 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
17980 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
17990 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
179a0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
179b0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
179c0 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20   idx;.  int n;. 
179d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
179e0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
179f0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
17a00 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
17a10 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a   "STMT IDX N");.
17a20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17a30 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
17a40 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
17a50 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
17a60 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
17a70 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
17a80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17a90 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
17aa0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
17ab0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
17ac0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17ad0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
17ae0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17af0 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65  bjv[3], &n) ) re
17b00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17b10 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17b20 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53  bind_zeroblob(pS
17b30 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20  tmt, idx, n);.  
17b40 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
17b50 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
17b60 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
17b70 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
17b80 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
17b90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
17ba0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17bb0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
17bc0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
17bd0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
17be0 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
17bf0 6f 62 36 34 20 20 53 54 4d 54 20 49 44 58 20 4e  ob64  STMT IDX N
17c00 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
17c10 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
17c20 6f 62 6c 6f 62 36 34 20 69 6e 74 65 72 66 61 63  oblob64 interfac
17c30 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
17c40 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
17c50 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65 20  ..** IDX is the 
17c60 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
17c70 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
17c80 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
17c90 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
17ca0 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20 7a  binds a N-byte z
17cb0 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20  ero-filled BLOB 
17cc0 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
17cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
17ce0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
17cf0 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36  t_bind_zeroblob6
17d00 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  4(.  void * clie
17d10 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17d20 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17d30 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17d40 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17d50 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
17d60 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
17d70 74 20 69 64 78 3b 0a 20 20 54 63 6c 5f 57 69 64  t idx;.  Tcl_Wid
17d80 65 49 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63  eInt n;.  int rc
17d90 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
17da0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
17db0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
17dc0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
17dd0 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  IDX N");.    ret
17de0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17df0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
17e00 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
17e10 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17e20 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
17e30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17e40 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
17e50 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
17e60 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
17e70 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
17e80 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
17e90 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
17ea0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
17eb0 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72  [3], &n) ) retur
17ec0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
17ed0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
17ee0 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 70 53 74  d_zeroblob64(pSt
17ef0 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20 69  mt, idx, n);.  i
17f00 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
17f10 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
17f20 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
17f30 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
17f40 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
17f50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17f60 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17f70 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
17f80 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
17f90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17fa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17fb0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
17fc0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
17fd0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
17fe0 74 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  t  STMT N VALUE.
17ff0 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
18000 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
18010 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
18020 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
18030 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
18040 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
18050 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
18060 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
18070 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
18080 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32  nd.** binds a 32
18090 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
180a0 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
180b0 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
180c0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
180d0 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a   test_bind_int(.
180e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
180f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18100 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18110 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18120 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18130 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
18140 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
18150 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b  dx;.  int value;
18160 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
18170 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
18180 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
18190 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
181a0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
181b0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
181c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
181d0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
181e0 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
181f0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
18200 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18210 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
18220 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18230 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18240 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
18250 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18260 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
18270 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
18280 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
18290 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
182a0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
182b0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
182c0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
182d0 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20  value) ) return 
182e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
182f0 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
18300 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  int(pStmt, idx, 
18310 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71  value);.  if( sq
18320 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
18330 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
18340 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
18350 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18360 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
18380 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18390 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
183a0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
183b0 73 61 67 65 3a 20 20 20 69 6e 74 61 72 72 61 79  sage:   intarray
183c0 5f 61 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a  _addr  INT  ....
183d0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
183e0 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d   address of a C-
183f0 6c 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f  language array o
18400 66 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  f 32-bit integer
18410 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
18420 6f 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79  o hold the array
18430 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
18440 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c  m malloc().  Cal
18450 6c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  l this procedure
18460 20 6f 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f   once.** with no
18470 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72   arguments in or
18480 64 65 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d  der to release m
18490 65 6d 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c  emory.  Each cal
184a0 6c 20 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64  l to this proced
184b0 75 72 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  ure.** overwrite
184c0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 61  s the previous a
184d0 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
184e0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
184f0 49 20 74 65 73 74 5f 69 6e 74 61 72 72 61 79 5f  I test_intarray_
18500 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  addr(.  void * c
18510 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
18520 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18530 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18540 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18550 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
18560 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 2a 70  .  static int *p
18570 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
18580 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20  _free(p);.  p = 
18590 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20  0;.  if( objc>1 
185a0 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
185b0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
185c0 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29  f(p[0])*(objc-1)
185d0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   );.    if( p==0
185e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
185f0 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ROR;.    for(i=0
18600 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29  ; i<objc-1; i++)
18610 7b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  {.      if( Tcl_
18620 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
18630 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69 5d 2c  terp, objv[1+i],
18640 20 26 70 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20   &p[i]) ){.     
18650 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18660 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  p);.        p = 
18670 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
18680 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
18690 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20     }.    }.  }  
186a0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
186b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
186c0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73  NewWideIntObj((s
186d0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29  qlite3_int64)p))
186e0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
186f0 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  K;.}./*.** Usage
18700 3a 20 20 20 69 6e 74 61 72 72 61 79 5f 61 64 64  :   intarray_add
18710 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a  r  INT  ....**.*
18720 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
18730 72 65 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e 67  ress of a C-lang
18740 75 61 67 65 20 61 72 72 61 79 20 6f 66 20 33 32  uage array of 32
18750 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 0a 2a  -bit integers..*
18760 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
18770 6c 64 20 74 68 65 20 61 72 72 61 79 20 69 73 20  ld the array is 
18780 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
18790 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74 68  lloc().  Call th
187a0 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 63  is procedure onc
187b0 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72 67  e.** with no arg
187c0 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20  uments in order 
187d0 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
187e0 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f  y.  Each call to
187f0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
18800 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
18810 65 20 70 72 65 76 69 6f 75 73 20 61 72 72 61 79  e previous array
18820 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18830 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
18840 73 74 5f 69 6e 74 36 34 61 72 72 61 79 5f 61 64  st_int64array_ad
18850 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  dr(.  void * cli
18860 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18870 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18880 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
18890 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
188a0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  [].){.  int i;. 
188b0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
188c0 69 6e 74 36 34 20 2a 70 20 3d 20 30 3b 0a 0a 20  int64 *p = 0;.. 
188d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
188e0 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  p = 0;.  if(
188f0 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 70   objc>1 ){.    p
18900 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
18910 63 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29 2a  c( sizeof(p[0])*
18920 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20 20  (objc-1) );.    
18930 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
18940 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
18950 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a 63   for(i=0; i<objc
18960 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
18970 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20  Tcl_WideInt v;. 
18980 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
18990 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
189a0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69 5d  nterp, objv[1+i]
189b0 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
189c0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
189d0 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b  ;.        p = 0;
189e0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
189f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
18a00 20 7d 0a 20 20 20 20 20 20 70 5b 69 5d 20 3d 20   }.      p[i] = 
18a10 76 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  v;.    }.  }  . 
18a20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
18a30 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
18a40 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73 71 6c  wWideIntObj((sql
18a50 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29 3b 0a  ite3_int64)p));.
18a60 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18a70 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .}./*.** Usage: 
18a80 20 20 64 6f 75 62 6c 65 61 72 72 61 79 5f 61 64    doublearray_ad
18a90 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a  dr  INT  ....**.
18aa0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
18ab0 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e  dress of a C-lan
18ac0 67 75 61 67 65 20 61 72 72 61 79 20 6f 66 20 64  guage array of d
18ad0 6f 75 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 70  oubles..**.** Sp
18ae0 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
18af0 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65  array is obtaine
18b00 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
18b10 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72 6f 63    Call this proc
18b20 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77 69  edure once.** wi
18b30 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  th no arguments 
18b40 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 6c 65  in order to rele
18b50 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61 63  ase memory.  Eac
18b60 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 70  h call to this p
18b70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65 72  rocedure.** over
18b80 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69  writes the previ
18b90 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  ous array..*/.st
18ba0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
18bb0 54 43 4c 41 50 49 20 74 65 73 74 5f 64 6f 75 62  TCLAPI test_doub
18bc0 6c 65 61 72 72 61 79 5f 61 64 64 72 28 0a 20 20  learray_addr(.  
18bd0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
18be0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
18bf0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
18c00 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
18c10 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18c20 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
18c30 63 20 64 6f 75 62 6c 65 20 2a 70 20 3d 20 30 3b  c double *p = 0;
18c40 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
18c50 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20  (p);.  p = 0;.  
18c60 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20  if( objc>1 ){.  
18c70 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
18c80 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30  lloc( sizeof(p[0
18c90 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20  ])*(objc-1) );. 
18ca0 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
18cb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18cc0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f      for(i=0; i<o
18cd0 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  bjc-1; i++){.   
18ce0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f     if( Tcl_GetDo
18cf0 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ubleFromObj(inte
18d00 72 70 2c 20 6f 62 6a 76 5b 31 2b 69 5d 2c 20 26  rp, objv[1+i], &
18d10 70 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  p[i]) ){.       
18d20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
18d30 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b  ;.        p = 0;
18d40 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
18d50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
18d60 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20   }.    }.  }  . 
18d70 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
18d80 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
18d90 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73 71 6c  wWideIntObj((sql
18da0 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29 3b 0a  ite3_int64)p));.
18db0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
18dc0 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .}./*.** Usage: 
18dd0 20 20 74 65 78 74 61 72 72 61 79 5f 61 64 64 72    textarray_addr
18de0 20 20 54 45 58 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    TEXT ....**.**
18df0 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
18e00 65 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e 67 75  ess of a C-langu
18e10 61 67 65 20 61 72 72 61 79 20 6f 66 20 73 74 72  age array of str
18e20 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  ings..**.** Spac
18e30 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 72  e to hold the ar
18e40 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ray is obtained 
18e50 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20  from malloc().  
18e60 43 61 6c 6c 20 74 68 69 73 20 70 72 6f 63 65 64  Call this proced
18e70 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77 69 74 68  ure once.** with
18e80 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 69 6e   no arguments in
18e90 20 6f 72 64 65 72 20 74 6f 20 72 65 6c 65 61 73   order to releas
18ea0 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61 63 68 20  e memory.  Each 
18eb0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 70 72 6f  call to this pro
18ec0 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65 72 77 72  cedure.** overwr
18ed0 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
18ee0 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  s array..*/.stat
18ef0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
18f00 4c 41 50 49 20 74 65 73 74 5f 74 65 78 74 61 72  LAPI test_textar
18f10 72 61 79 5f 61 64 64 72 28 0a 20 20 76 6f 69 64  ray_addr(.  void
18f20 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
18f30 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
18f40 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
18f50 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
18f60 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
18f70 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  t i;.  static in
18f80 74 20 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  t n = 0;.  stati
18f90 63 20 63 68 61 72 20 2a 2a 70 20 3d 20 30 3b 0a  c char **p = 0;.
18fa0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
18fb0 20 69 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66 72   i++) sqlite3_fr
18fc0 65 65 28 70 5b 69 5d 29 3b 0a 20 20 73 71 6c 69  ee(p[i]);.  sqli
18fd0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
18fe0 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63   = 0;.  if( objc
18ff0 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  >1 ){.    p = sq
19000 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
19010 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63  zeof(p[0])*(objc
19020 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
19030 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
19040 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28  _ERROR;.    for(
19050 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69  i=0; i<objc-1; i
19060 2b 2b 29 7b 0a 20 20 20 20 20 20 70 5b 69 5d 20  ++){.      p[i] 
19070 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
19080 66 28 22 25 73 22 2c 20 54 63 6c 5f 47 65 74 53  f("%s", Tcl_GetS
19090 74 72 69 6e 67 28 6f 62 6a 76 5b 31 2b 69 5d 29  tring(objv[1+i])
190a0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  );.    }.  }.  n
190b0 20 3d 20 6f 62 6a 63 2d 31 3b 0a 20 20 54 63 6c   = objc-1;.  Tcl
190c0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
190d0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
190e0 65 49 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33  eIntObj((sqlite3
190f0 5f 69 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65  _int64)p));.  re
19100 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
19110 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
19120 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
19130 36 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  64  STMT N VALUE
19140 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
19150 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
19160 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  64 interface.  S
19170 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
19180 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
19190 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
191a0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
191b0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
191c0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
191d0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
191e0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
191f0 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
19200 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
19210 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
19220 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e  API test_bind_in
19230 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
19240 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19250 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19260 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19270 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19280 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
19290 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
192a0 69 6e 74 20 69 64 78 3b 0a 20 20 54 63 6c 5f 57  int idx;.  Tcl_W
192b0 69 64 65 49 6e 74 20 76 61 6c 75 65 3b 0a 20 20  ideInt value;.  
192c0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
192d0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
192e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
192f0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
19300 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
19310 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
19320 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
19330 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
19340 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
19350 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
19360 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
19370 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
19380 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19390 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
193a0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
193b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
193c0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
193d0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
193e0 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
193f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19400 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
19410 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
19420 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
19430 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
19440 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
19450 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
19460 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 64  _int64(pStmt, id
19470 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
19480 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
19490 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
194a0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
194b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
194c0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
194d0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
194e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
194f0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
19500 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
19510 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
19520 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20  e3_bind_double  
19530 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a  STMT N VALUE.**.
19540 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
19550 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20  te3_bind_double 
19560 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
19570 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
19580 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
19590 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
195a0 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
195b0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
195c0 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
195d0 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34  nd.** binds a 64
195e0 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
195f0 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
19600 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
19610 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
19620 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c   test_bind_doubl
19630 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
19640 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19650 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19660 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19670 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19680 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
19690 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
196a0 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20  t idx;.  double 
196b0 76 61 6c 75 65 20 3d 20 30 3b 0a 20 20 69 6e 74  value = 0;.  int
196c0 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
196d0 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 69  r *zVal;.  int i
196e0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
196f0 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
19700 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
19710 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
19720 74 68 65 20 73 70 65 63 69 61 6c 20 66 6c 6f 61  the special floa
19730 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
19740 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
19750 20 69 6e 74 20 69 55 70 70 65 72 3b 20 20 20 2f   int iUpper;   /
19760 2a 20 55 70 70 65 72 20 33 32 20 62 69 74 73 20  * Upper 32 bits 
19770 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
19780 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 2f 2a  int iLower;   /*
19790 20 4c 6f 77 65 72 20 33 32 20 62 69 74 73 20 2a   Lower 32 bits *
197a0 2f 0a 20 20 7d 20 61 53 70 65 63 69 61 6c 46 70  /.  } aSpecialFp
197b0 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 20 22 4e  [] = {.    {  "N
197c0 61 4e 22 2c 20 20 20 20 20 20 30 78 37 66 66 66  aN",      0x7fff
197d0 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
197e0 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53 4e 61 4e   },.    {  "SNaN
197f0 22 2c 20 20 20 20 20 30 78 37 66 66 37 66 66 66  ",     0x7ff7fff
19800 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
19810 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 22 2c 20  .    {  "-NaN", 
19820 20 20 20 20 30 78 66 66 66 66 66 66 66 66 2c 20      0xffffffff, 
19830 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
19840 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c 20 20 20    {  "-SNaN",   
19850 20 30 78 66 66 66 37 66 66 66 66 2c 20 30 78 66   0xfff7ffff, 0xf
19860 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
19870 20 20 22 2b 49 6e 66 22 2c 20 20 20 20 20 30 78    "+Inf",     0x
19880 37 66 66 30 30 30 30 30 2c 20 30 78 30 30 30 30  7ff00000, 0x0000
19890 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0000 },.    {  "
198a0 2d 49 6e 66 22 2c 20 20 20 20 20 30 78 66 66 66  -Inf",     0xfff
198b0 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
198c0 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 45 70 73  0 },.    {  "Eps
198d0 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30 30 30 30  ilon",  0x000000
198e0 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d  00, 0x00000001 }
198f0 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70 73 69 6c  ,.    {  "-Epsil
19900 6f 6e 22 2c 20 30 78 38 30 30 30 30 30 30 30 2c  on", 0x80000000,
19910 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c 0a 20   0x00000001 },. 
19920 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c 20 20 20     {  "NaN0",   
19930 20 20 30 78 37 66 66 38 30 30 30 30 2c 20 30 78    0x7ff80000, 0x
19940 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
19950 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20 20 20 30  {  "-NaN0",    0
19960 78 66 66 66 38 30 30 30 30 2c 20 30 78 30 30 30  xfff80000, 0x000
19970 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 0a 20  00000 },.  };.. 
19980 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
19990 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
199a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
199b0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
199c0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
199d0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
199e0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
199f0 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
19a00 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
19a10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19a20 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
19a30 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
19a40 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
19a50 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
19a60 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19a70 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
19a80 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
19a90 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
19aa0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
19ab0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49  L_ERROR;..  /* I
19ac0 6e 74 65 72 63 65 70 74 20 74 68 65 20 73 74 72  ntercept the str
19ad0 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64 20 67 65  ing "NaN" and ge
19ae0 6e 65 72 61 74 65 20 61 20 4e 61 4e 20 76 61 6c  nerate a NaN val
19af0 75 65 20 66 6f 72 20 69 74 2e 0a 20 20 2a 2a 20  ue for it..  ** 
19b00 41 6c 6c 20 6f 74 68 65 72 20 73 74 72 69 6e 67  All other string
19b10 73 20 61 72 65 20 70 61 73 73 65 64 20 74 68 72  s are passed thr
19b20 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47 65 74 44  ough to Tcl_GetD
19b30 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 2e 0a  oubleFromObj()..
19b40 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44 6f 75 62    ** Tcl_GetDoub
19b50 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73 68 6f 75  leFromObj() shou
19b60 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 20 22 4e  ld understand "N
19b70 61 4e 22 20 62 75 74 20 73 6f 6d 65 20 76 65 72  aN" but some ver
19b80 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e 74 61  sions.  ** conta
19b90 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a 2f 0a 20  in a bug..  */. 
19ba0 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zVal = Tcl_GetS
19bb0 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
19bc0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
19bd0 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f  eof(aSpecialFp)/
19be0 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
19bf0 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  p[0]); i++){.   
19c00 20 69 66 28 20 73 74 72 63 6d 70 28 61 53 70 65   if( strcmp(aSpe
19c10 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d 65 2c  cialFp[i].zName,
19c20 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zVal)==0 ){.   
19c30 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
19c40 34 20 78 3b 0a 20 20 20 20 20 20 78 20 3d 20 61  4 x;.      x = a
19c50 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 55 70  SpecialFp[i].iUp
19c60 70 65 72 3b 0a 20 20 20 20 20 20 78 20 3c 3c 3d  per;.      x <<=
19c70 20 33 32 3b 0a 20 20 20 20 20 20 78 20 7c 3d 20   32;.      x |= 
19c80 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 4c  aSpecialFp[i].iL
19c90 6f 77 65 72 3b 0a 20 20 20 20 20 20 61 73 73 65  ower;.      asse
19ca0 72 74 28 20 73 69 7a 65 6f 66 28 76 61 6c 75 65  rt( sizeof(value
19cb0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 61 73  )==8 );.      as
19cc0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
19cd0 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =8 );.      memc
19ce0 70 79 28 26 76 61 6c 75 65 2c 20 26 78 2c 20 38  py(&value, &x, 8
19cf0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19d00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
19d10 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70 65 63 69  i>=sizeof(aSpeci
19d20 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70  alFp)/sizeof(aSp
19d30 65 63 69 61 6c 46 70 5b 30 5d 29 20 26 26 0a 20  ecialFp[0]) &&. 
19d40 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
19d50 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
19d60 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
19d70 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 72 65 74  alue) ){.    ret
19d80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19d90 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
19da0 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
19db0 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29  tmt, idx, value)
19dc0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
19dd0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
19de0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
19df0 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
19e00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
19e10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
19e20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
19e30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
19e40 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
19e50 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
19e60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
19e70 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a  ll  STMT N.**.**
19e80 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
19e90 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74 65  3_bind_null inte
19ea0 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
19eb0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
19ec0 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
19ed0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
19ee0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
19ef0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
19f00 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
19f10 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c 20 74  * binds a NULL t
19f20 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a  o the wildcard..
19f30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
19f40 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
19f50 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f  _bind_null(.  vo
19f60 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
19f70 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
19f80 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
19f90 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
19fa0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
19fb0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
19fc0 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
19fd0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
19fe0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
19ff0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a000 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a010 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a020 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
1a030 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
1a040 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
1a050 20 22 20 53 54 4d 54 20 4e 22 2c 20 30 29 3b 0a   " STMT N", 0);.
1a060 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a070 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1a080 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1a090 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1a0a0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1a0b0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1a0c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a0d0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1a0e0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1a0f0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
1a100 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1a110 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1a120 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
1a130 69 64 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  idx);.  if( sqli
1a140 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
1a150 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
1a160 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
1a170 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a180 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a190 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1a1a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a1b0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
1a1c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1a1d0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
1a1e0 64 5f 74 65 78 74 20 20 53 54 4d 54 20 4e 20 53  d_text  STMT N S
1a1f0 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a  TRING BYTES.**.*
1a200 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
1a210 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 69 6e 74  e3_bind_text int
1a220 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
1a230 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
1a240 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
1a250 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
1a260 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
1a270 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1a280 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
1a290 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 38  ** binds a UTF-8
1a2a0 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74   string STRING t
1a2b0 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
1a2c0 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42   The string is B
1a2d0 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f  YTES bytes.** lo
1a2e0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1a2f0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1a300 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a  test_bind_text(.
1a310 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1a320 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1a330 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a340 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1a350 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1a360 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1a370 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
1a380 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  dx;.  int bytes;
1a390 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a  .  char *value;.
1a3a0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1a3b0 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
1a3c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a3d0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a3e0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a3f0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
1a400 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
1a410 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
1a420 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20   " STMT N VALUE 
1a430 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
1a440 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a450 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1a460 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1a470 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1a480 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1a490 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1a4a0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1a4b0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1a4c0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1a4d0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
1a4e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c  TCL_ERROR;.  val
1a4f0 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  ue = (char*)Tcl_
1a500 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1a510 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  Obj(objv[3], &by
1a520 74 65 73 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  tes);.  if( Tcl_
1a530 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1a540 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
1a550 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
1a560 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
1a570 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
1a580 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
1a590 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53   value, bytes, S
1a5a0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
1a5b0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1a5c0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1a5d0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
1a5e0 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
1a5f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a600 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a610 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1a620 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1a630 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1a640 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
1a650 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a660 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
1a670 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1a680 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
1a690 6e 64 5f 74 65 78 74 31 36 20 3f 2d 73 74 61 74  nd_text16 ?-stat
1a6a0 69 63 3f 20 53 54 4d 54 20 4e 20 53 54 52 49 4e  ic? STMT N STRIN
1a6b0 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  G BYTES.**.** Te
1a6c0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
1a6d0 69 6e 64 5f 74 65 78 74 31 36 20 69 6e 74 65 72  ind_text16 inter
1a6e0 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
1a6f0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1a700 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
1a710 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
1a720 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
1a730 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
1a740 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
1a750 20 62 69 6e 64 73 20 61 20 55 54 46 2d 31 36 20   binds a UTF-16 
1a760 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f  string STRING to
1a770 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
1a780 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42 59  The string is BY
1a790 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e  TES bytes.** lon
1a7a0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1a7b0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1a7c0 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  est_bind_text16(
1a7d0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1a7e0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1a7f0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1a800 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1a810 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1a820 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1a830 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1a840 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1a850 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
1a860 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
1a870 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
1a880 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78   rc;..  void (*x
1a890 44 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f  Del)(void*) = (o
1a8a0 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54  bjc==6?SQLITE_ST
1a8b0 41 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e  ATIC:SQLITE_TRAN
1a8c0 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62  SIENT);.  Tcl_Ob
1a8d0 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62  j *oStmt    = ob
1a8e0 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63  jv[objc-4];.  Tc
1a8f0 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20  l_Obj *oN       
1a900 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a  = objv[objc-3];.
1a910 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69    Tcl_Obj *oStri
1a920 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ng  = objv[objc-
1a930 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  2];.  Tcl_Obj *o
1a940 42 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f  Bytes   = objv[o
1a950 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f  bjc-1];..  if( o
1a960 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1a970 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  6){.    Tcl_Appe
1a980 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a990 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1a9a0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
1a9b0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1a9c0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
1a9d0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
1a9e0 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20  N VALUE BYTES", 
1a9f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1aa00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1aa10 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1aa20 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1aa30 47 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29  GetString(oStmt)
1aa40 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1aa50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1aa60 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1aa70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e  omObj(interp, oN
1aa80 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
1aa90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
1aaa0 6c 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c  lue = (char*)Tcl
1aab0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1aac0 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29  mObj(oString, 0)
1aad0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1aae0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1aaf0 2c 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73  , oBytes, &bytes
1ab00 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1ab10 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
1ab20 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
1ab30 36 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76  6(pStmt, idx, (v
1ab40 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74  oid *)value, byt
1ab50 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28  es, xDel);.  if(
1ab60 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1ab70 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
1ab80 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
1ab90 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1aba0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
1abb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1abc0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1abd0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
1abe0 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  ErrName(rc), 0);
1abf0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1ac00 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64  ERROR;.  }..#end
1ac10 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1ac20 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1ac30 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ac40 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
1ac50 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20  lite3_bind_blob 
1ac60 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e  ?-static? STMT N
1ac70 20 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a   DATA BYTES.**.*
1ac80 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
1ac90 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74  e3_bind_blob int
1aca0 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
1acb0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
1acc0 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
1acd0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
1ace0 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
1acf0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1ad00 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
1ad10 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20  ** binds a BLOB 
1ad20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
1ad30 20 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59    The BLOB is BY
1ad40 54 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a  TES bytes in siz
1ad50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1ad60 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1ad70 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20  est_bind_blob(. 
1ad80 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1ad90 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1ada0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1adb0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1adc0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1add0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1ade0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 6c 65  *pStmt;.  int le
1adf0 6e 2c 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  n, idx;.  int by
1ae00 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
1ae10 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ue;.  int rc;.  
1ae20 73 71 6c 69 74 65 33 5f 64 65 73 74 72 75 63 74  sqlite3_destruct
1ae30 6f 72 5f 74 79 70 65 20 78 44 65 73 74 72 75 63  or_type xDestruc
1ae40 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 54 52 41  tor = SQLITE_TRA
1ae50 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66 28 20 6f  NSIENT;..  if( o
1ae60 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1ae70 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  6 ){.    Tcl_App
1ae80 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1ae90 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1aea0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
1aeb0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
1aec0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
1aed0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
1aee0 20 4e 20 44 41 54 41 20 42 59 54 45 53 22 2c 20   N DATA BYTES", 
1aef0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1af00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1af10 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a   if( objc==6 ){.
1af20 20 20 20 20 78 44 65 73 74 72 75 63 74 6f 72 20      xDestructor 
1af30 3d 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3b  = SQLITE_STATIC;
1af40 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d  .    objv++;.  }
1af50 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1af60 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1af70 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1af80 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1af90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1afa0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1afb0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1afc0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
1afd0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1afe0 52 52 4f 52 3b 0a 0a 20 20 76 61 6c 75 65 20 3d  RROR;..  value =
1aff0 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
1b000 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1b010 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[3], &len);.
1b020 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1b030 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1b040 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
1b050 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b060 52 4f 52 3b 0a 0a 20 20 69 66 28 20 62 79 74 65  ROR;..  if( byte
1b070 73 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  s>len ){.    cha
1b080 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20  r zBuf[200];.   
1b090 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1b0a0 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
1b0b0 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20  zBuf,.          
1b0c0 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
1b0d0 6f 74 20 75 73 65 20 25 64 20 62 6c 6f 62 20 62  ot use %d blob b
1b0e0 79 74 65 73 2c 20 68 61 76 65 20 25 64 22 2c 20  ytes, have %d", 
1b0f0 62 79 74 65 73 2c 20 6c 65 6e 29 3b 0a 20 20 20  bytes, len);.   
1b100 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b110 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1b120 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  -1);.    return 
1b130 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1b140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1b150 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
1b160 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65  idx, value, byte
1b170 73 2c 20 78 44 65 73 74 72 75 63 74 6f 72 29 3b  s, xDestructor);
1b180 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1b190 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1b1a0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
1b1b0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
1b1c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1b1d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b1e0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1b1f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
1b200 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1b210 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1b220 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
1b230 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20 53 54  ameter_count  ST
1b240 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
1b250 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 69  the number of wi
1b260 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65 20 67  ldcards in the g
1b270 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e 0a  iven statement..
1b280 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1b290 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1b2a0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1b2b0 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  count(.  void * 
1b2c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1b2d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1b2e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1b2f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1b300 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1b310 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1b320 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1b330 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1b340 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1b350 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
1b360 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b370 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1b380 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1b390 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1b3a0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1b3b0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1b3c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1b3d0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1b3e0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1b3f0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e  tObj(sqlite3_bin
1b400 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
1b410 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  t(pStmt)));.  re
1b420 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b430 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1b440 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
1b450 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53 54 4d 54  meter_name  STMT
1b460 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e    N.**.** Return
1b470 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1b480 20 4e 74 68 20 77 69 6c 64 63 61 72 64 2e 20 20   Nth wildcard.  
1b490 54 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  The first wildca
1b4a0 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41 6e 20 65  rd is 1..** An e
1b4b0 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 72  mpty string is r
1b4c0 65 74 75 72 6e 65 64 20 69 66 20 4e 20 69 73 20  eturned if N is 
1b4d0 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 6f 72 20  out of range or 
1b4e0 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 0a  if the wildcard.
1b4f0 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73 73 2e 0a  ** is nameless..
1b500 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1b510 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1b520 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1b530 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  name(.  void * c
1b540 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1b550 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1b560 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1b570 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1b580 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1b590 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1b5a0 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f   int i;..  if( o
1b5b0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1b5c0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1b5d0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1b5e0 22 53 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72  "STMT N");.    r
1b5f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b600 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
1b610 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1b620 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1b630 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1b640 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b650 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1b660 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1b670 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1b680 69 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  i) ) return TCL_
1b690 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
1b6a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1b6b0 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53  , .     Tcl_NewS
1b6c0 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
1b6d0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1b6e0 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31  name(pStmt,i),-1
1b6f0 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ).  );.  return 
1b700 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b710 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
1b720 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
1b730 5f 69 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41  _index  STMT  NA
1b740 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ME.**.** Return 
1b750 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1b760 20 77 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64   wildcard called
1b770 20 4e 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30   NAME.  Return 0
1b780 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
1b790 6e 6f 20 73 75 63 68 20 77 69 6c 64 63 61 72 64  no such wildcard
1b7a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b7b0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1b7c0 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
1b7d0 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20  r_index(.  void 
1b7e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1b7f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1b800 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1b810 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1b820 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1b830 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1b840 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1b850 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1b860 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1b870 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
1b880 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
1b890 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b8a0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
1b8b0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1b8c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b8d0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1b8e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b8f0 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
1b900 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
1b910 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62      Tcl_NewIntOb
1b920 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  j(.       sqlite
1b930 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
1b940 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c  _index(pStmt,Tcl
1b950 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b960 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b  2])).     ).  );
1b970 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1b980 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1b990 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  :   sqlite3_clea
1b9a0 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a  r_bindings STMT.
1b9b0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
1b9c0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1b9d0 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  est_clear_bindin
1b9e0 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  gs(.  void * cli
1b9f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1ba00 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ba10 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1ba20 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ba30 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1ba40 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
1ba50 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1ba60 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1ba70 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1ba80 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
1ba90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1baa0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1bab0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1bac0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1bad0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1bae0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1baf0 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
1bb00 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1bb10 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1bb20 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f  j(sqlite3_clear_
1bb30 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29 29  bindings(pStmt))
1bb40 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1bb50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1bb60 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 73 6c  ge:   sqlite3_sl
1bb70 65 65 70 20 4d 49 4c 4c 49 53 45 43 4f 4e 44 53  eep MILLISECONDS
1bb80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1bb90 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1bba0 74 5f 73 6c 65 65 70 28 0a 20 20 76 6f 69 64 20  t_sleep(.  void 
1bbb0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1bbc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1bbd0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1bbe0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1bbf0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
1bc00 20 6d 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   ms;..  if( objc
1bc10 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
1bc20 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1bc30 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 4d 49  rp, 1, objv, "MI
1bc40 4c 4c 49 53 45 43 4f 4e 44 53 22 29 3b 0a 20 20  LLISECONDS");.  
1bc50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1bc60 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
1bc70 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1bc80 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
1bc90 20 26 6d 73 29 20 29 7b 0a 20 20 20 20 72 65 74   &ms) ){.    ret
1bca0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1bcb0 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
1bcc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1bcd0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1bce0 74 65 33 5f 73 6c 65 65 70 28 6d 73 29 29 29 3b  te3_sleep(ms)));
1bcf0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bd00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1bd10 3a 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  : sqlite3_extend
1bd20 65 64 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a  ed_errcode DB.**
1bd30 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73  .** Return the s
1bd40 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
1bd50 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74  tion of the most
1bd60 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f   recent sqlite3_
1bd70 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63  * API.** error c
1bd80 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54  ode. e.g. "SQLIT
1bd90 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61  E_ERROR"..*/.sta
1bda0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1bdb0 43 4c 41 50 49 20 74 65 73 74 5f 65 78 5f 65 72  CLAPI test_ex_er
1bdc0 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20  rcode(.  void * 
1bdd0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1bde0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1bdf0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1be00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1be10 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1be20 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1be30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1be40 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1be50 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1be60 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1be70 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1be80 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1be90 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1bea0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
1beb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1bec0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
1bed0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1bee0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1bef0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
1bf00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1bf10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
1bf20 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1bf30 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  db);.  Tcl_Appen
1bf40 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1bf50 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1bf60 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
1bf70 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1bf80 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1bf90 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 44  qlite3_errcode D
1bfa0 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
1bfb0 68 65 20 73 74 72 69 6e 67 20 72 65 70 72 65 73  he string repres
1bfc0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
1bfd0 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69  most recent sqli
1bfe0 74 65 33 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72  te3_* API.** err
1bff0 6f 72 20 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53  or code. e.g. "S
1c000 51 4c 49 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f  QLITE_ERROR"..*/
1c010 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1c020 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65  TE_TCLAPI test_e
1c030 72 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a  rrcode(.  void *
1c040 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1c050 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c060 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1c070 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1c080 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1c090 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
1c0a0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
1c0b0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1c0c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1c0d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1c0e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1c0f0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1c100 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1c110 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
1c120 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c130 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1c140 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1c150 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c160 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1c170 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c180 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1c190 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54  errcode(db);.  T
1c1a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c1b0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
1c1c0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
1c1d0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1c1e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1c1f0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1c200 65 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20  errmsg DB.**.** 
1c210 52 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d  Returns the UTF-
1c220 38 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  8 representation
1c230 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
1c240 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72  ssage string for
1c250 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
1c260 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
1c270 49 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69  I call..*/.stati
1c280 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1c290 41 50 49 20 74 65 73 74 5f 65 72 72 6d 73 67 28  API test_errmsg(
1c2a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c2b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c2c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c2d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c2e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c2f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1c300 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1c310 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  zErr;..  if( obj
1c320 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1c330 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c340 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1c350 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1c360 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1c370 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1c380 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
1c390 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1c3a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1c3b0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1c3c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1c3d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1c3e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1c3f0 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73 71  OR;..  zErr = sq
1c400 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
1c410 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1c420 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1c430 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45  _NewStringObj(zE
1c440 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74 75  rr, -1));.  retu
1c450 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1c460 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 73  .** Usage:   tes
1c470 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a 2a 2a  t_errmsg16 DB.**
1c480 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20  .** Returns the 
1c490 55 54 46 2d 31 36 20 72 65 70 72 65 73 65 6e 74  UTF-16 represent
1c4a0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72 72  ation of the err
1c4b0 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69 6e  or message strin
1c4c0 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f 73  g for the.** mos
1c4d0 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
1c4e0 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54 68 69  _* API call. Thi
1c4f0 73 20 69 73 20 61 20 62 79 74 65 20 61 72 72 61  s is a byte arra
1c500 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65 20  y object at the 
1c510 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20 61  TCL .** level, a
1c520 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73 20 74  nd it includes t
1c530 68 65 20 30 78 30 30 20 30 78 30 30 20 74 65 72  he 0x00 0x00 ter
1c540 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 61 74  minator bytes at
1c550 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a   the end of the.
1c560 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67  ** UTF-16 string
1c570 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1c580 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1c590 73 74 5f 65 72 72 6d 73 67 31 36 28 0a 20 20 76  st_errmsg16(.  v
1c5a0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1c5b0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1c5c0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1c5d0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1c5e0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1c5f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1c600 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
1c610 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
1c620 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20 20 63 6f  void *zErr;.  co
1c630 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
1c640 6e 74 20 62 79 74 65 73 20 3d 20 30 3b 0a 0a 20  nt bytes = 0;.. 
1c650 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1c660 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1c670 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1c680 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1c690 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1c6a0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1c6b0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
1c6c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c6d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c6e0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1c6f0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c700 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c710 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1c720 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
1c730 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72  Err = sqlite3_er
1c740 72 6d 73 67 31 36 28 64 62 29 3b 0a 20 20 69 66  rmsg16(db);.  if
1c750 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 7a 20  ( zErr ){.    z 
1c760 3d 20 7a 45 72 72 3b 0a 20 20 20 20 66 6f 72 28  = zErr;.    for(
1c770 62 79 74 65 73 3d 30 3b 20 7a 5b 62 79 74 65 73  bytes=0; z[bytes
1c780 5d 20 7c 7c 20 7a 5b 62 79 74 65 73 2b 31 5d 3b  ] || z[bytes+1];
1c790 20 62 79 74 65 73 2b 3d 32 29 7b 7d 0a 20 20 7d   bytes+=2){}.  }
1c7a0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
1c7b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
1c7c0 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28  NewByteArrayObj(
1c7d0 7a 45 72 72 2c 20 62 79 74 65 73 29 29 3b 0a 23  zErr, bytes));.#
1c7e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1c7f0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
1c800 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1c810 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1c820 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 20 44  qlite3_prepare D
1c830 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
1c840 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  lvar?.**.** Comp
1c850 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
1c860 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
1c870 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
1c880 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
1c890 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1c8a0 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
1c8b0 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
1c8c0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
1c8d0 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
1c8e0 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
1c8f0 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
1c900 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
1c910 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
1c920 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
1c930 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1c940 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1c950 50 49 20 74 65 73 74 5f 70 72 65 70 61 72 65 28  PI test_prepare(
1c960 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c970 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c980 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c990 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c9a0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c9b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1c9c0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1c9d0 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 62 79 74 65  zSql;.  int byte
1c9e0 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  s;.  const char 
1c9f0 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *zTail = 0;.  sq
1ca00 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1ca10 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1ca20 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63  uf[50];.  int rc
1ca30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
1ca40 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
1ca50 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ca60 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1ca70 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ca80 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1ca90 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1caa0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73  objv[0]), " DB s
1cab0 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1cac0 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  r?", 0);.    ret
1cad0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1cae0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1caf0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1cb00 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1cb10 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1cb20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1cb30 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zSql = Tcl_GetS
1cb40 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
1cb50 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1cb60 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1cb70 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
1cb80 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1cb90 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
1cba0 69 74 65 33 5f 70 72 65 70 61 72 65 28 64 62 2c  ite3_prepare(db,
1cbb0 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
1cbc0 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
1cbd0 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 54  &zTail : 0);.  T
1cbe0 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
1cbf0 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 73 71  nterp);.  if( sq
1cc00 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1cc10 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1cc20 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1cc30 52 4f 52 3b 0a 20 20 69 66 28 20 7a 54 61 69 6c  ROR;.  if( zTail
1cc40 20 26 26 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20   && objc>=5 ){. 
1cc50 20 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30 20     if( bytes>=0 
1cc60 29 7b 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d  ){.      bytes =
1cc70 20 62 79 74 65 73 20 2d 20 28 69 6e 74 29 28 7a   bytes - (int)(z
1cc80 54 61 69 6c 2d 7a 53 71 6c 29 3b 0a 20 20 20 20  Tail-zSql);.    
1cc90 7d 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29 73  }.    if( (int)s
1cca0 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3c 62 79 74  trlen(zTail)<byt
1ccb0 65 73 20 29 7b 0a 20 20 20 20 20 20 62 79 74 65  es ){.      byte
1ccc0 73 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  s = (int)strlen(
1ccd0 7a 54 61 69 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  zTail);.    }.  
1cce0 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
1ccf0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1cd00 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  , 0, Tcl_NewStri
1cd10 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74  ngObj(zTail, byt
1cd20 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  es), 0);.  }.  i
1cd30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1cd40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1cd50 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1cd60 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1cd70 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
1cd80 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
1cd90 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
1cda0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1cdb0 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
1cdc0 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
1cdd0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1cde0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
1cdf0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1ce00 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1ce10 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1ce20 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1ce30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ce40 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
1ce50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ce60 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
1ce70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ce80 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1ce90 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1cea0 32 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  2 DB sql bytes ?
1ceb0 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43  tailvar?.**.** C
1cec0 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
1ced0 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
1cee0 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
1cef0 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
1cf00 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
1cf10 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
1cf20 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
1cf30 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
1cf40 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
1cf50 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
1cf60 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
1cf70 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
1cf80 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
1cf90 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
1cfa0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1cfb0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1cfc0 43 4c 41 50 49 20 74 65 73 74 5f 70 72 65 70 61  CLAPI test_prepa
1cfd0 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  re_v2(.  void * 
1cfe0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1cff0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d000 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1d010 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1d020 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1d030 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
1d040 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
1d050 61 72 20 2a 7a 43 6f 70 79 20 3d 20 30 3b 20 20  ar *zCopy = 0;  
1d060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d070 20 6d 61 6c 6c 6f 63 28 29 20 63 6f 70 79 20 6f   malloc() copy o
1d080 66 20 7a 53 71 6c 20 2a 2f 0a 20 20 69 6e 74 20  f zSql */.  int 
1d090 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20 63  bytes;.  const c
1d0a0 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  har *zTail = 0;.
1d0b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
1d0c0 7a 54 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33  zTail;.  sqlite3
1d0d0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1d0e0 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
1d0f0 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
1d100 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
1d110 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
1d120 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d130 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1d140 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d150 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1d160 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d170 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
1d180 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29  tes tailvar", 0)
1d190 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1d1a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1d1b0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1d1c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1d1d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1d1e0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1d1f0 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
1d200 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d210 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[2]);.  if( T
1d220 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1d230 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
1d240 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1d250 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1d260 20 2f 2a 20 49 6e 73 74 65 61 64 20 6f 66 20 75   /* Instead of u
1d270 73 69 6e 67 20 7a 53 71 6c 20 64 69 72 65 63 74  sing zSql direct
1d280 6c 79 2c 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  ly, make a copy 
1d290 69 6e 74 6f 20 61 20 62 75 66 66 65 72 20 6f 62  into a buffer ob
1d2a0 74 61 69 6e 65 64 0a 20 20 2a 2a 20 64 69 72 65  tained.  ** dire
1d2b0 63 74 6c 79 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ctly from malloc
1d2c0 28 29 2e 20 54 68 65 20 69 64 65 61 20 69 73 20  (). The idea is 
1d2d0 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73 69 65  to make it easie
1d2e0 72 20 66 6f 72 20 76 61 6c 67 72 69 6e 64 0a 20  r for valgrind. 
1d2f0 20 2a 2a 20 74 6f 20 73 70 6f 74 20 62 75 66 66   ** to spot buff
1d300 65 72 20 6f 76 65 72 72 65 61 64 73 2e 20 20 2a  er overreads.  *
1d310 2f 0a 20 20 69 66 28 20 62 79 74 65 73 3e 3d 30  /.  if( bytes>=0
1d320 20 29 7b 0a 20 20 20 20 7a 43 6f 70 79 20 3d 20   ){.    zCopy = 
1d330 6d 61 6c 6c 6f 63 28 62 79 74 65 73 29 3b 0a 20  malloc(bytes);. 
1d340 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c     memcpy(zCopy,
1d350 20 7a 53 71 6c 2c 20 62 79 74 65 73 29 3b 0a 20   zSql, bytes);. 
1d360 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
1d370 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  n = (int)strlen(
1d380 7a 53 71 6c 29 20 2b 20 31 3b 0a 20 20 20 20 7a  zSql) + 1;.    z
1d390 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28 6e 29  Copy = malloc(n)
1d3a0 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f  ;.    memcpy(zCo
1d3b0 70 79 2c 20 7a 53 71 6c 2c 20 6e 29 3b 0a 20 20  py, zSql, n);.  
1d3c0 7d 0a 20 20 70 7a 54 61 69 6c 20 3d 20 6f 62 6a  }.  pzTail = obj
1d3d0 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
1d3e0 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
1d3f0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
1d400 20 7a 43 6f 70 79 2c 20 62 79 74 65 73 2c 20 26   zCopy, bytes, &
1d410 70 53 74 6d 74 2c 20 70 7a 54 61 69 6c 29 3b 0a  pStmt, pzTail);.
1d420 20 20 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20    free(zCopy);. 
1d430 20 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28   zTail = &zSql[(
1d440 7a 54 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b  zTail - zCopy)];
1d450 0a 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53  ..  assert(rc==S
1d460 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d  QLITE_OK || pStm
1d470 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73  t==0);.  Tcl_Res
1d480 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
1d490 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1d4a0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1d4b0 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
1d4c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d4d0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1d4e0 4f 4b 20 26 26 20 7a 54 61 69 6c 20 26 26 20 6f  OK && zTail && o
1d4f0 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66  bjc>=5 ){.    if
1d500 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
1d510 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
1d520 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d  s - (int)(zTail-
1d530 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
1d540 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
1d550 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1d560 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e   0, Tcl_NewStrin
1d570 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65  gObj(zTail, byte
1d580 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  s), 0);.  }.  if
1d590 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d5a0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1d5b0 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73  Stmt==0 );.    s
1d5c0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
1d5d0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
1d5e0 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29  uf, "(%d) ", rc)
1d5f0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1d600 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1d610 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Buf, sqlite3_err
1d620 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
1d630 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d640 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53  R;.  }..  if( pS
1d650 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73  tmt ){.    if( s
1d660 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f  qlite3TestMakePo
1d670 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c  interStr(interp,
1d680 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20   zBuf, pStmt) ) 
1d690 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d6a0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
1d6b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1d6c0 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  Buf, 0);.  }.  r
1d6d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1d6e0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1d6f0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33  lite3_prepare_v3
1d700 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 66 6c   DB sql bytes fl
1d710 61 67 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a  ags ?tailvar?.**
1d720 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74  .** Compile up t
1d730 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20  o <bytes> bytes 
1d740 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  of the supplied 
1d750 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e  SQL string <sql>
1d760 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61   using.** databa
1d770 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 20 61  se handle <DB> a
1d780 6e 64 20 66 6c 61 67 73 20 3c 66 6c 61 67 73 3e  nd flags <flags>
1d790 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1d7a0 3c 74 61 69 6c 76 61 6c 3e 20 69 73 0a 2a 2a 20  <tailval> is.** 
1d7b0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
1d7c0 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74 68  obal variable th
1d7d0 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1d7e0 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1d7f0 6f 66 0a 2a 2a 20 3c 73 71 6c 3e 20 28 69 66 20  of.** <sql> (if 
1d800 61 6e 79 29 2e 20 41 20 53 54 4d 54 20 68 61 6e  any). A STMT han
1d810 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1d820 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1d830 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1d840 74 5f 70 72 65 70 61 72 65 5f 76 33 28 0a 20 20  t_prepare_v3(.  
1d850 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1d860 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1d870 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1d880 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1d890 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1d8a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1d8b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
1d8c0 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70 79  l;.  char *zCopy
1d8d0 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1d8e0 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28 29       /* malloc()
1d8f0 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c 20 2a 2f   copy of zSql */
1d900 0a 20 20 69 6e 74 20 62 79 74 65 73 2c 20 66 6c  .  int bytes, fl
1d910 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ags;.  const cha
1d920 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  r *zTail = 0;.  
1d930 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 54  const char **pzT
1d940 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ail;.  sqlite3_s
1d950 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1d960 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
1d970 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1d980 28 20 6f 62 6a 63 21 3d 36 20 26 26 20 6f 62 6a  ( objc!=6 && obj
1d990 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
1d9a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1d9b0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1d9c0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1d9d0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1d9e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1d9f0 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
1da00 73 20 66 6c 61 67 73 20 74 61 69 6c 76 61 72 22  s flags tailvar"
1da10 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1da20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1da30 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1da40 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1da50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1da60 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1da70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
1da80 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
1da90 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
1daa0 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1dab0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1dac0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
1dad0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1dae0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1daf0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1db00 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 66 6c 61 67  , objv[4], &flag
1db10 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  s) ) return TCL_
1db20 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 73  ERROR;..  /* Ins
1db30 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 7a 53  tead of using zS
1db40 71 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d 61 6b  ql directly, mak
1db50 65 20 61 20 63 6f 70 79 20 69 6e 74 6f 20 61 20  e a copy into a 
1db60 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65 64 0a  buffer obtained.
1db70 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 66 72    ** directly fr
1db80 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54 68 65  om malloc(). The
1db90 20 69 64 65 61 20 69 73 20 74 6f 20 6d 61 6b 65   idea is to make
1dba0 20 69 74 20 65 61 73 69 65 72 20 66 6f 72 20 76   it easier for v
1dbb0 61 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74 6f 20  algrind.  ** to 
1dbc0 73 70 6f 74 20 62 75 66 66 65 72 20 6f 76 65 72  spot buffer over
1dbd0 72 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69 66 28  reads.  */.  if(
1dbe0 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20   bytes>=0 ){.   
1dbf0 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28   zCopy = malloc(
1dc00 62 79 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d 63  bytes);.    memc
1dc10 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20  py(zCopy, zSql, 
1dc20 62 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65 7b  bytes);.  }else{
1dc30 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e  .    int n = (in
1dc40 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29 20 2b  t)strlen(zSql) +
1dc50 20 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20 3d 20   1;.    zCopy = 
1dc60 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20 6d  malloc(n);.    m
1dc70 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71  emcpy(zCopy, zSq
1dc80 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 70 7a 54  l, n);.  }.  pzT
1dc90 61 69 6c 20 3d 20 6f 62 6a 63 3e 3d 36 20 3f 20  ail = objc>=6 ? 
1dca0 26 7a 54 61 69 6c 20 3a 20 30 3b 0a 20 20 72 63  &zTail : 0;.  rc
1dcb0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1dcc0 72 65 5f 76 33 28 64 62 2c 20 7a 43 6f 70 79 2c  re_v3(db, zCopy,
1dcd0 20 62 79 74 65 73 2c 20 28 75 6e 73 69 67 6e 65   bytes, (unsigne
1dce0 64 20 69 6e 74 29 66 6c 61 67 73 2c 26 70 53 74  d int)flags,&pSt
1dcf0 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 66 72  mt,pzTail);.  fr
1dd00 65 65 28 7a 43 6f 70 79 29 3b 0a 20 20 7a 54 61  ee(zCopy);.  zTa
1dd10 69 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a 54 61 69  il = &zSql[(zTai
1dd20 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a 0a 20 20  l - zCopy)];..  
1dd30 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
1dd40 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30  E_OK || pStmt==0
1dd50 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65  );.  Tcl_ResetRe
1dd60 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
1dd70 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
1dd80 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
1dd90 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
1dda0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1ddb0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1ddc0 26 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e  & zTail && objc>
1ddd0 3d 36 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79  =6 ){.    if( by
1dde0 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  tes>=0 ){.      
1ddf0 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20  bytes = bytes - 
1de00 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c  (int)(zTail-zSql
1de10 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
1de20 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
1de30 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 30 2c 20  rp, objv[5], 0, 
1de40 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1de50 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20  (zTail, bytes), 
1de60 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1de70 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1de80 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74     assert( pStmt
1de90 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
1dea0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1deb0 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
1dec0 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
1ded0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1dee0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1def0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1df00 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  db), 0);.    ret
1df10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1df20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
1df30 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1df40 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1df50 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1df60 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
1df70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1df80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1df90 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1dfa0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1dfb0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1dfc0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1dfd0 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33  3_prepare_tkt313
1dfe0 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72  4 DB.**.** Gener
1dff0 61 74 65 20 61 20 70 72 65 70 61 72 65 64 20 73  ate a prepared s
1e000 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 20 7a  tatement for a z
1e010 65 72 6f 2d 62 79 74 65 20 73 74 72 69 6e 67 20  ero-byte string 
1e020 61 73 20 61 20 74 65 73 74 0a 2a 2a 20 66 6f 72  as a test.** for
1e030 20 74 69 63 6b 65 74 20 23 33 31 33 34 2e 20 20   ticket #3134.  
1e040 54 68 65 20 73 74 72 69 6e 67 20 73 68 6f 75 6c  The string shoul
1e050 64 20 62 65 20 70 72 65 63 65 64 65 64 20 62 79  d be preceded by
1e060 20 61 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f   a zero byte..*/
1e070 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1e080 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70  TE_TCLAPI test_p
1e090 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 28 0a  repare_tkt3134(.
1e0a0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1e0b0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1e0c0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1e0d0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1e0e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1e0f0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1e100 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1e110 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c  char zSql[] = "\
1e120 30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20  000SELECT 1";.  
1e130 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1e140 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
1e150 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20  zBuf[50];.  int 
1e160 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
1e170 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1e180 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1e190 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1e1a0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1e1b0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1e1c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1e1d0 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
1e1e0 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
1e1f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e200 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1e210 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1e220 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1e230 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1e240 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1e250 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
1e260 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
1e270 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26  , &zSql[1], 0, &
1e280 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73  pStmt, 0);.  ass
1e290 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
1e2a0 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a  K || pStmt==0);.
1e2b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1e2c0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
1e2d0 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
1e2e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
1e2f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e300 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1e310 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1e320 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1e330 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
1e340 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
1e350 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
1e360 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1e370 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
1e380 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
1e390 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1e3a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
1e3b0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1e3c0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1e3d0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1e3e0 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1e3f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e400 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
1e410 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1e420 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
1e430 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1e440 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1e450 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
1e460 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
1e470 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70  ilvar.**.** Comp
1e480 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73  ile up to <bytes
1e490 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73  > bytes of the s
1e4a0 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69  upplied SQL stri
1e4b0 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a  ng <sql> using.*
1e4c0 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * database handl
1e4d0 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61  e <DB>. The para
1e4e0 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20  meter <tailval> 
1e4f0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
1e500 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61   global.** varia
1e510 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20  ble that is set 
1e520 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f  to the unused po
1e530 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28  rtion of <sql> (
1e540 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54  if any). A.** ST
1e550 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74  MT handle is ret
1e560 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1e570 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1e580 50 49 20 74 65 73 74 5f 70 72 65 70 61 72 65 31  PI test_prepare1
1e590 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1e5a0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1e5b0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e5c0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1e5d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1e5e0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1e5f0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1e600 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e610 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
1e620 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1e630 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
1e640 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
1e650 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1e660 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1e670 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
1e680 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
1e690 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
1e6a0 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
1e6b0 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
1e6c0 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
1e6d0 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
1e6e0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
1e6f0 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
1e700 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
1e710 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
1e720 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1e730 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e740 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e750 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e760 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1e770 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1e780 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
1e790 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
1e7a0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e7b0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1e7c0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1e7d0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1e7e0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1e7f0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1e800 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
1e810 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1e820 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
1e830 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28   &objlen);.  if(
1e840 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1e850 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1e860 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1e870 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e880 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1e890 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a 53  prepare16(db, zS
1e8a0 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
1e8b0 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
1e8c0 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ail : 0);.  if( 
1e8d0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1e8e0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
1e8f0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1e900 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
1e910 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1e920 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1e930 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20  if( objc>=5 ){. 
1e940 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a     if( zTail ){.
1e950 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f        objlen = o
1e960 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75  bjlen - (int)((u
1e970 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29  8 *)zTail-(u8 *)
1e980 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
1e990 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1e9a0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54   0;.    }.    pT
1e9b0 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  ail = Tcl_NewByt
1e9c0 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29  eArrayObj((u8 *)
1e9d0 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a  zTail, objlen);.
1e9e0 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1e9f0 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20  ount(pTail);.   
1ea00 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
1ea10 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1ea20 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20   0, pTail, 0);. 
1ea30 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1ea40 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a  unt(pTail);.  }.
1ea50 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
1ea60 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
1ea70 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1ea80 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1ea90 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1eaa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1eab0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1eac0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1ead0 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
1eae0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1eaf0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
1eb00 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1eb10 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
1eb20 61 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c 20  are16_v2 DB sql 
1eb30 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
1eb40 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1eb50 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1eb60 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1eb70 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1eb80 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1eb90 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1eba0 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1ebb0 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
1ebc0 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
1ebd0 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
1ebe0 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1ebf0 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1ec00 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
1ec10 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
1ec20 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1ec30 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1ec40 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1ec50 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a  t_prepare16_v2(.
1ec60 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1ec70 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1ec80 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ec90 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1eca0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ecb0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
1ecc0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
1ecd0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
1ece0 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20  st void *zSql;. 
1ecf0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61   const void *zTa
1ed00 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62  il = 0;.  Tcl_Ob
1ed10 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20  j *pTail = 0;.  
1ed20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1ed30 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
1ed40 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74  zBuf[50]; .  int
1ed50 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73   rc;.  int bytes
1ed60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1ed70 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   /* The integer 
1ed80 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67  specified as arg
1ed90 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c   3 */.  int objl
1eda0 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  en;             
1edb0 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72    /* The byte-ar
1edc0 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72  ray length of ar
1edd0 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  g 2 */..  if( ob
1ede0 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
1edf0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1ee00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ee10 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1ee20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1ee30 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1ee40 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1ee50 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
1ee60 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20  ailvar?", 0);.  
1ee70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1ee80 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1ee90 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1eea0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1eeb0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
1eec0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1eed0 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
1eee0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1eef0 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f  mObj(objv[2], &o
1ef00 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63  bjlen);.  if( Tc
1ef10 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1ef20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
1ef30 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72   &bytes) ) retur
1ef40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1ef50 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1ef60 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53  pare16_v2(db, zS
1ef70 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d  ql, bytes, &pStm
1ef80 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54  t, objc>=5 ? &zT
1ef90 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20  ail : 0);.  if( 
1efa0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1efb0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
1efc0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
1efd0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20  ERROR;.  if( rc 
1efe0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1eff0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1f000 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20  if( objc>=5 ){. 
1f010 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a     if( zTail ){.
1f020 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f        objlen = o
1f030 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75  bjlen - (int)((u
1f040 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29  8 *)zTail-(u8 *)
1f050 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
1f060 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d  {.      objlen =
1f070 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54   0;.    }.    pT
1f080 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  ail = Tcl_NewByt
1f090 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29  eArrayObj((u8 *)
1f0a0 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a  zTail, objlen);.
1f0b0 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
1f0c0 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20  ount(pTail);.   
1f0d0 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28   Tcl_ObjSetVar2(
1f0e0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
1f0f0 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20   0, pTail, 0);. 
1f100 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
1f110 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a  unt(pTail);.  }.
1f120 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
1f130 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54      if( sqlite3T
1f140 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
1f150 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  r(interp, zBuf, 
1f160 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1f170 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1f180 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1f190 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1f1a0 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
1f1b0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1f1c0 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
1f1d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1f1e0 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ge: sqlite3_open
1f1f0 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f   filename ?optio
1f200 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74  ns-list?.*/.stat
1f210 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1f220 4c 41 50 49 20 74 65 73 74 5f 6f 70 65 6e 28 0a  LAPI test_open(.
1f230 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f240 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f250 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1f260 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1f270 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1f280 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1f290 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c  zFilename;.  sql
1f2a0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
1f2b0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
1f2c0 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62  f( objc!=3 && ob
1f2d0 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31  jc!=2 && objc!=1
1f2e0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1f2f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1f300 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1f310 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1f320 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1f330 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1f340 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
1f350 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
1f360 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f370 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
1f380 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f 20 54  ame = objc>1 ? T
1f390 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1f3a0 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 73 71 6c  v[1]) : 0;.  sql
1f3b0 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e  ite3_open(zFilen
1f3c0 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20  ame, &db);.  .  
1f3d0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1f3e0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1f3f0 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
1f400 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1f410 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
1f420 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1f430 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
1f440 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1f450 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1f460 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c 45 4e 41  3_open_v2 FILENA
1f470 4d 45 20 46 4c 41 47 53 20 56 46 53 0a 2a 2f 0a  ME FLAGS VFS.*/.
1f480 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1f490 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6f 70  E_TCLAPI test_op
1f4a0 65 6e 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  en_v2(.  void * 
1f4b0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1f4c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f4d0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1f4e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1f4f0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74  bjv[].){.  const
1f500 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1f510 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1f520 7a 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67  zVfs;.  int flag
1f530 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  s = 0;.  sqlite3
1f540 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
1f550 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1f560 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c 61 67 3b 0a  ;..  int nFlag;.
1f570 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46 6c    Tcl_Obj **apFl
1f580 61 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  ag;.  int i;..  
1f590 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
1f5a0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1f5b0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1f5c0 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 46  bjv, "FILENAME F
1f5d0 4c 41 47 53 20 56 46 53 22 29 3b 0a 20 20 20 20  LAGS VFS");.    
1f5e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f5f0 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61 6d  ;.  }.  zFilenam
1f600 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
1f610 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 56  g(objv[1]);.  zV
1f620 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  fs = Tcl_GetStri
1f630 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69  ng(objv[3]);.  i
1f640 66 28 20 7a 56 66 73 5b 30 5d 3d 3d 30 78 30 30  f( zVfs[0]==0x00
1f650 20 29 20 7a 56 66 73 20 3d 20 30 3b 0a 0a 20 20   ) zVfs = 0;..  
1f660 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  rc = Tcl_ListObj
1f670 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65  GetElements(inte
1f680 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e 46  rp, objv[2], &nF
1f690 6c 61 67 2c 20 26 61 70 46 6c 61 67 29 3b 0a 20  lag, &apFlag);. 
1f6a0 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
1f6b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 66  ) return rc;.  f
1f6c0 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 6c 61 67 3b  or(i=0; i<nFlag;
1f6d0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69   i++){.    int i
1f6e0 46 6c 61 67 3b 0a 20 20 20 20 73 74 72 75 63 74  Flag;.    struct
1f6f0 20 4f 70 65 6e 46 6c 61 67 20 7b 0a 20 20 20 20   OpenFlag {.    
1f700 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
1f710 6c 61 67 3b 0a 20 20 20 20 20 20 69 6e 74 20 66  lag;.      int f
1f720 6c 61 67 3b 0a 20 20 20 20 7d 20 61 46 6c 61 67  lag;.    } aFlag
1f730 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22  [] = {.      { "
1f740 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1f750 4f 4e 4c 59 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ONLY", SQLITE_OP
1f760 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20  EN_READONLY },. 
1f770 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1f780 50 45 4e 5f 52 45 41 44 57 52 49 54 45 22 2c 20  PEN_READWRITE", 
1f790 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1f7a0 57 52 49 54 45 20 7d 2c 0a 20 20 20 20 20 20 7b  WRITE },.      {
1f7b0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52   "SQLITE_OPEN_CR
1f7c0 45 41 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  EATE", SQLITE_OP
1f7d0 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20  EN_CREATE },.   
1f7e0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1f7f0 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 22  N_DELETEONCLOSE"
1f800 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  , SQLITE_OPEN_DE
1f810 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a 20  LETEONCLOSE },. 
1f820 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1f830 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 22 2c 20  PEN_EXCLUSIVE", 
1f840 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c  SQLITE_OPEN_EXCL
1f850 55 53 49 56 45 20 7d 2c 0a 20 20 20 20 20 20 7b  USIVE },.      {
1f860 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55   "SQLITE_OPEN_AU
1f870 54 4f 50 52 4f 58 59 22 2c 20 53 51 4c 49 54 45  TOPROXY", SQLITE
1f880 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59 20  _OPEN_AUTOPROXY 
1f890 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49  },.      { "SQLI
1f8a0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 22  TE_OPEN_MAIN_DB"
1f8b0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  , SQLITE_OPEN_MA
1f8c0 49 4e 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20 7b  IN_DB },.      {
1f8d0 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45   "SQLITE_OPEN_TE
1f8e0 4d 50 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f  MP_DB", SQLITE_O
1f8f0 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a 20  PEN_TEMP_DB },. 
1f900 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1f910 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
1f920 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  ", SQLITE_OPEN_T
1f930 52 41 4e 53 49 45 4e 54 5f 44 42 20 7d 2c 0a 20  RANSIENT_DB },. 
1f940 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1f950 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1f960 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
1f970 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20  AIN_JOURNAL },. 
1f980 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1f990 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
1f9a0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  ", SQLITE_OPEN_T
1f9b0 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20  EMP_JOURNAL },. 
1f9c0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1f9d0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 22 2c  PEN_SUBJOURNAL",
1f9e0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42   SQLITE_OPEN_SUB
1f9f0 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20 20  JOURNAL },.     
1fa00 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1fa10 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 22 2c  MASTER_JOURNAL",
1fa20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53   SQLITE_OPEN_MAS
1fa30 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20  TER_JOURNAL },. 
1fa40 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1fa50 50 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20 53 51  PEN_NOMUTEX", SQ
1fa60 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
1fa70 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  X },.      { "SQ
1fa80 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
1fa90 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  TEX", SQLITE_OPE
1faa0 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a 20  N_FULLMUTEX },. 
1fab0 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1fac0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 22  PEN_SHAREDCACHE"
1fad0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  , SQLITE_OPEN_SH
1fae0 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20  AREDCACHE },.   
1faf0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1fb00 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 22 2c  N_PRIVATECACHE",
1fb10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49   SQLITE_OPEN_PRI
1fb20 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20 20  VATECACHE },.   
1fb30 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1fb40 4e 5f 57 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  N_WAL", SQLITE_O
1fb50 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20 20 20  PEN_WAL },.     
1fb60 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1fb70 55 52 49 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  URI", SQLITE_OPE
1fb80 4e 5f 55 52 49 20 7d 2c 0a 20 20 20 20 20 20 7b  N_URI },.      {
1fb90 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a 20   0, 0 }.    };. 
1fba0 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49     rc = Tcl_GetI
1fbb0 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63  ndexFromObjStruc
1fbc0 74 28 69 6e 74 65 72 70 2c 20 61 70 46 6c 61 67  t(interp, apFlag
1fbd0 5b 69 5d 2c 20 61 46 6c 61 67 2c 20 73 69 7a 65  [i], aFlag, size
1fbe0 6f 66 28 61 46 6c 61 67 5b 30 5d 29 2c 20 0a 20  of(aFlag[0]), . 
1fbf0 20 20 20 20 20 20 20 22 66 6c 61 67 22 2c 20 30         "flag", 0
1fc00 2c 20 26 69 46 6c 61 67 0a 20 20 20 20 29 3b 0a  , &iFlag.    );.
1fc10 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f      if( rc!=TCL_
1fc20 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1fc30 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 61 46 6c      flags |= aFl
1fc40 61 67 5b 69 46 6c 61 67 5d 2e 66 6c 61 67 3b 0a  ag[iFlag].flag;.
1fc50 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
1fc60 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69 6c  te3_open_v2(zFil
1fc70 65 6e 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61 67  ename, &db, flag
1fc80 73 2c 20 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  s, zVfs);.  if( 
1fc90 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1fca0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1fcb0 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65  , zBuf, db) ) re
1fcc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1fcd0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1fce0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1fcf0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
1fd00 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1fd10 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70  sage: sqlite3_op
1fd20 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f 70  en16 filename op
1fd30 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20  tions.*/.static 
1fd40 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1fd50 49 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a 20  I test_open16(. 
1fd60 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1fd70 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1fd80 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1fd90 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1fda0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1fdb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1fdc0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f 6e  OMIT_UTF16.  con
1fdd0 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
1fde0 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  me;.  sqlite3 *d
1fdf0 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  b;.  char zBuf[1
1fe00 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  00];..  if( objc
1fe10 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1fe20 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1fe30 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1fe40 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1fe50 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1fe60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1fe70 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
1fe80 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
1fe90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1fea0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
1feb0 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
1fec0 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
1fed0 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20 20  (objv[1], 0);.  
1fee0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 7a  sqlite3_open16(z
1fef0 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a  Filename, &db);.
1ff00 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33    .  if( sqlite3
1ff10 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1ff20 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1ff30 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   db) ) return TC
1ff40 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41  L_ERROR;.  Tcl_A
1ff50 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ff60 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23 65  rp, zBuf, 0);.#e
1ff70 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1ff80 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
1ff90 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1ffa0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1ffb0 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
1ffc0 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67 3e   <UTF-16 string>
1ffd0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
1ffe0 69 66 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  if the supplied 
1fff0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63 6f  argument is a co
20000 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74 65  mplete SQL state
20010 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a 2a  ment, or zero.**
20020 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
20030 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
20040 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6d  _TCLAPI test_com
20050 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64 20  plete16(.  void 
20060 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
20070 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20080 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
20090 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
200a0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 21   objv[].){.#if !
200b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
200c0 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26 26  MIT_COMPLETE) &&
200d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
200e0 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20 63  _OMIT_UTF16).  c
200f0 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69 66  har *zBuf;..  if
20100 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
20110 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
20120 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
20130 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c 3e  v, "<utf-16 sql>
20140 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
20150 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
20160 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29 54   zBuf = (char*)T
20170 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
20180 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
20190 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  0);.  Tcl_SetObj
201a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
201b0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
201c0 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 28  ite3_complete16(
201d0 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66 20  zBuf)));.#endif 
201e0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43  /* SQLITE_OMIT_C
201f0 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49 54  OMPLETE && SQLIT
20200 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
20210 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
20220 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
20230 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c 69   sqlite3_normali
20240 7a 65 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 52 65 74  ze SQL.**.** Ret
20250 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 69 7a  urn the normaliz
20260 65 64 20 76 61 6c 75 65 20 66 6f 72 20 61 6e 20  ed value for an 
20270 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  SQL statement..*
20280 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
20290 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
202a0 6e 6f 72 6d 61 6c 69 7a 65 28 0a 20 20 76 6f 69  normalize(.  voi
202b0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
202c0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
202d0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
202e0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
202f0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
20300 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
20310 72 20 2a 7a 4e 6f 72 6d 3b 0a 20 20 65 78 74 65  r *zNorm;.  exte
20320 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  rn char *sqlite3
20330 5f 6e 6f 72 6d 61 6c 69 7a 65 28 63 6f 6e 73 74  _normalize(const
20340 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28 20   char*);..  if( 
20350 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
20360 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
20370 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
20380 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 72 65 74   "SQL");.    ret
20390 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
203a0 20 7d 0a 0a 20 20 7a 53 71 6c 20 3d 20 28 63 68   }..  zSql = (ch
203b0 61 72 2a 29 54 63 6c 5f 47 65 74 53 74 72 69 6e  ar*)Tcl_GetStrin
203c0 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 4e  g(objv[1]);.  zN
203d0 6f 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6e 6f  orm = sqlite3_no
203e0 72 6d 61 6c 69 7a 65 28 7a 53 71 6c 29 3b 0a 20  rmalize(zSql);. 
203f0 20 69 66 28 20 7a 4e 6f 72 6d 20 29 7b 0a 20 20   if( zNorm ){.  
20400 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
20410 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
20420 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 6f 72  ewStringObj(zNor
20430 6d 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c  m, -1));.    sql
20440 69 74 65 33 5f 66 72 65 65 28 7a 4e 6f 72 6d 29  ite3_free(zNorm)
20450 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
20460 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
20470 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73  Usage: sqlite3_s
20480 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41  tep STMT.**.** A
20490 64 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65  dvance the state
204a0 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  ment to the next
204b0 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
204c0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
204d0 49 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76  I test_step(.  v
204e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
204f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
20500 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
20510 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
20520 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
20530 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
20540 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
20550 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
20560 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
20570 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
20580 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
20590 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
205a0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
205b0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53  ng(objv[0]), " S
205c0 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
205d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
205e0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
205f0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
20600 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
20610 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
20620 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20630 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
20640 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
20650 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d  ;..  /* if( rc!=
20660 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72  SQLITE_DONE && r
20670 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20  c!=SQLITE_ROW ) 
20680 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
20690 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65  ; */.  Tcl_SetRe
206a0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
206b0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
206c0 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
206d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74  rn TCL_OK;.}..st
206e0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
206f0 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c 28  TCLAPI test_sql(
20700 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
20710 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
20720 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
20730 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
20740 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
20750 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
20760 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
20770 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
20780 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
20790 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
207a0 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72  , "STMT");.    r
207b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
207c0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
207d0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
207e0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
207f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
20800 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
20810 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
20820 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
20830 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 73  char *)sqlite3_s
20840 71 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56  ql(pStmt), TCL_V
20850 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75  OLATILE);.  retu
20860 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61  rn TCL_OK;.}.sta
20870 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
20880 43 4c 41 50 49 20 74 65 73 74 5f 65 78 5f 73 71  CLAPI test_ex_sq
20890 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
208a0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
208b0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
208c0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
208d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
208e0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
208f0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68  tmt *pStmt;.  ch
20900 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 6f 62  ar *z;..  if( ob
20910 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
20920 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
20930 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
20940 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
20950 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20960 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
20970 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
20980 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
20990 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
209a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
209b0 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  OR;.  z = sqlite
209c0 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28 70  3_expanded_sql(p
209d0 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
209e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
209f0 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
20a00 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
20a10 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
20a20 5f 4f 4b 3b 0a 7d 0a 23 69 66 64 65 66 20 53 51  _OK;.}.#ifdef SQ
20a30 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d  LITE_ENABLE_NORM
20a40 41 4c 49 5a 45 0a 73 74 61 74 69 63 20 69 6e 74  ALIZE.static int
20a50 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
20a60 65 73 74 5f 6e 6f 72 6d 5f 73 71 6c 28 0a 20 20  est_norm_sql(.  
20a70 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20a80 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20a90 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
20aa0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
20ab0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
20ac0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20ad0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
20ae0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
20af0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
20b00 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
20b10 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75  STMT");.    retu
20b20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20b30 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
20b40 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
20b50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
20b60 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
20b70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
20b80 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  OR;.  Tcl_SetRes
20b90 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
20ba0 72 20 2a 29 73 71 6c 69 74 65 33 5f 6e 6f 72 6d  r *)sqlite3_norm
20bb0 61 6c 69 7a 65 64 5f 73 71 6c 28 70 53 74 6d 74  alized_sql(pStmt
20bc0 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  ), TCL_VOLATILE)
20bd0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
20be0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
20bf0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52  QLITE_ENABLE_NOR
20c00 4d 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  MALIZE */../*.**
20c10 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
20c20 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d  column_count STM
20c30 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
20c40 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
20c50 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
20c60 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  y the sql statem
20c70 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61  ent STMT..*/.sta
20c80 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
20c90 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d  CLAPI test_colum
20ca0 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20  n_count(.  void 
20cb0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
20cc0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20cd0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
20ce0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
20cf0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
20d00 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
20d10 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
20d20 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
20d30 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
20d40 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
20d50 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
20d60 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
20d70 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
20d80 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
20d90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
20da0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
20db0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
20dc0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
20dd0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
20de0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
20df0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
20e00 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
20e10 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
20e20 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
20e30 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
20e40 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
20e50 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
20e60 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
20e70 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d  _column_type STM
20e80 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
20e90 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f  eturn the type o
20ea0 66 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  f the data in co
20eb0 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
20ec0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
20ed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20ee0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
20ef0 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a  st_column_type(.
20f00 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
20f10 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
20f20 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
20f30 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
20f40 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20f50 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
20f60 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
20f70 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20  ol;.  int tp;.. 
20f80 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
20f90 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
20fa0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
20fb0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
20fc0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
20fd0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
20fe0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
20ff0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
21000 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
21010 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
21020 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
21030 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
21040 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
21050 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
21060 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
21070 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
21080 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
21090 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
210a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
210b0 20 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   tp = sqlite3_co
210c0 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
210d0 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28   col);.  switch(
210e0 20 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   tp ){.    case 
210f0 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
21100 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
21110 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e  sult(interp, "IN
21120 54 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54  TEGER", TCL_STAT
21130 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
21140 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
21150 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54  TE_NULL:.      T
21160 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
21170 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c  erp, "NULL", TCL
21180 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
21190 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
211a0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20   SQLITE_FLOAT:. 
211b0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
211c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41  lt(interp, "FLOA
211d0 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  T", TCL_STATIC);
211e0 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
211f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
21200 45 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  EXT:.      Tcl_S
21210 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
21220 20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41   "TEXT", TCL_STA
21230 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
21240 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
21250 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  ITE_BLOB:.      
21260 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
21270 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43  terp, "BLOB", TC
21280 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
21290 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
212a0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
212b0 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  rt(0);.  }..  re
212c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
212d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
212e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
212f0 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  4 STMT column.**
21300 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
21310 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63  ata in column 'c
21320 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75  olumn' of the cu
21330 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61  rrent row cast a
21340 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34  s an.** wide (64
21350 2d 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a  -bit) integer..*
21360 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
21370 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
21380 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20  column_int64(.  
21390 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
213a0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
213b0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
213c0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
213d0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
213e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
213f0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
21400 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20  ;.  i64 iVal;.. 
21410 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
21420 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
21430 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
21440 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
21450 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
21460 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
21470 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
21480 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
21490 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
214a0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
214b0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
214c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
214d0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
214e0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
214f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
21500 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
21510 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
21520 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
21530 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
21540 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iVal = sqlite3_
21550 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
21560 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f  mt, col);.  Tcl_
21570 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
21580 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
21590 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20  IntObj(iVal));. 
215a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
215b0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
215c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
215d0 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  lob STMT column.
215e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
215f0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
21600 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20  _column_blob(.  
21610 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
21620 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
21630 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
21640 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
21650 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
21660 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
21670 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
21680 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ;..  int len;.  
21690 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
216a0 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  b;..  if( objc!=
216b0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
216c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
216d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
216e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
216f0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
21700 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
21710 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
21720 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
21730 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
21740 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
21750 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
21760 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
21770 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
21780 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21790 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
217a0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
217b0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
217c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
217d0 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  R;..  len = sqli
217e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
217f0 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
21800 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
21810 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
21820 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
21830 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
21840 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
21850 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c  rrayObj(pBlob, l
21860 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  en));.  return T
21870 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
21880 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
21890 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d  olumn_double STM
218a0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
218b0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69  eturn the data i
218c0 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
218d0 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
218e0 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64   row cast as a d
218f0 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ouble..*/.static
21900 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
21910 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64  PI test_column_d
21920 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
21930 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
21940 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
21950 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
21960 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
21970 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
21980 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
21990 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75    int col;.  dou
219a0 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28  ble rVal;..  if(
219b0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
219c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
219d0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
219e0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
219f0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
21a00 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
21a10 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
21a20 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
21a30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
21a40 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
21a50 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
21a60 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
21a70 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
21a80 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
21a90 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
21aa0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
21ab0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
21ac0 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
21ad0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61  CL_ERROR;..  rVa
21ae0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
21af0 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
21b00 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
21b10 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
21b20 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  , Tcl_NewDoubleO
21b30 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(rVal));.  ret
21b40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
21b50 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
21b60 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53  te3_data_count S
21b70 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
21b80 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
21b90 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
21ba0 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
21bb0 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
21bc0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
21bd0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 61 74  _TCLAPI test_dat
21be0 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20  a_count(.  void 
21bf0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
21c00 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
21c10 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
21c20 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
21c30 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
21c40 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
21c50 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
21c60 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
21c70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
21c80 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
21c90 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
21ca0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
21cb0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
21cc0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
21cd0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
21ce0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
21cf0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
21d00 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
21d10 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
21d20 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
21d30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
21d40 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
21d50 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
21d60 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
21d70 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d  _data_count(pStm
21d80 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
21d90 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
21da0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
21db0 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20  olumn_text STMT 
21dc0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
21dd0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
21de0 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54  mn_decltype STMT
21df0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
21e00 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
21e10 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f  umn_name STMT co
21e20 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
21e30 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
21e40 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28   test_stmt_utf8(
21e50 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
21e60 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20  Data,        /* 
21e70 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
21e80 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
21e90 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20  o be invoke */. 
21ea0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
21eb0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
21ec0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21ed0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
21ee0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
21ef0 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
21f00 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46  const char *(*xF
21f10 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
21f20 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73  t*, int);.  cons
21f30 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20  t char *zRet;.. 
21f40 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20   xFunc = (const 
21f50 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65  char *(*)(sqlite
21f60 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c  3_stmt*, int))cl
21f70 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20  ientData;.  if( 
21f80 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
21f90 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
21fa0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
21fb0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
21fc0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
21fd0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
21fe0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
21ff0 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
22000 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22010 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
22020 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
22030 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
22040 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
22050 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
22060 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
22070 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
22080 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
22090 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
220a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20  L_ERROR;.  zRet 
220b0 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
220c0 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20  ol);.  if( zRet 
220d0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
220e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
220f0 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20  ar *)zRet, 0);. 
22100 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
22110 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
22120 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
22130 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  test_global_reco
22140 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ver(.  void * cl
22150 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
22160 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
22170 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
22180 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
22190 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
221a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
221b0 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a  CATED.  int rc;.
221c0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
221d0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
221e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
221f0 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
22200 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22210 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
22220 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
22230 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ver();.  Tcl_Set
22240 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
22250 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
22260 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
22270 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  IC);.#endif.  re
22280 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
22290 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
222a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
222b0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
222c0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
222d0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
222e0 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
222f0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
22300 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53  e3_column_name S
22310 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  TMT column.*/.st
22320 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
22330 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74  TCLAPI test_stmt
22340 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20 2a  _utf16(.  void *
22350 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
22360 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
22370 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
22380 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
22390 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
223a0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
223b0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
223c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
223d0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
223e0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
223f0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
22400 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54  ;.  int col;.  T
22410 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20  cl_Obj *pRet;.  
22420 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
22430 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  e16;.  const voi
22440 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  d *(*xFunc)(sqli
22450 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b  te3_stmt*, int);
22460 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e  ..  xFunc = (con
22470 73 74 20 76 6f 69 64 20 2a 28 2a 29 28 73 71 6c  st void *(*)(sql
22480 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
22490 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  )clientData;.  i
224a0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
224b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
224c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
224d0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
224e0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
224f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
22500 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
22510 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
22520 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22530 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
22540 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
22550 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
22560 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
22570 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
22580 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
22590 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
225a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
225b0 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
225c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
225d0 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28 70  Name16 = xFunc(p
225e0 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66  Stmt, col);.  if
225f0 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20 20  ( zName16 ){.   
22600 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e 73   int n;.    cons
22610 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d  t char *z = zNam
22620 65 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  e16;.    for(n=0
22630 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d  ; z[n] || z[n+1]
22640 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20 70 52  ; n+=2){}.    pR
22650 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  et = Tcl_NewByte
22660 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36  ArrayObj(zName16
22670 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f  , n+2);.    Tcl_
22680 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
22690 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a  erp, pRet);.  }.
226a0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
226b0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
226c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
226d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
226e0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
226f0 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  int STMT column.
22700 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
22710 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
22720 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  s STMT column.**
22730 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
22740 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31  e3_column_bytes1
22750 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  6 STMT column.**
22760 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
22770 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
22780 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f  t_stmt_int(.  vo
22790 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
227a0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
227b0 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e  o SQLite API fun
227c0 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
227d0 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ked */.  Tcl_Int
227e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
227f0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
22800 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
22810 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
22820 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
22830 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46   col;.  int (*xF
22840 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
22850 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75  t*, int);..  xFu
22860 6e 63 20 3d 20 28 69 6e 74 20 28 2a 29 28 73 71  nc = (int (*)(sq
22870 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
22880 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ))clientData;.  
22890 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
228a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
228b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
228c0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
228d0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
228e0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
228f0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
22900 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
22910 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22920 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
22930 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
22940 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
22950 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
22960 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
22970 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
22980 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
22990 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
229a0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
229b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
229c0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
229d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
229e0 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74  IntObj(xFunc(pSt
229f0 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65  mt, col)));.  re
22a00 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
22a10 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
22a20 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20  lite_set_magic  
22a30 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52  DB  MAGIC-NUMBER
22a40 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  .**.** Set the d
22a50 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e 20  b->magic value. 
22a60 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
22a70 20 74 65 73 74 20 65 72 72 6f 72 20 72 65 63 6f   test error reco
22a80 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73  very logic..*/.s
22a90 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
22aa0 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65 5f 73  _TCLAPI sqlite_s
22ab0 65 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64  et_magic(.  void
22ac0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
22ad0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
22ae0 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
22af0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
22b00 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
22b10 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
22b20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
22b30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
22b40 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
22b50 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
22b60 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22  v[0],.         "
22b70 20 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a   DB MAGIC", 0);.
22b80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22b90 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
22ba0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
22bb0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
22bc0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
22bd0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72  ERROR;.  if( str
22be0 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
22bf0 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22  LITE_MAGIC_OPEN"
22c00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
22c10 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
22c20 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGIC_OPEN;.  }el
22c30 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
22c40 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
22c50 41 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30  AGIC_CLOSED")==0
22c60 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
22c70 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
22c80 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65  _CLOSED;.  }else
22c90 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
22ca0 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
22cb0 49 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a  IC_BUSY")==0 ){.
22cc0 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
22cd0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
22ce0 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  Y;.  }else if( s
22cf0 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
22d00 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
22d10 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  OR")==0 ){.    d
22d20 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
22d30 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20  E_MAGIC_ERROR;. 
22d40 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47   }else if( Tcl_G
22d50 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
22d60 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62  gv[2], (int*)&db
22d70 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20  ->magic) ){.    
22d80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22d90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
22da0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
22db0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
22dc0 69 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a  interrupt  DB .*
22dd0 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20  *.** Trigger an 
22de0 69 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a  interrupt on DB.
22df0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
22e00 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
22e10 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f  _interrupt(.  vo
22e20 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
22e30 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22e40 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
22e50 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
22e60 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
22e70 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
22e80 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
22e90 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
22ea0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
22eb0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
22ec0 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30  rgv[0], " DB", 0
22ed0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
22ee0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
22ef0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
22f00 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
22f10 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
22f20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
22f30 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62  te3_interrupt(db
22f40 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
22f50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
22f60 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74  ge: sqlite_delet
22f70 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 66 75  e_function DB fu
22f80 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a  nction-name.**.*
22f90 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75 73 65  * Delete the use
22fa0 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63  r function 'func
22fb0 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20  tion-name' from 
22fc0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
22fd0 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73 73  DB. It.** is ass
22fe0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 75 73  umed that the us
22ff0 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  er function was 
23000 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38 2c  created as UTF8,
23010 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   any number of.*
23020 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74 68 65  * arguments (the
23030 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74   way the TCL int
23040 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e  erface does it).
23050 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
23060 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 65 6c  QLITE_TCLAPI del
23070 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ete_function(.  
23080 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
23090 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
230a0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
230b0 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
230c0 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gv.){.  int rc;.
230d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
230e0 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
230f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
23100 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
23110 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
23120 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
23130 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
23140 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22  B function-name"
23150 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
23160 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23170 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
23180 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
23190 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
231a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
231b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
231c0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
231d0 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
231e0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20  ITE_UTF8, 0, 0, 
231f0 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74  0, 0);.  Tcl_Set
23200 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
23210 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
23220 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
23230 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
23240 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
23250 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c  sage: sqlite_del
23260 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42  ete_collation DB
23270 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a   collation-name.
23280 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  **.** Delete the
23290 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
232a0 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e  nce 'collation-n
232b0 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61  ame' from databa
232c0 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42  se handle .** DB
232d0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
232e0 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
232f0 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20  on sequence was 
23300 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20  created as UTF8 
23310 28 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65  (the .** way the
23320 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64   TCL interface d
23330 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74  oes it)..*/.stat
23340 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
23350 4c 41 50 49 20 64 65 6c 65 74 65 5f 63 6f 6c 6c  LAPI delete_coll
23360 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ation(.  void * 
23370 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
23380 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
23390 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
233a0 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
233b0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
233c0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
233d0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
233e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
233f0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
23400 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
23410 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
23420 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74        " DB funct
23430 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20  ion-name", 0);. 
23440 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
23450 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
23460 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
23470 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
23480 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
23490 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
234a0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
234b0 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ation(db, argv[2
234c0 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ], SQLITE_UTF8, 
234d0 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74  0, 0);.  Tcl_Set
234e0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
234f0 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
23500 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
23510 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
23520 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
23530 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67 65  sage: sqlite3_ge
23540 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42 0a  t_autocommit DB.
23550 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
23560 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
23570 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74 6c  e DB is currentl
23580 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74  y in auto-commit
23590 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72 6e   mode..** Return
235a0 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
235b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
235c0 49 54 45 5f 54 43 4c 41 50 49 20 67 65 74 5f 61  ITE_TCLAPI get_a
235d0 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69  utocommit(.  voi
235e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
235f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
23600 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
23610 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
23620 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  ){.  char zBuf[3
23630 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  0];.  sqlite3 *d
23640 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
23650 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
23660 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
23670 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
23680 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
23690 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
236a0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
236b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
236c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
236d0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
236e0 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
236f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23700 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  R;.  sqlite3_snp
23710 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
23720 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20  f), zBuf, "%d", 
23730 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
23740 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20 54  commit(db));.  T
23750 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
23760 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
23770 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
23780 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
23790 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  e: sqlite3_busy_
237a0 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a  timeout DB MS.**
237b0 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
237c0 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73 20   timeout.  This 
237d0 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 64  is more easily d
237e0 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74 69  one using the ti
237f0 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20  meout.** method 
23800 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  of the TCL inter
23810 66 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e 65  face.  But we ne
23820 65 64 20 61 20 77 61 79 20 74 6f 20 74 65 73 74  ed a way to test
23830 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
23840 72 65 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  re it returns SQ
23850 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a  LITE_MISUSE..*/.
23860 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
23870 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 75  E_TCLAPI test_bu
23880 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f  sy_timeout(.  vo
23890 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
238a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
238b0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
238c0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
238d0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73  .){.  int rc, ms
238e0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
238f0 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
23900 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
23910 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
23920 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
23930 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
23940 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
23950 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
23960 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
23970 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
23980 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
23990 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
239a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
239b0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
239c0 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
239d0 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
239e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
239f0 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f   = sqlite3_busy_
23a00 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b  timeout(db, ms);
23a10 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
23a20 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
23a30 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
23a40 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
23a50 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
23a60 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62  age:  tcl_variab
23a70 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45  le_type VARIABLE
23a80 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  NAME.**.** Retur
23a90 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
23aa0 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65  e internal repre
23ab0 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68  sentation for th
23ac0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  e.** value of th
23ad0 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65  e given variable
23ae0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23af0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 63  SQLITE_TCLAPI tc
23b00 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28  l_variable_type(
23b10 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
23b20 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
23b30 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
23b40 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
23b50 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
23b60 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
23b70 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ar;.  if( objc!=
23b80 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
23b90 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
23ba0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49  , 1, objv, "VARI
23bb0 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75  ABLE");.    retu
23bc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23bd0 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47  }.  pVar = Tcl_G
23be0 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c  etVar2Ex(interp,
23bf0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
23c00 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f  bjv[1]), 0, TCL_
23c10 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a  LEAVE_ERR_MSG);.
23c20 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20    if( pVar==0 ) 
23c30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23c40 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79  ;.  if( pVar->ty
23c50 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c  pePtr ){.    Tcl
23c60 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
23c70 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
23c80 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70  ingObj(pVar->typ
23c90 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29  ePtr->name, -1))
23ca0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
23cb0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
23cc0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
23cd0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f  release_memory ?
23ce0 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  N?.**.** Attempt
23cf0 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f   to release memo
23d00 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ry currently hel
23d10 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  d but not actual
23d20 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  ly required..** 
23d30 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73  The integer N is
23d40 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
23d50 79 74 65 73 20 77 65 20 61 72 65 20 74 72 79 69  ytes we are tryi
23d60 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20  ng to release.  
23d70 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76  The .** return v
23d80 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75  alue is the amou
23d90 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74  nt of memory act
23da0 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a  ually released..
23db0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
23dc0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
23dd0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
23de0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
23df0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
23e00 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
23e10 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
23e20 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
23e30 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
23e40 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
23e50 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20  ORY_MANAGEMENT) 
23e60 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
23e70 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
23e80 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 61    int N;.  int a
23e90 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
23ea0 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
23eb0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
23ec0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
23ed0 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
23ee0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23ef0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
23f00 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
23f10 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
23f20 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
23f30 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e  1], &N) ) return
23f40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
23f50 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31 3b  lse{.    N = -1;
23f60 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c  .  }.  amt = sql
23f70 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
23f80 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  ory(N);.  Tcl_Se
23f90 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
23fa0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
23fb0 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (amt));.#endif. 
23fc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
23fd0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
23fe0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c    sqlite3_db_rel
23ff0 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42 0a 2a  ease_memory DB.*
24000 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
24010 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 63  release memory c
24020 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79  urrently held by
24030 20 64 61 74 61 62 61 73 65 20 44 42 2e 20 20 52   database DB.  R
24040 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72 65 73  eturn the.** res
24050 75 6c 74 20 63 6f 64 65 20 28 77 68 69 63 68 20  ult code (which 
24060 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
24070 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
24080 20 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e 0a 2a   always zero)..*
24090 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
240a0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
240b0 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
240c0 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
240d0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
240e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
240f0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
24100 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24110 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
24120 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
24130 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
24140 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
24150 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
24160 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
24170 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24180 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
24190 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
241a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
241b0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
241c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
241d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
241e0 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
241f0 72 79 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  ry(db);.  Tcl_Se
24200 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
24210 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
24220 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (rc));.  return 
24230 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
24240 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
24250 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 20 44  _db_cacheflush D
24260 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  B.**.** Attempt 
24270 74 6f 20 66 6c 75 73 68 20 61 6e 79 20 64 69 72  to flush any dir
24280 74 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b  ty pages to disk
24290 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
242a0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
242b0 73 74 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68  st_db_cacheflush
242c0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
242d0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
242e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
242f0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
24300 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
24310 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
24320 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
24330 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
24340 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
24350 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
24360 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
24370 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24380 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
24390 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
243a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
243b0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
243c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
243d0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
243e0 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 64 62  db_cacheflush(db
243f0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
24400 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
24410 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
24420 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72  )sqlite3ErrStr(r
24430 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
24440 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
24450 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 54 63  ERROR;.  }..  Tc
24460 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
24470 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
24480 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
24490 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
244a0 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 20 44 42  _system_errno DB
244b0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
244c0 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 73 79 73 74  e low-level syst
244d0 65 6d 20 65 72 72 6e 6f 20 76 61 6c 75 65 2e 0a  em errno value..
244e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
244f0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
24500 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 0a 20  _system_errno(. 
24510 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
24520 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
24530 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
24540 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
24550 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
24560 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
24570 20 20 69 6e 74 20 69 45 72 72 6e 6f 3b 0a 20 20    int iErrno;.  
24580 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
24590 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
245a0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
245b0 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
245c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
245d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
245e0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
245f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
24600 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
24610 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24620 3b 0a 20 20 69 45 72 72 6e 6f 20 3d 20 73 71 6c  ;.  iErrno = sql
24630 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e  ite3_system_errn
24640 6f 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  o(db);.  Tcl_Set
24650 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
24660 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
24670 69 45 72 72 6e 6f 29 29 3b 0a 20 20 72 65 74 75  iErrno));.  retu
24680 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
24690 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
246a0 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 20  te3_db_filename 
246b0 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  DB DBNAME.**.** 
246c0 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
246d0 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63 69  of a file associ
246e0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
246f0 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
24700 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
24710 49 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e 61  I test_db_filena
24720 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  me(.  void * cli
24730 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
24740 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
24750 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
24760 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
24770 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
24780 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
24790 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66  r *zDbName;.  if
247a0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
247b0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
247c0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
247d0 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b  v, "DB DBNAME");
247e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
247f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
24800 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
24810 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
24820 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
24830 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
24840 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65  ERROR;.  zDbName
24850 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
24860 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c  (objv[2]);.  Tcl
24870 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
24880 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 64 62  terp, sqlite3_db
24890 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c 20 7a 44  _filename(db, zD
248a0 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64 2a 29 30  bName), (void*)0
248b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
248c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
248d0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  ge:  sqlite3_db_
248e0 72 65 61 64 6f 6e 6c 79 20 44 42 20 44 42 4e 41  readonly DB DBNA
248f0 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ME.**.** Return 
24900 31 20 6f 72 20 30 20 69 66 20 44 42 4e 41 4d 45  1 or 0 if DBNAME
24910 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 6f 72 20   is readonly or 
24920 6e 6f 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  not.  Return -1 
24930 69 66 20 44 42 4e 41 4d 45 20 64 6f 65 73 0a 2a  if DBNAME does.*
24940 2a 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  * not exist..*/.
24950 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
24960 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 62  E_TCLAPI test_db
24970 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69  _readonly(.  voi
24980 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
24990 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
249a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
249b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
249c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
249d0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
249e0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
249f0 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  e;.  if( objc!=3
24a00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
24a10 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
24a20 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
24a30 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
24a40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24a50 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
24a60 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
24a70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
24a80 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
24a90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24aa0 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zDbName = Tcl_Ge
24ab0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
24ac0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
24ad0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
24ae0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
24af0 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 64  e3_db_readonly(d
24b00 62 2c 20 7a 44 62 4e 61 6d 65 29 29 29 3b 0a 20  b, zDbName)));. 
24b10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
24b20 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
24b30 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
24b40 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a  ap_limit ?N?.**.
24b50 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
24b60 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69  the soft heap li
24b70 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  mit for the curr
24b80 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68 65  ent thread.  The
24b90 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c  .** limit is onl
24ba0 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  y changed if the
24bb0 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20   N is present.  
24bc0 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d  The previous lim
24bd0 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  it.** is returne
24be0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
24bf0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
24c00 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  est_soft_heap_li
24c10 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  mit(.  void * cl
24c20 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
24c30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
24c40 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
24c50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
24c60 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
24c70 5f 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54 63  _int64 amt;.  Tc
24c80 6c 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31  l_WideInt N = -1
24c90 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
24ca0 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  && objc!=2 ){.  
24cb0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
24cc0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
24cd0 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20  jv, "?N?");.    
24ce0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24cf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
24d00 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==2 ){.    if( T
24d10 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
24d20 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
24d30 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
24d40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24d50 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65  }.  amt = sqlite
24d60 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
24d70 74 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  t64(N);.  Tcl_Se
24d80 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
24d90 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
24da0 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65  tObj(amt));.  re
24db0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
24dc0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
24dd0 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
24de0 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  eanup.**.** Call
24df0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72   the sqlite3_thr
24e00 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e  ead_cleanup API.
24e10 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
24e20 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
24e30 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  t_thread_cleanup
24e40 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
24e50 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
24e60 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
24e70 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
24e80 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
24e90 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
24ea0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
24eb0 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72  ED.  sqlite3_thr
24ec0 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23  ead_cleanup();.#
24ed0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
24ee0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
24ef0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
24f00 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
24f10 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72    DB.**.** Retur
24f20 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62  n a list of numb
24f30 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ers which are th
24f40 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20  e PagerRefcount 
24f50 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72  for all.** pager
24f60 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61  s on each databa
24f70 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
24f80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
24f90 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
24fa0 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28  pager_refcounts(
24fb0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
24fc0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
24fd0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
24fe0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
24ff0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
25000 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25010 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
25020 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62   v, *a;.  Tcl_Ob
25030 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69  j *pResult;..  i
25040 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
25050 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
25060 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
25070 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
25080 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
25090 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
250a0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
250b0 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
250c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
250d0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
250e0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
250f0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
25100 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
25110 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
25120 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20  OR;.  pResult = 
25130 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
25140 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
25150 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
25160 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
25170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
25180 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
25190 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
251a0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
251b0 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20  tex);.      a = 
251c0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
251d0 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  s(sqlite3BtreePa
251e0 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ger(db->aDb[i].p
251f0 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20  Bt));.      v = 
25200 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[0];.      sqli
25210 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
25220 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
25230 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  }.    Tcl_ListOb
25240 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
25250 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e  , pResult, Tcl_N
25260 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
25270 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
25280 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
25290 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  sult);.  return 
252a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
252b0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b  * tclcmd:   work
252c0 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a  ing_64bit_int.**
252d0 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69  .** Some TCL bui
252e0 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29  lds (ex: cygwin)
252f0 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
25300 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e  64-bit integers.
25310 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20    This.** leads 
25320 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74  to a number of t
25330 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54  est failures.  T
25340 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61  he present comma
25350 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a  nd checks the.**
25360 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65   TCL build to se
25370 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
25380 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d   it supports 64-
25390 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49  bit integers.  I
253a0 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55  t.** returns TRU
253b0 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  E if it does and
253c0 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a   FALSE if not..*
253d0 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  *.** This comman
253e0 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72  d is used to war
253f0 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65  n users that the
25400 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20  ir TCL build is 
25410 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64  defective.** and
25420 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73   that the errors
25430 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67   they are seeing
25440 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72   in the test scr
25450 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  ipts might be.**
25460 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
25470 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c  ir defective TCL
25480 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f   rather than pro
25490 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e  blems in SQLite.
254a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
254b0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 6f 72  QLITE_TCLAPI wor
254c0 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a  king_64bit_int(.
254d0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
254e0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
254f0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
25500 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
25510 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
25520 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
25530 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
25540 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
25550 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
25560 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
25570 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
25580 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
25590 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
255a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
255b0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
255c0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
255d0 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20  Obj *pTestObj;. 
255e0 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30   int working = 0
255f0 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20  ;..  pTestObj = 
25600 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
25610 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34 29 31  j(1000000*(i64)1
25620 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f  234567890);.  wo
25630 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54  rking = strcmp(T
25640 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65  cl_GetString(pTe
25650 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37  stObj), "1234567
25660 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a  890000000")==0;.
25670 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
25680 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20  nt(pTestObj);.  
25690 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
256a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
256b0 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69  BooleanObj(worki
256c0 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ng));.  return T
256d0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
256e0 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75   tclcmd:   vfs_u
256f0 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a  nlink_test.**.**
25700 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
25710 64 20 75 6e 72 65 67 69 73 74 65 72 73 20 74 68  d unregisters th
25720 65 20 70 72 69 6d 61 72 79 20 56 46 53 20 61 6e  e primary VFS an
25730 64 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 73  d then registers
25740 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61 69  .** it back agai
25750 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
25760 20 74 6f 20 74 65 73 74 20 74 68 65 20 61 62 69   to test the abi
25770 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74 65 72  lity to register
25780 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e   a.** VFS when n
25790 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75 73  one are previous
257a0 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c 20 61  ly registered, a
257b0 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79 20 74  nd the ability t
257c0 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65 72  o .** unregister
257d0 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61   the only availa
257e0 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65 74  ble VFS.  Ticket
257f0 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63   #2738.*/.static
25800 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
25810 50 49 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65  PI vfs_unlink_te
25820 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
25830 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
25840 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
25850 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
25860 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
25870 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
25880 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
25890 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
258a0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
258b0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
258c0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
258d0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
258e0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
258f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
25900 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
25910 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
25920 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
25930 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20 73  _vfs *pMain;.  s
25940 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66  qlite3_vfs *apVf
25950 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  s[20];.  sqlite3
25960 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a  _vfs one, two;..
25970 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
25980 72 65 67 69 73 74 65 72 28 30 29 3b 20 20 20 2f  register(0);   /
25990 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66 20  * Unregister of 
259a0 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73 73  NULL is harmless
259b0 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20   */.  one.zName 
259c0 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f  = "__one";.  two
259d0 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f 22  .zName = "__two"
259e0 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20  ;..  /* Calling 
259f0 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
25a00 73 74 65 72 20 77 69 74 68 20 32 6e 64 20 61 72  ster with 2nd ar
25a10 67 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65 73  gument of 0 does
25a20 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65   not.  ** change
25a30 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
25a40 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d 20  .  */.  pMain = 
25a50 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
25a60 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  (0);.  sqlite3_v
25a70 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65  fs_register(&one
25a80 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
25a90 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69  pMain==0 || pMai
25aa0 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  n==sqlite3_vfs_f
25ab0 69 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c 69  ind(0) );.  sqli
25ac0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
25ad0 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73 73  (&two, 0);.  ass
25ae0 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c  ert( pMain==0 ||
25af0 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f   pMain==sqlite3_
25b00 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a  vfs_find(0) );..
25b10 20 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e 64    /* We can find
25b20 20 61 20 56 46 53 20 62 79 20 69 74 73 20 6e 61   a VFS by its na
25b30 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  me */.  assert( 
25b40 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
25b50 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
25b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
25b70 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
25b80 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a  _two")==&two );.
25b90 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71  .  /* Calling sq
25ba0 6c 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74 65  lite_vfs_registe
25bb0 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20  r with non-zero 
25bc0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
25bd0 20 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20 2a   changes the.  *
25be0 2a 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20 65  * default VFS, e
25bf0 76 65 6e 20 69 66 20 74 68 65 20 31 73 74 20 70  ven if the 1st p
25c00 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 65  arameter is an e
25c10 78 69 73 74 69 67 20 56 46 53 20 74 68 61 74 20  xistig VFS that 
25c20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  is.  ** previous
25c30 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73  ly registered as
25c40 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c 74   the non-default
25c50 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
25c60 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f  _vfs_register(&o
25c70 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74  ne, 1);.  assert
25c80 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
25c90 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e  nd("__one")==&on
25ca0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
25cb0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
25cc0 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29  "__two")==&two )
25cd0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
25ce0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d  te3_vfs_find(0)=
25cf0 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69 74  =&one );.  sqlit
25d00 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
25d10 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73 65  &two, 1);.  asse
25d20 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
25d30 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
25d40 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  one );.  assert(
25d50 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
25d60 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
25d70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
25d80 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
25d90 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66 28  )==&two );.  if(
25da0 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73 71   pMain ){.    sq
25db0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
25dc0 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20 20  er(pMain, 1);.  
25dd0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25de0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
25df0 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 20  e")==&one );.   
25e00 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25e10 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
25e20 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20 20  ")==&two );.    
25e30 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25e40 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61  vfs_find(0)==pMa
25e50 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  in );.  }.  .  /
25e60 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65 66  * Unlink the def
25e70 61 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65 61  ault VFS.  Repea
25e80 74 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61 72  t until there ar
25e90 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73 0a  e no more VFSes.
25ea0 20 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64 2e    ** registered.
25eb0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
25ec0 20 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73 29   i<sizeof(apVfs)
25ed0 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d  /sizeof(apVfs[0]
25ee0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56  ); i++){.    apV
25ef0 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f  fs[i] = sqlite3_
25f00 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20  vfs_find(0);.   
25f10 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b   if( apVfs[i] ){
25f20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
25f30 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33  pVfs[i]==sqlite3
25f40 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b  _vfs_find(apVfs[
25f50 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20  i]->zName) );.  
25f60 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
25f70 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73  unregister(apVfs
25f80 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  [i]);.      asse
25f90 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
25fa0 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d  fs_find(apVfs[i]
25fb0 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20  ->zName) );.    
25fc0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
25fd0 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  0==sqlite3_vfs_f
25fe0 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20 2f  ind(0) );.  .  /
25ff0 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 6d  * Register the m
26000 61 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d 64  ain VFS as non-d
26010 65 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65 20  efault (will be 
26020 6d 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73 69  made default, si
26030 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20 62  nce.  ** it'll b
26040 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 69  e the only one i
26050 6e 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20 20  n existence)..  
26060 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
26070 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c  _register(pMain,
26080 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73   0);.  assert( s
26090 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
260a0 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 0a  0)==pMain );.  .
260b0 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65 72    /* Un-register
260c0 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 67   the main VFS ag
260d0 61 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ain to restore a
260e0 6e 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73 74  n empty VFS list
260f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
26100 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d 61  s_unregister(pMa
26110 69 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  in);.  assert( 0
26120 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
26130 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 52  nd(0) );..  /* R
26140 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73 20  elink all VFSes 
26150 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
26160 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 73  . */  .  for(i=s
26170 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a  izeof(apVfs)/siz
26180 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31 3b  eof(apVfs[0])-1;
26190 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
261a0 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b   if( apVfs[i] ){
261b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
261c0 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66  fs_register(apVf
261d0 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20  s[i], 1);.      
261e0 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d  assert( apVfs[i]
261f0 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
26200 6e 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20 61  nd(0) );.      a
26210 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
26220 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
26230 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
26240 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e) );.    }.  }.
26250 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72  .  /* Unregister
26260 20 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53 65   out sample VFSe
26270 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  s. */.  sqlite3_
26280 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
26290 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  one);.  sqlite3_
262a0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
262b0 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65  two);..  /* Unre
262c0 67 69 73 74 65 72 69 6e 67 20 61 20 56 46 53 20  gistering a VFS 
262d0 74 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72 72  that is not curr
262e0 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65 64  ently registered
262f0 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a   is harmless */.
26300 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
26310 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a  register(&one);.
26320 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
26330 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a  register(&two);.
26340 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
26350 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
26360 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  e")==0 );.  asse
26370 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
26380 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 30  find("__two")==0
26390 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f   );..  /* We sho
263a0 75 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74 68  uld be left with
263b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   the original de
263c0 66 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20 61  fault VFS back a
263d0 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  s the.  ** origi
263e0 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nal */.  assert(
263f0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
26400 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a  d(0)==pMain );..
26410 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
26420 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
26430 3a 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c  :   vfs_initfail
26440 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73  _test.**.** This
26450 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74 74   TCL command att
26460 65 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69 6e  empts to vfs_fin
26470 64 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73 74  d and vfs_regist
26480 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 73  er when the.** s
26490 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
264a0 65 28 29 20 69 6e 74 65 72 66 61 63 65 20 69 73  e() interface is
264b0 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20 63   failing.  All c
264c0 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69 6c  alls should fail
264d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
264e0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66  SQLITE_TCLAPI vf
264f0 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 28  s_initfail_test(
26500 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
26510 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
26520 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
26530 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
26540 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
26550 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
26560 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
26570 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
26580 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
26590 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
265a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
265b0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
265c0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
265d0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
265e0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
265f0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
26600 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20 20  ite3_vfs one;.  
26610 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f  one.zName = "__o
26620 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  ne";..  if( sqli
26630 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
26640 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
26650 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  OR;.  sqlite3_vf
26660 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
26670 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
26680 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
26690 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
266a0 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  R;.  sqlite3_vfs
266b0 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20  _register(&one, 
266c0 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  1);.  if( sqlite
266d0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20  3_vfs_find(0) ) 
266e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
266f0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
26700 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  K;.}../*.** Save
26710 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74 69  d VFSes.*/.stati
26720 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61  c sqlite3_vfs *a
26730 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69 63  pVfs[20];.static
26740 20 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a 0a   int nVfs = 0;..
26750 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
26760 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
26770 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69 73  ll.**.** Unregis
26780 74 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a 2a  ter all VFSes..*
26790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
267a0 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f 75  ITE_TCLAPI vfs_u
267b0 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20  nregister_all(. 
267c0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
267d0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
267e0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
267f0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
26800 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
26810 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
26820 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
26830 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
26840 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
26850 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
26860 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26870 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
26880 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
26890 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
268a0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
268b0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
268c0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
268d0 72 72 61 79 53 69 7a 65 28 61 70 56 66 73 29 3b  rraySize(apVfs);
268e0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73   i++){.    apVfs
268f0 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  [i] = sqlite3_vf
26900 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69  s_find(0);.    i
26910 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20 29  f( apVfs[i]==0 )
26920 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69   break;.    sqli
26930 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
26940 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20  er(apVfs[i]);.  
26950 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20 20  }.  nVfs = i;.  
26960 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
26970 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
26980 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
26990 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72  all.**.** Restor
269a0 65 20 61 6c 6c 20 56 46 53 65 73 20 74 68 61 74  e all VFSes that
269b0 20 77 65 72 65 20 72 65 6d 6f 76 65 64 20 75 73   were removed us
269c0 69 6e 67 20 76 66 73 5f 75 6e 72 65 67 69 73 74  ing vfs_unregist
269d0 65 72 5f 61 6c 6c 2e 20 54 61 6b 69 6e 67 0a 2a  er_all. Taking.*
269e0 2a 20 63 61 72 65 20 74 6f 20 70 75 74 20 74 68  * care to put th
269f0 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 62 61  e linked list ba
26a00 63 6b 20 74 6f 67 65 74 68 65 72 20 69 6e 20 74  ck together in t
26a10 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73  he same order as
26a20 20 69 74 20 77 61 73 0a 2a 2a 20 69 6e 20 62 65   it was.** in be
26a30 66 6f 72 65 20 76 66 73 5f 75 6e 72 65 67 69 73  fore vfs_unregis
26a40 74 65 72 5f 61 6c 6c 20 77 61 73 20 69 6e 76 6f  ter_all was invo
26a50 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
26a60 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
26a70 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
26a80 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  all(.  ClientDat
26a90 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
26aa0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
26ab0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
26ac0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
26ad0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
26ae0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
26af0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
26b00 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
26b10 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
26b20 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
26b30 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26b40 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
26b50 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
26b60 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
26b70 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
26b80 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
26b90 6e 56 66 73 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nVfs-1; i>=0; i-
26ba0 2d 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -){.    sqlite3_
26bb0 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56  vfs_register(apV
26bc0 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 20  fs[i], 1);.  }. 
26bd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
26be0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
26bf0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
26c00 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54  _test DB.**.** T
26c10 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
26c20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
26c30 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
26c40 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
26c50 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
26c60 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
26c70 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   same..*/.static
26c80 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
26c90 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  PI file_control_
26ca0 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
26cb0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
26cc0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
26cd0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
26ce0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
26cf0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
26d00 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
26d10 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
26d20 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
26d30 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
26d40 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
26d50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
26d60 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
26d70 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
26d80 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
26d90 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
26da0 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a    int iArg = 0;.
26db0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
26dc0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
26dd0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
26de0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
26df0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
26e00 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
26e10 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
26e20 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
26e30 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
26e40 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
26e50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26e60 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
26e70 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
26e80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
26e90 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
26ea0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26eb0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
26ec0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
26ed0 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20   0, 0, &iArg);. 
26ee0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
26ef0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a  ITE_NOTFOUND );.
26f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
26f10 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
26f20 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20  "notadatabase", 
26f30 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
26f40 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a  KSTATE, &iArg);.
26f50 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
26f60 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
26f70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
26f80 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d  e_control(db, "m
26f90 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29  ain", -1, &iArg)
26fa0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
26fb0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
26fc0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
26fd0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
26fe0 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26  b, "temp", -1, &
26ff0 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
27000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
27010 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OUND || rc==SQLI
27020 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72  TE_ERROR );..  r
27030 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
27040 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
27050 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
27060 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42  asterrno_test DB
27070 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
27080 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
27090 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
270a0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
270b0 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
270c0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
270d0 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  n of the SQLITE_
270e0 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e  LAST_ERRNO verb.
270f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
27100 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c  QLITE_TCLAPI fil
27110 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
27120 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  rno_test(.  Clie
27130 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
27140 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
27150 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
27160 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
27170 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
27180 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
27190 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
271a0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
271b0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
271c0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
271d0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
271e0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
271f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
27200 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
27210 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
27220 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d  .){.  int iArg =
27230 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
27240 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
27250 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
27260 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
27270 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
27280 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
27290 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
272a0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
272b0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
272c0 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
272d0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
272e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
272f0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
27300 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
27310 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
27320 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
27330 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
27340 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
27350 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
27360 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  LL, SQLITE_LAST_
27370 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20  ERRNO, &iArg);. 
27380 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20   if( rc ){ .    
27390 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
273a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
273b0 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
273c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
273d0 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69  OR; .  }.  if( i
273e0 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54  Arg!=0 ) {.    T
273f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
27400 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63  interp, "Unexpec
27410 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72  ted non-zero err
27420 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  no: ",.         
27430 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
27440 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
27450 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69  (Tcl_NewIntObj(i
27460 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30  Arg), 0), " ", 0
27470 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
27480 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
27490 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
274a0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
274b0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
274c0 64 61 74 61 5f 76 65 72 73 69 6f 6e 20 44 42 20  data_version DB 
274d0 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 68 69  DBNAME.**.** Thi
274e0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
274f0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
27500 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 77 69 74 68  ile_control with
27510 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46   the.** SQLITE_F
27520 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49 4f  CNTL_DATA_VERSIO
27530 4e 20 6f 70 63 6f 64 65 2c 20 72 65 74 75 72 6e  N opcode, return
27540 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 2e 0a  ing the result..
27550 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
27560 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
27570 5f 63 6f 6e 74 72 6f 6c 5f 64 61 74 61 5f 76 65  _control_data_ve
27580 72 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74 44  rsion(.  ClientD
27590 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
275a0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
275b0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
275c0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
275d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
275e0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
275f0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
27600 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
27610 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
27620 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
27630 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
27640 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
27650 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
27660 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
27670 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
27680 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
27690 69 56 65 72 73 3b 20 20 20 20 20 20 20 20 20 20  iVers;          
276a0 20 20 20 2f 2a 20 64 61 74 61 20 76 65 72 73 69     /* data versi
276b0 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  on */.  char *zD
276c0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
276d0 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61          /* Db na
276e0 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  me ("main", "tem
276f0 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71  p" etc.) */.  sq
27700 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
27710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27720 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
27730 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
27740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27750 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f        /* file_co
27760 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63  ntrol() return c
27770 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a 42  ode */.  char zB
27780 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
27790 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21  objc!=3 && objc!
277a0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
277b0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
277c0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
277d0 5b 44 42 4e 41 4d 45 5d 22 29 3b 0a 20 20 20 20  [DBNAME]");.    
277e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
277f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
27800 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
27810 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
27820 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
27830 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  .   return TCL_E
27840 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
27850 3d 20 6f 62 6a 63 3d 3d 33 20 3f 20 54 63 6c 5f  = objc==3 ? Tcl_
27860 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
27870 5d 29 20 3a 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63  ]) : NULL;..  rc
27880 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
27890 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
278a0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 41   SQLITE_FCNTL_DA
278b0 54 41 5f 56 45 52 53 49 4f 4e 2c 20 28 76 6f 69  TA_VERSION, (voi
278c0 64 20 2a 29 26 69 56 65 72 73 29 3b 0a 20 20 69  d *)&iVers);.  i
278d0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c  f( rc ){.    Tcl
278e0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
278f0 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
27900 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54  e3ErrName(rc), T
27910 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
27920 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27930 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
27940 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
27950 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75  sizeof(zBuf),zBu
27960 66 2c 22 25 75 22 2c 69 56 65 72 73 29 3b 0a 20  f,"%u",iVers);. 
27970 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
27980 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
27990 29 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41 54  )zBuf, TCL_VOLAT
279a0 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ILE);.    return
279b0 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a   TCL_OK;.  }.}..
279c0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
279d0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75  file_control_chu
279e0 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44 42 20 44  nksize_test DB D
279f0 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a  BNAME SIZE.**.**
27a00 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
27a10 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
27a20 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
27a30 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
27a40 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
27a50 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
27a60 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  he SQLITE_GET_LO
27a70 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a  CKPROXYFILE and.
27a80 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  ** SQLITE_SET_LO
27a90 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62  CKPROXYFILE verb
27aa0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
27ab0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66   SQLITE_TCLAPI f
27ac0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
27ad0 6b 73 69 7a 65 5f 74 65 73 74 28 0a 20 20 43 6c  ksize_test(.  Cl
27ae0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
27af0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
27b00 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
27b10 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
27b20 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
27b30 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
27b40 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
27b50 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
27b60 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
27b70 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
27b80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27b90 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
27ba0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
27bb0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
27bc0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
27bd0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  */.){.  int nSiz
27be0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
27bf0 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
27c00 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 63  hunk size */.  c
27c10 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
27c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
27c30 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e  * Db name ("main
27c40 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20  ", "temp" etc.) 
27c50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
27c60 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
27c70 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
27c80 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
27c90 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
27ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27cb0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72  file_control() r
27cc0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
27cd0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
27ce0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
27cf0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
27d00 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
27d10 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74   SIZE");.    ret
27d20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27d30 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
27d40 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
27d50 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
27d60 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c  [1]), &db) .   |
27d70 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  | Tcl_GetIntFrom
27d80 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
27d90 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29  [3], &nSize).  )
27da0 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
27db0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
27dc0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
27dd0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
27de0 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20   zDb[0]=='\0' ) 
27df0 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72  zDb = NULL;..  r
27e00 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
27e10 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
27e20 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
27e30 48 55 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f 69 64  HUNK_SIZE, (void
27e40 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66   *)&nSize);.  if
27e50 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
27e60 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
27e70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
27e80 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
27e90 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
27ea0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
27eb0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
27ec0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
27ed0 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
27ee0 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
27ef0 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49  est DB DBNAME SI
27f00 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  ZE.**.** This TC
27f10 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
27f20 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
27f30 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
27f40 65 20 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  e .** with SQLIT
27f50 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
27f60 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  T.*/.static int 
27f70 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69  SQLITE_TCLAPI fi
27f80 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68  le_control_sizeh
27f90 69 6e 74 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  int_test(.  Clie
27fa0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
27fb0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
27fc0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
27fd0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
27fe0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
27ff0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
28000 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
28010 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
28020 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
28030 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
28040 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28050 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
28060 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
28070 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
28080 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
28090 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e  .){.  Tcl_WideIn
280a0 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20  t nSize;        
280b0 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 65 64 20        /* Hinted 
280c0 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  size */.  char *
280d0 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
280e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20            /* Db 
280f0 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  name ("main", "t
28100 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20  emp" etc.) */.  
28110 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28130 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
28140 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
28150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28160 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f          /* file_
28170 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e  control() return
28180 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
28190 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
281a0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
281b0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
281c0 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45   "DB DBNAME SIZE
281d0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
281e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
281f0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
28200 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
28210 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
28220 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c   &db) .   || Tcl
28230 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
28240 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
28250 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b  3], &nSize).  ){
28260 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  .   return TCL_E
28270 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
28280 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
28290 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
282a0 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a  zDb[0]=='\0' ) z
282b0 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63  Db = NULL;..  rc
282c0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
282d0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c  control(db, zDb,
282e0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49   SQLITE_FCNTL_SI
282f0 5a 45 5f 48 49 4e 54 2c 20 28 76 6f 69 64 20 2a  ZE_HINT, (void *
28300 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  )&nSize);.  if( 
28310 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  rc ){.    Tcl_Se
28320 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
28330 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45  (char *)sqlite3E
28340 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  rrName(rc), TCL_
28350 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
28360 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28370 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
28380 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
28390 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
283a0 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65  rol_lockproxy_te
283b0 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20  st DB PWD.**.** 
283c0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
283d0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
283e0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
283f0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
28400 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
28410 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
28420 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43  e SQLITE_GET_LOC
28430 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a  KPROXYFILE and.*
28440 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43  * SQLITE_SET_LOC
28450 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73  KPROXYFILE verbs
28460 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28470 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69  SQLITE_TCLAPI fi
28480 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70  le_control_lockp
28490 72 6f 78 79 5f 74 65 73 74 28 0a 20 20 43 6c 69  roxy_test(.  Cli
284a0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
284b0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
284c0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
284d0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
284e0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
284f0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
28500 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
28510 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
28520 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
28530 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
28540 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
28550 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
28560 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
28570 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
28580 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
28590 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
285a0 64 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a  db;.  .  if( obj
285b0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
285c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
285d0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
285e0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
285f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
28600 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
28610 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
28620 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 50  v[0], 0), " DB P
28630 57 44 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  WD", 0);.    ret
28640 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28650 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
28660 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
28670 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
28680 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
28690 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
286a0 52 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 20 21 64  R;.  }.  .#if !d
286b0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
286c0 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
286d0 4c 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65  LE).#  if define
286e0 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20  d(__APPLE__).#  
286f0 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
28700 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
28710 54 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23  TYLE 1.#  else.#
28720 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
28730 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
28740 5f 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69  _STYLE 0.#  endi
28750 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  f.#endif.#if SQL
28760 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
28770 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
28780 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
28790 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 73   {.    char *tes
287a0 74 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 72  tPath;.    int r
287b0 63 3b 0a 20 20 20 20 69 6e 74 20 6e 50 77 64 3b  c;.    int nPwd;
287c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
287d0 2a 7a 50 77 64 3b 0a 20 20 20 20 63 68 61 72 20  *zPwd;.    char 
287e0 70 72 6f 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a  proxyPath[400];.
287f0 20 20 20 20 0a 20 20 20 20 7a 50 77 64 20 3d 20      .    zPwd = 
28800 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
28810 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e  mObj(objv[2], &n
28820 50 77 64 29 3b 0a 20 20 20 20 69 66 28 20 73 69  Pwd);.    if( si
28830 7a 65 6f 66 28 70 72 6f 78 79 50 61 74 68 29 3c  zeof(proxyPath)<
28840 6e 50 77 64 2b 32 30 20 29 7b 0a 20 20 20 20 20  nPwd+20 ){.     
28850 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
28860 74 28 69 6e 74 65 72 70 2c 20 22 50 57 44 20 74  t(interp, "PWD t
28870 6f 6f 20 62 69 67 22 2c 20 28 76 6f 69 64 2a 29  oo big", (void*)
28880 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
28890 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
288a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
288b0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 72  printf(sizeof(pr
288c0 6f 78 79 50 61 74 68 29 2c 20 70 72 6f 78 79 50  oxyPath), proxyP
288d0 61 74 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72  ath, "%s/test.pr
288e0 6f 78 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20  oxy", zPwd);.   
288f0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
28900 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
28910 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f  ULL, SQLITE_SET_
28920 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70  LOCKPROXYFILE, p
28930 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69  roxyPath);.    i
28940 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54  f( rc ){.      T
28950 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
28960 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
28970 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20  ntObj(rc)); .   
28980 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
28990 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
289a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
289b0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
289c0 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f  L, SQLITE_GET_LO
289d0 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65  CKPROXYFILE, &te
289e0 73 74 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  stPath);.    if(
289f0 20 73 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61   strncmp(proxyPa
28a00 74 68 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20  th,testPath,11) 
28a10 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
28a20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
28a30 2c 20 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69  , "Lock proxy fi
28a40 6c 65 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68  le did not match
28a50 20 74 68 65 20 22 0a 20 20 20 20 20 20 20 20 20   the ".         
28a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28a70 20 20 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c        "previousl
28a80 79 20 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65  y assigned value
28a90 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
28aa0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
28ab0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20     }.    if( rc 
28ac0 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
28ad0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
28ae0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
28af0 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rc));.      retu
28b00 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28b10 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
28b20 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
28b30 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
28b40 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59  TE_SET_LOCKPROXY
28b50 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29  FILE, proxyPath)
28b60 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
28b70 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
28b80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
28b90 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29  cl_NewIntObj(rc)
28ba0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
28bb0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
28bc0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
28bd0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d  turn TCL_OK;  .}
28be0 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
28bf0 57 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  WIN./*.** tclcmd
28c00 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
28c10 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 20  _win32_av_retry 
28c20 44 42 20 20 4e 52 45 54 52 59 20 20 44 45 4c 41  DB  NRETRY  DELA
28c30 59 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  Y.**.** This TCL
28c40 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
28c50 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
28c60 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
28c70 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c   with.** the SQL
28c80 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f  ITE_FCNTL_WIN32_
28c90 41 56 5f 52 45 54 52 59 20 6f 70 63 6f 64 65 2e  AV_RETRY opcode.
28ca0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
28cb0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c  QLITE_TCLAPI fil
28cc0 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
28cd0 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c 69 65  av_retry(.  Clie
28ce0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
28cf0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
28d00 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
28d10 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
28d20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
28d30 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
28d40 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
28d50 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
28d60 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
28d70 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
28d80 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28d90 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
28da0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
28db0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
28dc0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
28dd0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
28de0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
28df0 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61 72 20  nt a[2];.  char 
28e00 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  z[100];..  if( o
28e10 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
28e20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
28e30 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
28e40 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
28e50 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
28e60 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
28e70 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
28e80 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c 41 59   DB NRETRY DELAY
28e90 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
28ea0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28eb0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
28ec0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
28ed0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
28ee0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
28ef0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28f00 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
28f10 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
28f20 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
28f30 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e 20 54  a[0]) ) return T
28f40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
28f50 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
28f60 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
28f70 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65 74 75  ], &a[1]) ) retu
28f80 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28f90 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
28fa0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
28fb0 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  LL, SQLITE_FCNTL
28fc0 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 2c  _WIN32_AV_RETRY,
28fd0 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20 73 71   (void*)a);.  sq
28fe0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
28ff0 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
29000 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61 5b 30   %d %d", rc, a[0
29010 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[1]);.  Tcl_
29020 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
29030 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
29040 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
29050 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
29060 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
29070 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 67 65 74 5f  ntrol_win32_get_
29080 68 61 6e 64 6c 65 20 44 42 0a 2a 2a 0a 2a 2a 20  handle DB.**.** 
29090 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
290a0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
290b0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
290c0 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a  nterface with.**
290d0 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
290e0 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41 4e 44  L_WIN32_GET_HAND
290f0 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74  LE opcode..*/.st
29100 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
29110 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 67 65 74 5f  ntrol_win32_get_
29120 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e 74  handle(.  Client
29130 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
29140 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
29150 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
29160 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
29170 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
29180 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
29190 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
291a0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
291b0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
291c0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
291d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
291e0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
291f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
29200 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
29210 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
29220 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
29230 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 48 41 4e  .  int rc;.  HAN
29240 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55 4c 4c  DLE hFile = NULL
29250 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b  ;.  char z[100];
29260 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
29270 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
29280 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
29290 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
292a0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
292b0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
292c0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
292d0 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
292e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
292f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
29300 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
29310 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
29320 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
29330 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
29340 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29350 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
29360 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
29370 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46  , NULL, SQLITE_F
29380 43 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48  CNTL_WIN32_GET_H
29390 41 4e 44 4c 45 2c 0a 20 20 20 20 20 20 20 20 20  ANDLE,.         
293a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
293b0 20 20 20 28 76 6f 69 64 2a 29 26 68 46 69 6c 65     (void*)&hFile
293c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
293d0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c  rintf(sizeof(z),
293e0 20 7a 2c 20 22 25 64 20 25 70 22 2c 20 72 63 2c   z, "%d %p", rc,
293f0 20 28 76 6f 69 64 2a 29 68 46 69 6c 65 29 3b 0a   (void*)hFile);.
29400 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
29410 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63  lt(interp, z, (c
29420 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
29430 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
29440 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
29450 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
29460 73 65 74 5f 68 61 6e 64 6c 65 20 44 42 20 48 41  set_handle DB HA
29470 4e 44 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  NDLE.**.** This 
29480 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
29490 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
294a0 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
294b0 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ace with.** the 
294c0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
294d0 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 20 6f 70  32_SET_HANDLE op
294e0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
294f0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
29500 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77  I file_control_w
29510 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 28  in32_set_handle(
29520 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
29530 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
29540 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
29550 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
29560 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
29570 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
29580 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
29590 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
295a0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
295b0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
295c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
295d0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
295e0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
295f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
29600 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
29610 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
29620 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
29630 72 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69  rc;.  HANDLE hFi
29640 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63 68 61  le = NULL;.  cha
29650 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  r z[100];..  if(
29660 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
29670 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29680 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
29690 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
296a0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
296b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
296c0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
296d0 20 22 20 44 42 20 48 41 4e 44 4c 45 22 2c 20 30   " DB HANDLE", 0
296e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
296f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
29700 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
29710 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
29720 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
29730 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
29740 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29750 7d 0a 20 20 69 66 28 20 67 65 74 57 69 6e 33 32  }.  if( getWin32
29760 48 61 6e 64 6c 65 28 69 6e 74 65 72 70 2c 20 54  Handle(interp, T
29770 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
29780 76 5b 32 5d 29 2c 20 26 68 46 69 6c 65 29 20 29  v[2]), &hFile) )
29790 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
297a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
297b0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
297c0 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c  control(db, NULL
297d0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  , SQLITE_FCNTL_W
297e0 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 2c  IN32_SET_HANDLE,
297f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29800 20 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f               (vo
29810 69 64 2a 29 26 68 46 69 6c 65 29 3b 0a 20 20 73  id*)&hFile);.  s
29820 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
29830 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25  sizeof(z), z, "%
29840 64 20 25 70 22 2c 20 72 63 2c 20 28 76 6f 69 64  d %p", rc, (void
29850 2a 29 68 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f  *)hFile);.  Tcl_
29860 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
29870 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
29880 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
29890 4f 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 0a 0a  OK;  .}.#endif..
298a0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
298b0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
298c0 73 69 73 74 5f 77 61 6c 20 44 42 20 50 45 52 53  sist_wal DB PERS
298d0 49 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54  IST-FLAG.**.** T
298e0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
298f0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
29900 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
29910 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20  terface with.** 
29920 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  the SQLITE_FCNTL
29930 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 6f 70 63  _PERSIST_WAL opc
29940 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ode..*/.static i
29950 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
29960 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65   file_control_pe
29970 72 73 69 73 74 5f 77 61 6c 28 0a 20 20 43 6c 69  rsist_wal(.  Cli
29980 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
29990 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
299a0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
299b0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
299c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
299d0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
299e0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
299f0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
29a00 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
29a10 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
29a20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29a30 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
29a40 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
29a50 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
29a60 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
29a70 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
29a80 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
29a90 69 6e 74 20 62 50 65 72 73 69 73 74 3b 0a 20 20  int bPersist;.  
29aa0 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20  char z[100];..  
29ab0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
29ac0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
29ad0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
29ae0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
29af0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
29b00 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
29b10 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
29b20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20  0), " DB FLAG", 
29b30 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
29b40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
29b50 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
29b60 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
29b70 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
29b80 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
29b90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29ba0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
29bb0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
29bc0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 50 65  p, objv[2], &bPe
29bd0 72 73 69 73 74 29 20 29 20 72 65 74 75 72 6e 20  rsist) ) return 
29be0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
29bf0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
29c00 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
29c10 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 45   SQLITE_FCNTL_PE
29c20 52 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f 69 64  RSIST_WAL, (void
29c30 2a 29 26 62 50 65 72 73 69 73 74 29 3b 0a 20 20  *)&bPersist);.  
29c40 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
29c50 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
29c60 25 64 20 25 64 22 2c 20 72 63 2c 20 62 50 65 72  %d %d", rc, bPer
29c70 73 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41 70 70  sist);.  Tcl_App
29c80 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
29c90 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  , z, (char*)0);.
29ca0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
29cb0 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63    .}../*.** tclc
29cc0 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
29cd0 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65  ol_powersafe_ove
29ce0 72 77 72 69 74 65 20 44 42 20 50 53 4f 57 2d 46  rwrite DB PSOW-F
29cf0 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  LAG.**.** This T
29d00 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
29d10 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
29d20 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
29d30 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
29d40 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
29d50 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 20  RSAFE_OVERWRITE 
29d60 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  opcode..*/.stati
29d70 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
29d80 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  API file_control
29d90 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72 77  _powersafe_overw
29da0 72 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  rite(.  ClientDa
29db0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
29dc0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
29dd0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
29de0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
29df0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
29e00 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
29e10 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
29e20 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
29e30 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
29e40 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
29e50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
29e60 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
29e70 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
29e80 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
29e90 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
29ea0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
29eb0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
29ec0 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b  ;.  char z[100];
29ed0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
29ee0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
29ef0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
29f00 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
29f10 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
29f20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
29f30 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
29f40 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41  0], 0), " DB FLA
29f50 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  G", 0);.    retu
29f60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29f70 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
29f80 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
29f90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
29fa0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
29fb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29fc0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
29fd0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
29fe0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
29ff0 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &b) ) return TCL
2a000 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
2a010 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
2a020 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c 49  rol(db,NULL,SQLI
2a030 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53 41  TE_FCNTL_POWERSA
2a040 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 28 76 6f  FE_OVERWRITE,(vo
2a050 69 64 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69 74  id*)&b);.  sqlit
2a060 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2a070 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64  of(z), z, "%d %d
2a080 22 2c 20 72 63 2c 20 62 29 3b 0a 20 20 54 63 6c  ", rc, b);.  Tcl
2a090 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2a0a0 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29  terp, z, (char*)
2a0b0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
2a0c0 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  _OK;  .}.../*.**
2a0d0 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
2a0e0 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 20  control_vfsname 
2a0f0 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a  DB ?AUXDB?.**.**
2a100 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
2a110 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
2a120 74 68 65 20 73 74 61 63 6b 20 6f 66 20 56 46 53  the stack of VFS
2a130 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
2a140 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2a150 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
2a160 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  name(.  ClientDa
2a170 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2a180 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2a190 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
2a1a0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
2a1b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2a1c0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2a1d0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2a1e0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2a1f0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2a200 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2a210 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2a220 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2a230 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2a240 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2a250 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2a260 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2a270 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
2a280 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
2a290 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20   char *zVfsName 
2a2a0 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
2a2b0 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
2a2c0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2a2d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2a2e0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
2a2f0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
2a300 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
2a310 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
2a320 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58  ], 0), " DB ?AUX
2a330 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  DB?", 0);.    re
2a340 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2a350 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2a360 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2a370 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2a380 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
2a390 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2a3a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
2a3b0 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44  bjc==3 ){.    zD
2a3c0 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
2a3d0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
2a3e0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
2a3f0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
2a400 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46  DbName, SQLITE_F
2a410 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f  CNTL_VFSNAME,(vo
2a420 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a  id*)&zVfsName);.
2a430 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2a440 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e  lt(interp, zVfsN
2a450 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
2a460 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a470 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  VfsName);.  retu
2a480 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
2a490 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
2a4a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d  file_control_tem
2a4b0 70 66 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55  pfilename DB ?AU
2a4c0 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  XDB?.**.** Retur
2a4d0 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
2a4e0 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  is a temporary f
2a4f0 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69  ilename.*/.stati
2a500 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2a510 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  API file_control
2a520 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28 0a 20  _tempfilename(. 
2a530 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
2a540 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
2a550 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
2a560 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
2a570 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
2a580 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2a590 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2a5a0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2a5b0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2a5c0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
2a5d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a5e0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2a5f0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
2a600 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
2a610 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
2a620 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
2a630 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
2a640 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20  char *zDbName = 
2a650 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a  "main";.  char *
2a660 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  zTName = 0;..  i
2a670 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
2a680 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
2a690 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2a6a0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
2a6b0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
2a6c0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
2a6d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
2a6e0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
2a6f0 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b  DB ?AUXDB?", 0);
2a700 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2a710 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2a720 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2a730 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2a740 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
2a750 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
2a760 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2a770 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
2a780 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  .    zDbName = T
2a790 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2a7a0 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  v[2]);.  }.  sql
2a7b0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
2a7c0 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53  l(db, zDbName, S
2a7d0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50  QLITE_FCNTL_TEMP
2a7e0 46 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69 64 2a  FILENAME, (void*
2a7f0 29 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54 63 6c  )&zTName);.  Tcl
2a800 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2a810 74 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20 28 63  terp, zTName, (c
2a820 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74  har*)0);.  sqlit
2a830 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b  e3_free(zTName);
2a840 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2a850 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  ;  .}.../*.** tc
2a860 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f  lcmd:   sqlite3_
2a870 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20  vfs_list.**.**  
2a880 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69   Return a tcl li
2a890 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  st containing th
2a8a0 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72  e names of all r
2a8b0 65 67 69 73 74 65 72 65 64 20 76 66 73 27 73 2e  egistered vfs's.
2a8c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
2a8d0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73  QLITE_TCLAPI vfs
2a8e0 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _list(.  ClientD
2a8f0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2a900 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
2a910 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
2a920 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
2a930 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2a940 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2a950 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2a960 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2a970 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2a980 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2a990 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a9a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2a9b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2a9c0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2a9d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2a9e0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2a9f0 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  pVfs;.  Tcl_Obj 
2aa00 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  *pRet = Tcl_NewO
2aa10 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63  bj();.  if( objc
2aa20 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
2aa30 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2aa40 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
2aa50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2aa60 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
2aa70 72 28 70 56 66 73 3d 73 71 6c 69 74 65 33 5f 76  r(pVfs=sqlite3_v
2aa80 66 73 5f 66 69 6e 64 28 30 29 3b 20 70 56 66 73  fs_find(0); pVfs
2aa90 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e 65  ; pVfs=pVfs->pNe
2aaa0 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  xt){.    Tcl_Lis
2aab0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2aac0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2aad0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
2aae0 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d 31  (pVfs->zName, -1
2aaf0 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65  ));.  }.  Tcl_Se
2ab00 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2ab10 70 2c 20 70 52 65 74 29 3b 0a 20 20 72 65 74 75  p, pRet);.  retu
2ab20 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
2ab30 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
2ab40 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44 42  sqlite3_limit DB
2ab50 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20   ID VALUE.**.** 
2ab60 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
2ab70 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
2ab80 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66 61 63  3_limit interfac
2ab90 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65  e and.** verifie
2aba0 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74  s correct operat
2abb0 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e  ion of the same.
2abc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
2abd0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
2abe0 74 5f 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e  t_limit(.  Clien
2abf0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2ac00 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
2ac10 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
2ac20 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
2ac30 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2ac40 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2ac50 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2ac60 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2ac70 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2ac80 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2ac90 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2aca0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2acb0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2acc0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2acd0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2ace0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
2acf0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 74  ;.  int rc;.  st
2ad00 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2ad10 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
2ad20 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 69  Name;.     int i
2ad30 64 3b 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b  d;.  } aId[] = {
2ad40 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
2ad50 49 4d 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20  IMIT_LENGTH",   
2ad60 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
2ad70 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20  E_LIMIT_LENGTH  
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2ad90 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
2ada0 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c  MIT_SQL_LENGTH",
2adb0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2adc0 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
2add0 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  H           },. 
2ade0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
2adf0 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20  IT_COLUMN",     
2ae00 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2ae10 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20  LIMIT_COLUMN    
2ae20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2ae30 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
2ae40 54 5f 45 58 50 52 5f 44 45 50 54 48 22 2c 20 20  T_EXPR_DEPTH",  
2ae50 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2ae60 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20  IMIT_EXPR_DEPTH 
2ae70 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2ae80 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
2ae90 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
2aea0 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49  ",     SQLITE_LI
2aeb0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
2aec0 45 43 54 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ECT      },.    
2aed0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
2aee0 56 44 42 45 5f 4f 50 22 2c 20 20 20 20 20 20 20  VDBE_OP",       
2aef0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2af00 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20  IT_VDBE_OP      
2af10 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2af20 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46   "SQLITE_LIMIT_F
2af30 55 4e 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20  UNCTION_ARG",   
2af40 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2af50 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20  T_FUNCTION_ARG  
2af60 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2af70 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54  "SQLITE_LIMIT_AT
2af80 54 41 43 48 45 44 22 2c 20 20 20 20 20 20 20 20  TACHED",        
2af90 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2afa0 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20  _ATTACHED       
2afb0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
2afc0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
2afd0 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
2afe0 22 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ", SQLITE_LIMIT_
2aff0 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
2b000 47 54 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53  GTH  },.    { "S
2b010 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
2b020 41 42 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20  ABLE_NUMBER",   
2b030 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56    SQLITE_LIMIT_V
2b040 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20  ARIABLE_NUMBER  
2b050 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
2b060 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
2b070 45 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20 20  ER_DEPTH",      
2b080 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
2b090 49 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20  IGGER_DEPTH     
2b0a0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
2b0b0 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52  ITE_LIMIT_WORKER
2b0c0 5f 54 48 52 45 41 44 53 22 2c 20 20 20 20 20 20  _THREADS",      
2b0d0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
2b0e0 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20 20 20  KER_THREADS     
2b0f0 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a    },.    .    /*
2b100 20 4f 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65   Out of range te
2b110 73 74 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20  st cases */.    
2b120 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
2b130 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20  TOOSMALL",      
2b140 20 20 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20        -1,       
2b150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b160 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2b170 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54   "SQLITE_LIMIT_T
2b180 4f 4f 42 49 47 22 2c 20 20 20 20 20 20 20 20 20  OOBIG",         
2b190 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2b1a0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
2b1b0 2b 31 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20  +1     },.  };. 
2b1c0 20 69 6e 74 20 69 2c 20 69 64 20 3d 20 30 3b 0a   int i, id = 0;.
2b1d0 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63 6f 6e    int val;.  con
2b1e0 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 0a 20  st char *zId;.. 
2b1f0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
2b200 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2b210 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
2b220 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
2b230 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
2b240 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
2b250 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
2b260 20 30 29 2c 20 22 20 44 42 20 49 44 20 56 41 4c   0), " DB ID VAL
2b270 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  UE", 0);.    ret
2b280 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b290 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2b2a0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2b2b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2b2c0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
2b2d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b2e0 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74 53 74   zId = Tcl_GetSt
2b2f0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
2b300 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2b310 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61  of(aId)/sizeof(a
2b320 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20  Id[0]); i++){.  
2b330 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 49 64    if( strcmp(zId
2b340 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  , aId[i].zName)=
2b350 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 64 20 3d  =0 ){.      id =
2b360 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20 20 20   aId[i].id;.    
2b370 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2b380 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65   }.  if( i>=size
2b390 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61  of(aId)/sizeof(a
2b3a0 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63  Id[0]) ){.    Tc
2b3b0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2b3c0 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20  nterp, "unknown 
2b3d0 6c 69 6d 69 74 20 74 79 70 65 3a 20 22 2c 20 7a  limit type: ", z
2b3e0 49 64 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  Id, (char*)0);. 
2b3f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2b400 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
2b410 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
2b420 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
2b430 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
2b440 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
2b450 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74   = sqlite3_limit
2b460 28 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b 0a 20  (db, id, val);. 
2b470 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2b480 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2b490 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
2b4a0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
2b4b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
2b4c0 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61  :  save_prng_sta
2b4d0 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68  te.**.** Save th
2b4e0 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
2b4f0 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d  seudo-random num
2b500 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a  ber generator..*
2b510 2a 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69  * At the same ti
2b520 6d 65 2c 20 76 65 72 69 66 79 20 74 68 61 74 20  me, verify that 
2b530 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2b540 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65 6e 20  trol works even 
2b550 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20 77  when.** called w
2b560 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 72 61  ith an out-of-ra
2b570 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73  nge opcode..*/.s
2b580 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2b590 5f 54 43 4c 41 50 49 20 73 61 76 65 5f 70 72 6e  _TCLAPI save_prn
2b5a0 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e  g_state(.  Clien
2b5b0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2b5c0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
2b5d0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
2b5e0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
2b5f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2b600 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2b610 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2b620 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2b630 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2b640 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2b650 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b660 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2b670 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2b680 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2b690 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2b6a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
2b6b0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2b6c0 6f 6c 28 39 39 39 39 29 3b 0a 20 20 61 73 73 65  ol(9999);.  asse
2b6d0 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 72  rt( rc==0 );.  r
2b6e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  c = sqlite3_test
2b6f0 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20 20  _control(-1);.  
2b700 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b  assert( rc==0 );
2b710 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
2b720 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2b730 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56  ESTCTRL_PRNG_SAV
2b740 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  E);.  return TCL
2b750 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c  _OK;.}./*.** tcl
2b760 63 6d 64 3a 20 20 72 65 73 74 6f 72 65 5f 70 72  cmd:  restore_pr
2b770 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61 74  ng_state.*/.stat
2b780 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2b790 4c 41 50 49 20 72 65 73 74 6f 72 65 5f 70 72 6e  LAPI restore_prn
2b7a0 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e  g_state(.  Clien
2b7b0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2b7c0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
2b7d0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
2b7e0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
2b7f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2b800 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2b810 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2b820 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2b830 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2b840 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2b850 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b860 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2b870 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2b880 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2b890 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2b8a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73  ){.  sqlite3_tes
2b8b0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
2b8c0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
2b8d0 45 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72  ESTORE);.  retur
2b8e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
2b8f0 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74  * tclcmd:  reset
2b900 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73  _prng_state.*/.s
2b910 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2b920 5f 54 43 4c 41 50 49 20 72 65 73 65 74 5f 70 72  _TCLAPI reset_pr
2b930 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
2b940 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2b950 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
2b960 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
2b970 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
2b980 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2b990 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2b9a0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2b9b0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2b9c0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2b9d0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2b9e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2b9f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2ba00 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2ba10 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2ba20 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2ba30 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65  .){.  sqlite3_te
2ba40 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2ba50 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
2ba60 52 45 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e  RESET);.  return
2ba70 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2ba80 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61 74 61 62  * tclcmd:  datab
2ba90 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75  ase_may_be_corru
2baa0 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61 74  pt.**.** Indicat
2bab0 65 20 74 68 61 74 20 64 61 74 61 62 61 73 65 20  e that database 
2bac0 66 69 6c 65 73 20 6d 69 67 68 74 20 62 65 20 63  files might be c
2bad0 6f 72 72 75 70 74 2e 20 49 6e 20 6f 74 68 65 72  orrupt. In other
2bae0 20 77 6f 72 64 73 2c 20 73 65 74 20 74 68 65 20   words, set the 
2baf0 6e 6f 72 6d 61 6c 0a 2a 2a 20 73 74 61 74 65 20  normal.** state 
2bb00 6f 66 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f  of operation..*/
2bb10 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
2bb20 54 45 5f 54 43 4c 41 50 49 20 64 61 74 61 62 61  TE_TCLAPI databa
2bb30 73 65 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70  se_may_be_corrup
2bb40 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
2bb50 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
2bb60 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
2bb70 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
2bb80 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
2bb90 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2bba0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2bbb0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2bbc0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2bbd0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2bbe0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2bbf0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2bc00 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2bc10 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2bc20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2bc30 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
2bc40 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2bc50 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2bc60 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
2bc70 54 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  T, 0);.  return 
2bc80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
2bc90 74 63 6c 63 6d 64 3a 20 20 64 61 74 61 62 61 73  tclcmd:  databas
2bca0 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 0a  e_never_corrupt.
2bcb0 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74  **.** Indicate t
2bcc0 68 61 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  hat database fil
2bcd0 65 73 20 61 72 65 20 61 6c 77 61 79 73 20 77 65  es are always we
2bce0 6c 6c 2d 66 6f 72 6d 65 64 2e 20 54 68 69 73 20  ll-formed. This 
2bcf0 65 6e 61 62 6c 65 73 0a 2a 2a 20 65 78 74 72 61  enables.** extra
2bd00 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
2bd10 65 6e 74 73 20 74 68 61 74 20 74 65 73 74 20 63  ents that test c
2bd20 6f 6e 64 69 74 69 6f 6e 73 20 74 68 61 74 20 61  onditions that a
2bd30 72 65 20 61 6c 77 61 79 73 20 74 72 75 65 0a 2a  re always true.*
2bd40 2a 20 66 6f 72 20 77 65 6c 6c 2d 66 6f 72 6d 65  * for well-forme
2bd50 64 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2f 0a  d databases..*/.
2bd60 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2bd70 45 5f 54 43 4c 41 50 49 20 64 61 74 61 62 61 73  E_TCLAPI databas
2bd80 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 28  e_never_corrupt(
2bd90 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
2bda0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
2bdb0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
2bdc0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
2bdd0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
2bde0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
2bdf0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
2be00 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
2be10 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
2be20 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
2be30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2be40 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
2be50 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
2be60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
2be70 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
2be80 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
2be90 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2bea0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2beb0 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
2bec0 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   1);.  return TC
2bed0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
2bee0 63 6c 63 6d 64 3a 20 20 70 63 61 63 68 65 5f 73  clcmd:  pcache_s
2bef0 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tats.*/.static i
2bf00 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2bf10 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61   test_pcache_sta
2bf20 74 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ts(.  ClientData
2bf30 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2bf40 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
2bf50 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
2bf60 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
2bf70 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2bf80 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2bf90 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2bfa0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2bfb0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2bfc0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2bfd0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2bfe0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2bff0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2c000 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2c010 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2c020 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e 74 20  int nMin;.  int 
2c030 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43 75 72  nMax;.  int nCur
2c040 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52 65 63  rent;.  int nRec
2c050 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c 5f 4f  yclable;.  Tcl_O
2c060 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73 71 6c  bj *pRet;..  sql
2c070 69 74 65 33 50 63 61 63 68 65 53 74 61 74 73 28  ite3PcacheStats(
2c080 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d 61 78  &nCurrent, &nMax
2c090 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63 79 63  , &nMin, &nRecyc
2c0a0 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65 74 20  lable);..  pRet 
2c0b0 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
2c0c0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2c0d0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2c0e0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
2c0f0 53 74 72 69 6e 67 4f 62 6a 28 22 63 75 72 72 65  StringObj("curre
2c100 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  nt", -1));.  Tcl
2c110 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2c120 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
2c130 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
2c140 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a 20 20  j(nCurrent));.  
2c150 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2c160 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2c170 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
2c180 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c 20 2d  ringObj("max", -
2c190 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
2c1a0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2c1b0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
2c1c0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 61 78  l_NewIntObj(nMax
2c1d0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
2c1e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
2c1f0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
2c200 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
2c210 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  in", -1));.  Tcl
2c220 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2c230 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
2c240 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
2c250 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63 6c 5f  j(nMin));.  Tcl_
2c260 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c270 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
2c280 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
2c290 4f 62 6a 28 22 72 65 63 79 63 6c 61 62 6c 65 22  Obj("recyclable"
2c2a0 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
2c2b0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2c2c0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
2c2d0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
2c2e0 52 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a 0a 20  Recyclable));.. 
2c2f0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2c300 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
2c310 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
2c320 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  K;.}..#ifdef SQL
2c330 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
2c340 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20  K_NOTIFY.static 
2c350 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  void test_unlock
2c360 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69 64 20  _notify_cb(void 
2c370 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41 72 67  **aArg, int nArg
2c380 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20 20 66  ){.  int ii;.  f
2c390 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41 72 67  or(ii=0; ii<nArg
2c3a0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ; ii++){.    Tcl
2c3b0 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f 49 6e 74  _EvalEx((Tcl_Int
2c3c0 65 72 70 20 2a 29 61 41 72 67 5b 69 69 5d 2c 20  erp *)aArg[ii], 
2c3d0 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c  "unlock_notify",
2c3e0 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c   -1, TCL_EVAL_GL
2c3f0 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e  OBAL);.  }.}.#en
2c400 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e  dif /* SQLITE_EN
2c410 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
2c420 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  FY */../*.** tcl
2c430 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 6e  cmd:  sqlite3_un
2c440 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62 0a 2a  lock_notify db.*
2c450 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2c460 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
2c470 54 49 46 59 0a 73 74 61 74 69 63 20 69 6e 74 20  TIFY.static int 
2c480 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2c490 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  st_unlock_notify
2c4a0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2c4b0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
2c4c0 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
2c4d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2c4e0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2c4f0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2c500 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2c510 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
2c520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2c530 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2c540 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
2c550 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
2c560 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2c570 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
2c580 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
2c590 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
2c5a0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2c5b0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2c5c0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2c5d0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2c5e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2c5f0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2c600 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2c610 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2c620 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
2c630 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2c640 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
2c650 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
2c660 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b  (db, test_unlock
2c670 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76 6f 69  _notify_cb, (voi
2c680 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20 20 54  d *)interp);.  T
2c690 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
2c6a0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
2c6b0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
2c6c0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
2c6d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2c6e0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ndif../*.** tclc
2c6f0 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  md:  sqlite3_wal
2c700 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 3f  _checkpoint db ?
2c710 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  NAME?.*/.static 
2c720 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2c730 49 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b  I test_wal_check
2c740 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44  point(.  ClientD
2c750 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2c760 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
2c770 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2c780 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2c790 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2c7a0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2c7b0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2c7c0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2c7d0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c7e0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2c7f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2c800 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2c810 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2c820 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30  .  char *zDb = 0
2c830 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
2c840 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
2c850 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
2c860 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2c870 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2c880 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
2c890 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20 20 20  B ?NAME?");.    
2c8a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2c8b0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
2c8c0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2c8d0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2c8e0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
2c8f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
2c900 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2c910 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
2c920 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
2c930 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
2c940 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
2c950 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
2c960 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 54 63 6c  (db, zDb);.  Tcl
2c970 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
2c980 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
2c990 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
2c9a0 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
2c9b0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2c9c0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
2c9d0 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
2c9e0 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45 20 3f 4e  nt_v2 db MODE ?N
2c9f0 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  AME?.**.** This 
2ca00 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73 20 74 68  command calls th
2ca10 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  e wal_checkpoint
2ca20 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e 20 77  _v2() function w
2ca30 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65  ith the specifie
2ca40 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67 75 6d 65  d.** mode argume
2ca50 6e 74 20 28 70 61 73 73 69 76 65 2c 20 66 75 6c  nt (passive, ful
2ca60 6c 20 6f 72 20 72 65 73 74 61 72 74 29 2e 20 49  l or restart). I
2ca70 66 20 70 72 65 73 65 6e 74 2c 20 74 68 65 20 64  f present, the d
2ca80 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20  atabase name.** 
2ca90 4e 41 4d 45 20 69 73 20 70 61 73 73 65 64 20 61  NAME is passed a
2caa0 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
2cab0 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f 63 68 65  ument to wal_che
2cac0 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e 20 49 66  ckpoint_v2(). If
2cad0 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41 4d 45 20   it the.** NAME 
2cae0 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20  argument is not 
2caf0 70 72 65 73 65 6e 74 2c 20 61 20 4e 55 4c 4c 20  present, a NULL 
2cb00 70 6f 69 6e 74 65 72 20 69 73 20 70 61 73 73 65  pointer is passe
2cb10 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a  d instead..**.**
2cb20 20 49 66 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69   If wal_checkpoi
2cb30 6e 74 5f 76 32 28 29 20 72 65 74 75 72 6e 73 20  nt_v2() returns 
2cb40 61 6e 79 20 76 61 6c 75 65 20 6f 74 68 65 72 20  any value other 
2cb50 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  than SQLITE_BUSY
2cb60 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b   or.** SQLITE_OK
2cb70 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f 6d 6d  , then this comm
2cb80 61 6e 64 20 72 65 74 75 72 6e 73 20 54 43 4c 5f  and returns TCL_
2cb90 45 52 52 4f 52 2e 20 54 68 65 20 54 63 6c 20 72  ERROR. The Tcl r
2cba0 65 73 75 6c 74 20 69 73 20 73 65 74 0a 2a 2a 20  esult is set.** 
2cbb0 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  to the error mes
2cbc0 73 61 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72  sage obtained fr
2cbd0 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  om sqlite3_errms
2cbe0 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  g()..**.** Other
2cbf0 77 69 73 65 2c 20 74 68 69 73 20 63 6f 6d 6d 61  wise, this comma
2cc00 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6c 69 73  nd returns a lis
2cc10 74 20 6f 66 20 74 68 72 65 65 20 69 6e 74 65 67  t of three integ
2cc20 65 72 73 2e 20 54 68 65 20 66 69 72 73 74 20 69  ers. The first i
2cc30 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 31 20 69  nteger.** is 1 i
2cc40 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77 61  f SQLITE_BUSY wa
2cc50 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 30  s returned, or 0
2cc60 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68 65 20   otherwise. The 
2cc70 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 69 6e  following two in
2cc80 74 65 67 65 72 73 0a 2a 2a 20 61 72 65 20 74 68  tegers.** are th
2cc90 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  e values returne
2cca0 64 20 76 69 61 20 74 68 65 20 6f 75 74 70 75 74  d via the output
2ccb0 20 70 61 72 61 6d 65 74 65 72 73 20 62 79 20 77   parameters by w
2ccc0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
2ccd0 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  () -.** the numb
2cce0 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20  er of frames in 
2ccf0 74 68 65 20 6c 6f 67 20 61 6e 64 20 74 68 65 20  the log and the 
2cd00 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
2cd10 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a 2a 20 74   in the log.** t
2cd20 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 63 68  hat have been ch
2cd30 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 73  eckpointed..*/.s
2cd40 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2cd50 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 77 61 6c  _TCLAPI test_wal
2cd60 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a  _checkpoint_v2(.
2cd70 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
2cd80 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
2cd90 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
2cda0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2cdb0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2cdc0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2cdd0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2cde0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
2cdf0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2ce00 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2ce10 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
2ce20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
2ce30 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2ce40 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
2ce50 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c   *zDb = 0;.  sql
2ce60 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
2ce70 72 63 3b 0a 0a 20 20 69 6e 74 20 65 4d 6f 64 65  rc;..  int eMode
2ce80 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67 20 3d 20 2d  ;.  int nLog = -
2ce90 35 35 35 3b 0a 20 20 69 6e 74 20 6e 43 6b 70 74  555;.  int nCkpt
2cea0 20 3d 20 2d 35 35 35 3b 0a 20 20 54 63 6c 5f 4f   = -555;.  Tcl_O
2ceb0 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e  bj *pRet;..  con
2cec0 73 74 20 63 68 61 72 20 2a 20 61 4d 6f 64 65 5b  st char * aMode[
2ced0 5d 20 3d 20 7b 20 22 70 61 73 73 69 76 65 22 2c  ] = { "passive",
2cee0 20 22 66 75 6c 6c 22 2c 20 22 72 65 73 74 61 72   "full", "restar
2cef0 74 22 2c 20 22 74 72 75 6e 63 61 74 65 22 2c 20  t", "truncate", 
2cf00 30 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 53  0 };.  assert( S
2cf10 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
2cf20 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20  _PASSIVE==0 );. 
2cf30 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
2cf40 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d  CHECKPOINT_FULL=
2cf50 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =1 );.  assert( 
2cf60 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
2cf70 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a  T_RESTART==2 );.
2cf80 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
2cf90 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52 55 4e  _CHECKPOINT_TRUN
2cfa0 43 41 54 45 3d 3d 33 20 29 3b 0a 0a 20 20 69 66  CATE==3 );..  if
2cfb0 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
2cfc0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
2cfd0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2cfe0 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
2cff0 42 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 22 29 3b  B MODE ?NAME?");
2d000 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2d010 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
2d020 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20 20 20  ( objc==4 ){.   
2d030 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
2d040 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
2d050 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2d060 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2d070 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2d080 5b 31 5d 29 2c 20 26 64 62 29 20 7c 7c 20 28 0a  [1]), &db) || (.
2d090 20 20 20 20 20 20 54 43 4c 5f 4f 4b 21 3d 54 63        TCL_OK!=Tc
2d0a0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2d0b0 30 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 65 4d 6f  0, objv[2], &eMo
2d0c0 64 65 29 0a 20 20 20 26 26 20 54 43 4c 5f 4f 4b  de).   && TCL_OK
2d0d0 21 3d 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  !=Tcl_GetIndexFr
2d0e0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2d0f0 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c 20 22 6d  jv[2], aMode, "m
2d100 6f 64 65 22 2c 20 30 2c 20 26 65 4d 6f 64 65 29  ode", 0, &eMode)
2d110 20 0a 20 20 29 29 7b 0a 20 20 20 20 72 65 74 75   .  )){.    retu
2d120 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d130 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
2d140 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
2d150 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 65 4d 6f  _v2(db, zDb, eMo
2d160 64 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e 43 6b 70  de, &nLog, &nCkp
2d170 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
2d180 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
2d190 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
2d1a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
2d1b0 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  rrCode = sqlite3
2d1c0 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20  ErrName(rc);.   
2d1d0 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
2d1e0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
2d1f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2d200 6e 74 65 72 70 2c 20 7a 45 72 72 43 6f 64 65 2c  nterp, zErrCode,
2d210 20 22 20 2d 20 22 2c 20 28 63 68 61 72 20 2a 29   " - ", (char *)
2d220 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
2d230 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
2d240 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d250 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  }..  pRet = Tcl_
2d260 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
2d270 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2d280 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
2d290 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
2d2a0 28 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59  (rc==SQLITE_BUSY
2d2b0 3f 31 3a 30 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  ?1:0));.  Tcl_Li
2d2c0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2d2d0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
2d2e0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e   Tcl_NewIntObj(n
2d2f0 4c 6f 67 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Log));.  Tcl_Lis
2d300 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2d310 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2d320 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43  Tcl_NewIntObj(nC
2d330 6b 70 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74  kpt));.  Tcl_Set
2d340 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2d350 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75  , pRet);..  retu
2d360 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2d370 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
2d380 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65  ite3_wal_autoche
2d390 63 6b 70 6f 69 6e 74 20 64 62 20 56 41 4c 55 45  ckpoint db VALUE
2d3a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
2d3b0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
2d3c0 74 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  t_wal_autocheckp
2d3d0 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  oint(.  ClientDa
2d3e0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2d3f0 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
2d400 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2d410 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2d420 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2d430 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2d440 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2d450 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2d460 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2d470 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2d480 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2d490 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2d4a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2d4b0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2d4c0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
2d4d0 56 61 6c 3b 0a 0a 0a 20 20 69 66 28 20 6f 62 6a  Val;...  if( obj
2d4e0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
2d4f0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2d500 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
2d510 42 20 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 72  B VALUE");.    r
2d520 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d530 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
2d540 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2d550 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2d560 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20  bjv[1]), &db) . 
2d570 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46    || Tcl_GetIntF
2d580 72 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32  romObj(0, objv[2
2d590 5d 2c 20 26 69 56 61 6c 29 0a 20 20 29 7b 0a 20  ], &iVal).  ){. 
2d5a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2d5b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ROR;.  }..  rc =
2d5c0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
2d5d0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
2d5e0 69 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 52 65 73  iVal);.  Tcl_Res
2d5f0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
2d600 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
2d610 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
2d620 73 74 20 63 68 61 72 20 2a 7a 45 72 72 43 6f 64  st char *zErrCod
2d630 65 20 3d 20 73 71 6c 69 74 65 33 45 72 72 4e 61  e = sqlite3ErrNa
2d640 6d 65 28 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  me(rc);.    Tcl_
2d650 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2d660 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
2d670 6e 67 4f 62 6a 28 7a 45 72 72 43 6f 64 65 2c 20  ngObj(zErrCode, 
2d680 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  -1));.    return
2d690 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2d6a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2d6b0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
2d6c0 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c 69 74 65  md:  test_sqlite
2d6d0 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f 0a 2a  3_log ?SCRIPT?.*
2d6e0 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63 74 20  /.static struct 
2d6f0 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a 20 20  LogCallback {.  
2d700 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49 6e 74  Tcl_Interp *pInt
2d710 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
2d720 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c 6c 62  pObj;.} logcallb
2d730 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a 73 74  ack = {0, 0};.st
2d740 61 74 69 63 20 76 6f 69 64 20 78 4c 6f 67 63 61  atic void xLogca
2d750 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75 6e 75  llback(void *unu
2d760 73 65 64 2c 20 69 6e 74 20 65 72 72 2c 20 63 68  sed, int err, ch
2d770 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54 63 6c  ar *zMsg){.  Tcl
2d780 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c  _Obj *pNew = Tcl
2d790 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 6c 6f  _DuplicateObj(lo
2d7a0 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b  gcallback.pObj);
2d7b0 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
2d7c0 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54 63 6c  unt(pNew);.  Tcl
2d7d0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2d7e0 65 6d 65 6e 74 28 0a 20 20 20 20 20 20 30 2c 20  ement(.      0, 
2d7f0 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72  pNew, Tcl_NewStr
2d800 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72  ingObj(sqlite3Er
2d810 72 4e 61 6d 65 28 65 72 72 29 2c 20 2d 31 29 0a  rName(err), -1).
2d820 20 20 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f    );.  Tcl_ListO
2d830 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2d840 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77  0, pNew, Tcl_New
2d850 53 74 72 69 6e 67 4f 62 6a 28 7a 4d 73 67 2c 20  StringObj(zMsg, 
2d860 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
2d870 4f 62 6a 45 78 28 6c 6f 67 63 61 6c 6c 62 61 63  ObjEx(logcallbac
2d880 6b 2e 70 49 6e 74 65 72 70 2c 20 70 4e 65 77 2c  k.pInterp, pNew,
2d890 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c   TCL_EVAL_GLOBAL
2d8a0 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54  |TCL_EVAL_DIRECT
2d8b0 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66  );.  Tcl_DecrRef
2d8c0 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 7d 0a 73  Count(pNew);.}.s
2d8d0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2d8e0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c  _TCLAPI test_sql
2d8f0 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c 69 65  ite3_log(.  Clie
2d900 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2d910 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2d920 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2d930 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2d940 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2d950 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2d960 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2d970 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2d980 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2d990 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2d9a0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2d9b0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2d9c0 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a   */.){.  if( obj
2d9d0 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  c>2 ){.    Tcl_W
2d9e0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2d9f0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 43  rp, 1, objv, "SC
2da00 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65 74 75  RIPT");.    retu
2da10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2da20 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c 6c 62  }.  if( logcallb
2da30 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20 20 20  ack.pObj ){.    
2da40 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
2da50 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
2da60 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
2da70 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a 20 20  ack.pObj = 0;.  
2da80 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49    logcallback.pI
2da90 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20 20 73  nterp = 0;.    s
2daa0 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
2dab0 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
2dac0 20 28 76 6f 69 64 2a 29 30 2c 20 28 76 6f 69 64   (void*)0, (void
2dad0 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  *)0);.  }.  if( 
2dae0 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 6c 6f  objc>1 ){.    lo
2daf0 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d  gcallback.pObj =
2db00 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 54 63   objv[1];.    Tc
2db10 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c  l_IncrRefCount(l
2db20 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29  ogcallback.pObj)
2db30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63  ;.    logcallbac
2db40 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e 74 65  k.pInterp = inte
2db50 72 70 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rp;.    sqlite3_
2db60 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f  config(SQLITE_CO
2db70 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61  NFIG_LOG, xLogca
2db80 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 30  llback, (void*)0
2db90 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2dba0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2dbb0 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72 6f 63       tcl_objproc
2dbc0 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41 52 47   COMMANDNAME ARG
2dbd0 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e 20 61  S....**.** Run a
2dbe0 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 73 69   TCL command usi
2dbf0 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f 63 20 69  ng its objProc i
2dc00 6e 74 65 72 66 61 63 65 2e 20 20 54 68 72 6f 77  nterface.  Throw
2dc10 20 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a 2a 20   an error if.** 
2dc20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61 73 20  the command has 
2dc30 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74 65 72  no objProc inter
2dc40 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  face..*/.static 
2dc50 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2dc60 49 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 28 0a  I runAsObjProc(.
2dc70 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
2dc80 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2dc90 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2dca0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2dcb0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2dcc0 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f 20  {.  Tcl_CmdInfo 
2dcd0 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28 20 6f  cmdInfo;.  if( o
2dce0 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc<2 ){.    Tcl
2dcf0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2dd00 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2dd10 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b 0a 20  COMMAND ...");. 
2dd20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2dd30 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ROR;.  }.  if( !
2dd40 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e  Tcl_GetCommandIn
2dd50 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  fo(interp, Tcl_G
2dd60 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2dd70 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a  ), &cmdInfo) ){.
2dd80 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2dd90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f  sult(interp, "co
2dda0 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a  mmand not found:
2ddb0 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54   ",.           T
2ddc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2ddd0 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29  v[1]), (char*)0)
2dde0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2ddf0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2de00 28 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f  ( cmdInfo.objPro
2de10 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c==0 ){.    Tcl_
2de20 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2de30 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 68 61  erp, "command ha
2de40 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20 22 2c  s no objProc: ",
2de50 0a 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f  .           Tcl_
2de60 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2de70 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  ]), (char*)0);. 
2de80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2de90 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
2dea0 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50 72 6f  n cmdInfo.objPro
2deb0 63 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69  c(cmdInfo.objCli
2dec0 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 70 2c  entData, interp,
2ded0 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b 31 29   objc-1, objv+1)
2dee0 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
2def0 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e  ITE_OMIT_EXPLAIN
2df00 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47 3a 20  ./*.** WARNING: 
2df10 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 75  The following fu
2df20 6e 63 74 69 6f 6e 2c 20 70 72 69 6e 74 45 78 70  nction, printExp
2df30 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29 20  lainQueryPlan() 
2df40 69 73 20 61 6e 20 65 78 61 63 74 0a 2a 2a 20 63  is an exact.** c
2df50 6f 70 79 20 6f 66 20 65 78 61 6d 70 6c 65 20 63  opy of example c
2df60 6f 64 65 20 66 72 6f 6d 20 65 71 70 2e 69 6e 20  ode from eqp.in 
2df70 28 65 71 70 2e 68 74 6d 6c 29 2e 20 49 66 20 74  (eqp.html). If t
2df80 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f 64 69  his code is modi
2df90 66 69 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  fied,.** then th
2dfa0 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20  e documentation 
2dfb0 63 6f 70 79 20 6e 65 65 64 73 20 74 6f 20 62 65  copy needs to be
2dfc0 20 6d 6f 64 69 66 69 65 64 20 61 73 20 77 65 6c   modified as wel
2dfd0 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72 67 75  l..*/./*.** Argu
2dfe0 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20 61 20  ment pStmt is a 
2dff0 70 72 65 70 61 72 65 64 20 53 51 4c 20 73 74 61  prepared SQL sta
2e000 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66 75 6e  tement. This fun
2e010 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73 0a 2a  ction compiles.*
2e020 2a 20 61 6e 20 45 58 50 4c 41 49 4e 20 51 55 45  * an EXPLAIN QUE
2e030 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20  RY PLAN command 
2e040 74 6f 20 72 65 70 6f 72 74 20 6f 6e 20 74 68 65  to report on the
2e050 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
2e060 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70 72 69 6e  ent,.** and prin
2e070 74 73 20 74 68 65 20 72 65 70 6f 72 74 20 74 6f  ts the report to
2e080 20 73 74 64 6f 75 74 20 75 73 69 6e 67 20 70 72   stdout using pr
2e090 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e 74 20 70  intf()..*/.int p
2e0a0 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79  rintExplainQuery
2e0b0 50 6c 61 6e 28 73 71 6c 69 74 65 33 5f 73 74 6d  Plan(sqlite3_stm
2e0c0 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 63 6f 6e  t *pStmt){.  con
2e0d0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20  st char *zSql;  
2e0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e0f0 49 6e 70 75 74 20 53 51 4c 20 2a 2f 0a 20 20 63  Input SQL */.  c
2e100 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 20 20  har *zExplain;  
2e110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2e120 2a 20 53 51 4c 20 77 69 74 68 20 45 58 50 4c 41  * SQL with EXPLA
2e130 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 70 72  IN QUERY PLAN pr
2e140 65 70 65 6e 64 65 64 20 2a 2f 0a 20 20 73 71 6c  epended */.  sql
2e150 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c  ite3_stmt *pExpl
2e160 61 69 6e 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ain;         /* 
2e170 43 6f 6d 70 69 6c 65 64 20 45 58 50 4c 41 49 4e  Compiled EXPLAIN
2e180 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
2e190 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  and */.  int rc;
2e1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e1b0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
2e1c0 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 71 6c  rn code from sql
2e1d0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2e1e0 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d 20 73  ) */..  zSql = s
2e1f0 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74  qlite3_sql(pStmt
2e200 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
2e210 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2e220 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 78 70 6c  _ERROR;..  zExpl
2e230 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ain = sqlite3_mp
2e240 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e 20 51  rintf("EXPLAIN Q
2e250 55 45 52 59 20 50 4c 41 4e 20 25 73 22 2c 20 7a  UERY PLAN %s", z
2e260 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 45 78 70  Sql);.  if( zExp
2e270 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  lain==0 ) return
2e280 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a   SQLITE_NOMEM;..
2e290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
2e2a0 72 65 70 61 72 65 5f 76 32 28 73 71 6c 69 74 65  repare_v2(sqlite
2e2b0 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
2e2c0 74 29 2c 20 7a 45 78 70 6c 61 69 6e 2c 20 2d 31  t), zExplain, -1
2e2d0 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  , &pExplain, 0);
2e2e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2e2f0 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 69 66 28  zExplain);.  if(
2e300 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
2e310 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 77   return rc;..  w
2e320 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
2e330 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2e340 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20  Explain) ){.    
2e350 69 6e 74 20 69 53 65 6c 65 63 74 69 64 20 3d 20  int iSelectid = 
2e360 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
2e370 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  nt(pExplain, 0);
2e380 0a 20 20 20 20 69 6e 74 20 69 4f 72 64 65 72 20  .    int iOrder 
2e390 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2e3a0 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 31  _int(pExplain, 1
2e3b0 29 3b 0a 20 20 20 20 69 6e 74 20 69 46 72 6f 6d  );.    int iFrom
2e3c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2e3d0 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20  n_int(pExplain, 
2e3e0 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  2);.    const ch
2e3f0 61 72 20 2a 7a 44 65 74 61 69 6c 20 3d 20 28 63  ar *zDetail = (c
2e400 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71 6c 69  onst char *)sqli
2e410 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
2e420 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 0a 20  pExplain, 3);.. 
2e430 20 20 20 70 72 69 6e 74 66 28 22 25 64 20 25 64     printf("%d %d
2e440 20 25 64 20 25 73 5c 6e 22 2c 20 69 53 65 6c 65   %d %s\n", iSele
2e450 63 74 69 64 2c 20 69 4f 72 64 65 72 2c 20 69 46  ctid, iOrder, iF
2e460 72 6f 6d 2c 20 7a 44 65 74 61 69 6c 29 3b 0a 20  rom, zDetail);. 
2e470 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
2e480 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
2e490 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73 74 61 74  xplain);.}..stat
2e4a0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2e4b0 4c 41 50 49 20 74 65 73 74 5f 70 72 69 6e 74 5f  LAPI test_print_
2e4c0 65 71 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  eqp(.  void * cl
2e4d0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2e4e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2e4f0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2e500 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2e510 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  v[].){.  int rc;
2e520 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2e530 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
2e540 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2e550 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2e560 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2e570 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
2e580 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2e590 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
2e5a0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2e5b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2e5c0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
2e5d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2e5e0 4f 52 3b 0a 20 20 72 63 20 3d 20 70 72 69 6e 74  OR;.  rc = print
2e5f0 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
2e600 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 54 68  (pStmt);.  /* Th
2e610 69 73 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  is is needed on 
2e620 57 69 6e 64 6f 77 73 20 73 6f 20 74 68 61 74 20  Windows so that 
2e630 61 20 74 65 73 74 20 63 61 73 65 20 75 73 69 6e  a test case usin
2e640 67 20 74 68 69 73 20 0a 20 20 2a 2a 20 66 75 6e  g this .  ** fun
2e650 63 74 69 6f 6e 20 63 61 6e 20 6f 70 65 6e 20 61  ction can open a
2e660 20 72 65 61 64 20 70 69 70 65 20 61 6e 64 20 67   read pipe and g
2e670 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 6f 66  et the output of
2e680 0a 20 20 2a 2a 20 70 72 69 6e 74 45 78 70 6c 61  .  ** printExpla
2e690 69 6e 51 75 65 72 79 50 6c 61 6e 28 29 20 69 6d  inQueryPlan() im
2e6a0 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a  mediately..  */.
2e6b0 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29    fflush(stdout)
2e6c0 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
2e6d0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
2e6e0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
2e6f0 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
2e700 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
2e710 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2e720 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a  EXPLAIN */../*.*
2e730 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
2e740 6f 6e 74 72 6f 6c 20 56 45 52 42 20 41 52 47 53  ontrol VERB ARGS
2e750 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ....*/.static in
2e760 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2e770 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  test_test_contro
2e780 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  l(.  void * clie
2e790 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2e7a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2e7b0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2e7c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2e7d0 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 56 65  ].){.  struct Ve
2e7e0 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  rb {.    const c
2e7f0 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20  har *zName;.    
2e800 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65 72 62  int i;.  } aVerb
2e810 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
2e820 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
2e830 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22 2c 20  CALTIME_FAULT", 
2e840 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
2e850 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
2e860 4c 54 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51  LT }, .    { "SQ
2e870 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f  LITE_TESTCTRL_SO
2e880 52 54 45 52 5f 4d 4d 41 50 22 2c 20 20 20 20 20  RTER_MMAP",     
2e890 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
2e8a0 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 20 20  RL_SORTER_MMAP  
2e8b0 20 20 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51     }, .    { "SQ
2e8c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
2e8d0 50 4f 53 54 45 52 22 2c 20 20 20 20 20 20 20 20  POSTER",        
2e8e0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
2e8f0 52 4c 5f 49 4d 50 4f 53 54 45 52 20 20 20 20 20  RL_IMPOSTER     
2e900 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
2e910 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4e 54  ITE_TESTCTRL_INT
2e920 45 52 4e 41 4c 5f 46 55 4e 43 54 49 4f 4e 53 22  ERNAL_FUNCTIONS"
2e930 2c 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  , SQLITE_TESTCTR
2e940 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54  L_INTERNAL_FUNCT
2e950 49 4f 4e 53 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  IONS},.  };.  in
2e960 74 20 69 56 65 72 62 3b 0a 20 20 69 6e 74 20 69  t iVerb;.  int i
2e970 46 6c 61 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Flag;.  int rc;.
2e980 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b  .  if( objc<2 ){
2e990 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2e9a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2e9b0 20 6f 62 6a 76 2c 20 22 56 45 52 42 20 41 52 47   objv, "VERB ARG
2e9c0 53 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75  S...");.    retu
2e9d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2e9e0 7d 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 65  }..  rc = Tcl_Ge
2e9f0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
2ea00 75 63 74 28 0a 20 20 20 20 20 20 69 6e 74 65 72  uct(.      inter
2ea10 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72  p, objv[1], aVer
2ea20 62 2c 20 73 69 7a 65 6f 66 28 61 56 65 72 62 5b  b, sizeof(aVerb[
2ea30 30 5d 29 2c 20 22 56 45 52 42 22 2c 20 30 2c 20  0]), "VERB", 0, 
2ea40 26 69 56 65 72 62 0a 20 20 29 3b 0a 20 20 69 66  &iVerb.  );.  if
2ea50 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72  ( rc!=TCL_OK ) r
2ea60 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c  eturn rc;..  iFl
2ea70 61 67 20 3d 20 61 56 65 72 62 5b 69 56 65 72 62  ag = aVerb[iVerb
2ea80 5d 2e 69 3b 0a 20 20 73 77 69 74 63 68 28 20 69  ].i;.  switch( i
2ea90 46 6c 61 67 20 29 7b 0a 20 20 20 20 63 61 73 65  Flag ){.    case
2eaa0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2eab0 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54 49  _INTERNAL_FUNCTI
2eac0 4f 4e 53 3a 0a 20 20 20 20 63 61 73 65 20 53 51  ONS:.    case SQ
2ead0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
2eae0 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b  CALTIME_FAULT: {
2eaf0 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a  .      int val;.
2eb00 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d        if( objc!=
2eb10 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c  3 ){.        Tcl
2eb20 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2eb30 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22  terp, 2, objv, "
2eb40 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20 20  ONOFF");.       
2eb50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2eb60 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
2eb70 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
2eb80 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
2eb90 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
2eba0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2ebb0 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
2ebc0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2ebd0 28 69 46 6c 61 67 2c 20 76 61 6c 29 3b 0a 20 20  (iFlag, val);.  
2ebe0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2ebf0 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
2ec00 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
2ec10 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20  R_MMAP: {.      
2ec20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 73  int val;.      s
2ec30 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20  qlite3 *db;.    
2ec40 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
2ec50 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f  .        Tcl_Wro
2ec60 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2ec70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4c  , 2, objv, "DB L
2ec80 49 4d 49 54 22 29 3b 0a 20 20 20 20 20 20 20 20  IMIT");.        
2ec90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2eca0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2ecb0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2ecc0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2ecd0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
2ece0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2ecf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
2ed00 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
2ed10 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2ed20 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
2ed30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ed40 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
2ed50 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2ed60 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54  TE_TESTCTRL_SORT
2ed70 45 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 76 61 6c  ER_MMAP, db, val
2ed80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2ed90 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
2eda0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2edb0 49 4d 50 4f 53 54 45 52 3a 20 7b 0a 20 20 20 20  IMPOSTER: {.    
2edc0 20 20 69 6e 74 20 6f 6e 4f 66 66 2c 20 74 6e 75    int onOff, tnu
2edd0 6d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  m;.      const c
2ede0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20  har *zDbName;.  
2edf0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b      sqlite3 *db;
2ee00 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
2ee10 3d 36 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =6 ){.        Tc
2ee20 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2ee30 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
2ee40 22 44 42 20 64 62 4e 61 6d 65 20 6f 6e 4f 66 66  "DB dbName onOff
2ee50 20 74 6e 75 6d 22 29 3b 0a 20 20 20 20 20 20 20   tnum");.       
2ee60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2ee70 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
2ee80 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2ee90 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2eea0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
2eeb0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
2eec0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2eed0 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
2eee0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
2eef0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  );.      if( Tcl
2ef00 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
2ef10 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
2ef20 26 6f 6e 4f 66 66 29 20 29 20 72 65 74 75 72 6e  &onOff) ) return
2ef30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2ef40 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2ef50 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2ef60 6f 62 6a 76 5b 35 5d 2c 20 26 74 6e 75 6d 29 20  objv[5], &tnum) 
2ef70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2ef80 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  OR;.      sqlite
2ef90 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2efa0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
2efb0 4d 50 4f 53 54 45 52 2c 20 64 62 2c 20 7a 44 62  MPOSTER, db, zDb
2efc0 4e 61 6d 65 2c 20 6f 6e 4f 66 66 2c 20 74 6e 75  Name, onOff, tnu
2efd0 6d 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  m);.      break;
2efe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63  .    }.  }..  Tc
2eff0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
2f000 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
2f010 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53  TCL_OK;.}..#if S
2f020 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 23 69  QLITE_OS_UNIX.#i
2f030 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65  nclude <sys/time
2f040 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  .h>.#include <sy
2f050 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 73  s/resource.h>..s
2f060 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2f070 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 67 65 74  _TCLAPI test_get
2f080 72 75 73 61 67 65 28 0a 20 20 76 6f 69 64 20 2a  rusage(.  void *
2f090 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2f0a0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2f0b0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2f0c0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2f0d0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72  objv[].){.  char
2f0e0 20 62 75 66 5b 31 30 32 34 5d 3b 0a 20 20 73 74   buf[1024];.  st
2f0f0 72 75 63 74 20 72 75 73 61 67 65 20 72 3b 0a 20  ruct rusage r;. 
2f100 20 6d 65 6d 73 65 74 28 26 72 2c 20 30 2c 20 73   memset(&r, 0, s
2f110 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20 67 65 74  izeof(r));.  get
2f120 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45  rusage(RUSAGE_SE
2f130 4c 46 2c 20 26 72 29 3b 0a 0a 20 20 73 71 6c 69  LF, &r);..  sqli
2f140 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2f150 65 6f 66 28 62 75 66 29 2c 20 62 75 66 2c 0a 20  eof(buf), buf,. 
2f160 20 20 20 22 72 75 5f 75 74 69 6d 65 3d 25 64 2e     "ru_utime=%d.
2f170 25 30 36 64 20 72 75 5f 73 74 69 6d 65 3d 25 64  %06d ru_stime=%d
2f180 2e 25 30 36 64 20 72 75 5f 6d 69 6e 66 6c 74 3d  .%06d ru_minflt=
2f190 25 64 20 72 75 5f 6d 61 6a 66 6c 74 3d 25 64 22  %d ru_majflt=%d"
2f1a0 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75  , .    (int)r.ru
2f1b0 5f 75 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28  _utime.tv_sec, (
2f1c0 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74  int)r.ru_utime.t
2f1d0 76 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e  v_usec, .    (in
2f1e0 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f  t)r.ru_stime.tv_
2f1f0 73 65 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 73  sec, (int)r.ru_s
2f200 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20  time.tv_usec, . 
2f210 20 20 20 28 69 6e 74 29 72 2e 72 75 5f 6d 69 6e     (int)r.ru_min
2f220 66 6c 74 2c 20 28 69 6e 74 29 72 2e 72 75 5f 6d  flt, (int)r.ru_m
2f230 61 6a 66 6c 74 0a 20 20 29 3b 0a 20 20 54 63 6c  ajflt.  );.  Tcl
2f240 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2f250 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
2f260 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d 31 29 29  ingObj(buf, -1))
2f270 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2f280 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
2f290 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
2f2a0 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e  *.** Information
2f2b0 20 70 61 73 73 65 64 20 66 72 6f 6d 20 74 68 65   passed from the
2f2c0 20 6d 61 69 6e 20 74 68 72 65 61 64 20 69 6e 74   main thread int
2f2d0 6f 20 74 68 65 20 77 69 6e 64 6f 77 73 20 66 69  o the windows fi
2f2e0 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20 62 61 63  le locker.** bac
2f2f0 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 2e 0a  kground thread..
2f300 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e 33 32 46  */.struct win32F
2f310 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20 20 63 68  ileLocker {.  ch
2f320 61 72 20 2a 65 76 4e 61 6d 65 3b 20 20 20 20 20  ar *evName;     
2f330 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 65 76 65    /* Name of eve
2f340 6e 74 20 74 6f 20 73 69 67 6e 61 6c 20 74 68 72  nt to signal thr
2f350 65 61 64 20 73 74 61 72 74 75 70 20 2a 2f 0a 20  ead startup */. 
2f360 20 48 41 4e 44 4c 45 20 68 3b 20 20 20 20 20 20   HANDLE h;      
2f370 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 6f       /* Handle o
2f380 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65  f the file to be
2f390 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20 69 6e 74   locked */.  int
2f3a0 20 64 65 6c 61 79 31 3b 20 20 20 20 20 20 20 20   delay1;        
2f3b0 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72 65   /* Delay before
2f3c0 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e   locking */.  in
2f3d0 74 20 64 65 6c 61 79 32 3b 20 20 20 20 20 20 20  t delay2;       
2f3e0 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66 6f 72    /* Delay befor
2f3f0 65 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  e unlocking */. 
2f400 20 69 6e 74 20 6f 6b 3b 20 20 20 20 20 20 20 20   int ok;        
2f410 20 20 20 20 20 2f 2a 20 46 69 6e 69 73 68 65 64       /* Finished
2f420 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72   ok */.  int err
2f430 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2f440 54 72 75 65 20 69 66 20 61 6e 20 65 72 72 6f 72  True if an error
2f450 20 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b 0a 23 65   occurs */.};.#e
2f460 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51 4c 49 54  ndif...#if SQLIT
2f470 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e 63 6c 75 64  E_OS_WIN.#includ
2f480 65 20 3c 70 72 6f 63 65 73 73 2e 68 3e 0a 2f 2a  e <process.h>./*
2f490 0a 2a 2a 20 54 68 65 20 62 61 63 6b 67 72 6f 75  .** The backgrou
2f4a0 6e 64 20 74 68 72 65 61 64 20 74 68 61 74 20 64  nd thread that d
2f4b0 6f 65 73 20 66 69 6c 65 20 6c 6f 63 6b 69 6e 67  oes file locking
2f4c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
2f4d0 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 77 69   SQLITE_CDECL wi
2f4e0 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65 72 28  n32_file_locker(
2f4f0 76 6f 69 64 20 2a 70 41 70 70 44 61 74 61 29 7b  void *pAppData){
2f500 0a 20 20 73 74 72 75 63 74 20 77 69 6e 33 32 46  .  struct win32F
2f510 69 6c 65 4c 6f 63 6b 65 72 20 2a 70 20 3d 20 28  ileLocker *p = (
2f520 73 74 72 75 63 74 20 77 69 6e 33 32 46 69 6c 65  struct win32File
2f530 4c 6f 63 6b 65 72 2a 29 70 41 70 70 44 61 74 61  Locker*)pAppData
2f540 3b 0a 20 20 69 66 28 20 70 2d 3e 65 76 4e 61 6d  ;.  if( p->evNam
2f550 65 20 29 7b 0a 20 20 20 20 48 41 4e 44 4c 45 20  e ){.    HANDLE 
2f560 65 76 20 3d 20 4f 70 65 6e 45 76 65 6e 74 28 45  ev = OpenEvent(E
2f570 56 45 4e 54 5f 4d 4f 44 49 46 59 5f 53 54 41 54  VENT_MODIFY_STAT
2f580 45 2c 20 46 41 4c 53 45 2c 20 70 2d 3e 65 76 4e  E, FALSE, p->evN
2f590 61 6d 65 29 3b 0a 20 20 20 20 69 66 20 28 20 65  ame);.    if ( e
2f5a0 76 20 29 7b 0a 20 20 20 20 20 20 53 65 74 45 76  v ){.      SetEv
2f5b0 65 6e 74 28 65 76 29 3b 0a 20 20 20 20 20 20 43  ent(ev);.      C
2f5c0 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a  loseHandle(ev);.
2f5d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
2f5e0 70 2d 3e 64 65 6c 61 79 31 20 29 20 53 6c 65 65  p->delay1 ) Slee
2f5f0 70 28 70 2d 3e 64 65 6c 61 79 31 29 3b 0a 20 20  p(p->delay1);.  
2f600 69 66 28 20 4c 6f 63 6b 46 69 6c 65 28 70 2d 3e  if( LockFile(p->
2f610 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30 30 30  h, 0, 0, 1000000
2f620 30 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 53 6c  00, 0) ){.    Sl
2f630 65 65 70 28 70 2d 3e 64 65 6c 61 79 32 29 3b 0a  eep(p->delay2);.
2f640 20 20 20 20 55 6e 6c 6f 63 6b 46 69 6c 65 28 70      UnlockFile(p
2f650 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30 30 30 30  ->h, 0, 0, 10000
2f660 30 30 30 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d  0000, 0);.    p-
2f670 3e 6f 6b 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  >ok = 1;.  }else
2f680 7b 0a 20 20 20 20 70 2d 3e 65 72 72 20 3d 20 31  {.    p->err = 1
2f690 3b 0a 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e  ;.  }.  CloseHan
2f6a0 64 6c 65 28 70 2d 3e 68 29 3b 0a 20 20 70 2d 3e  dle(p->h);.  p->
2f6b0 68 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c 61  h = 0;.  p->dela
2f6c0 79 31 20 3d 20 30 3b 0a 20 20 70 2d 3e 64 65 6c  y1 = 0;.  p->del
2f6d0 61 79 32 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ay2 = 0;.}.#endi
2f6e0 66 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  f..#if SQLITE_OS
2f6f0 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  _WIN./*.**      
2f700 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 20  lock_win32_file 
2f710 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20  FILENAME DELAY1 
2f720 44 45 4c 41 59 32 0a 2a 2a 0a 2a 2a 20 47 65 74  DELAY2.**.** Get
2f730 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 61   an exclusive ma
2f740 6e 64 69 74 6f 72 79 20 6c 6f 63 6b 20 6f 6e 20  nditory lock on 
2f750 66 69 6c 65 20 66 6f 72 20 44 45 4c 41 59 32 20  file for DELAY2 
2f760 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2e 0a 2a 2a  milliseconds..**
2f770 20 57 61 69 74 20 44 45 4c 41 59 31 20 6d 69 6c   Wait DELAY1 mil
2f780 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65  liseconds before
2f790 20 61 63 71 75 69 72 69 6e 67 20 74 68 65 20 6c   acquiring the l
2f7a0 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
2f7b0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2f7c0 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b   win32_file_lock
2f7d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2f7e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2f7f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2f800 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2f810 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2f820 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 73 74 72  .){.  static str
2f830 75 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63  uct win32FileLoc
2f840 6b 65 72 20 78 20 3d 20 7b 20 22 77 69 6e 33 32  ker x = { "win32
2f850 5f 66 69 6c 65 5f 6c 6f 63 6b 22 2c 20 30 2c 20  _file_lock", 0, 
2f860 30 2c 20 30 2c 20 30 2c 20 30 20 7d 3b 0a 20 20  0, 0, 0, 0 };.  
2f870 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2f880 65 6e 61 6d 65 3b 0a 20 20 63 68 61 72 20 7a 42  ename;.  char zB
2f890 75 66 5b 32 30 30 5d 3b 0a 20 20 69 6e 74 20 72  uf[200];.  int r
2f8a0 65 74 72 79 20 3d 20 30 3b 0a 20 20 48 41 4e 44  etry = 0;.  HAND
2f8b0 4c 45 20 65 76 3b 0a 20 20 44 57 4f 52 44 20 77  LE ev;.  DWORD w
2f8c0 52 65 73 75 6c 74 3b 0a 20 20 0a 20 20 69 66 28  Result;.  .  if(
2f8d0 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63   objc!=4 && objc
2f8e0 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
2f8f0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2f900 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49  rp, 1, objv, "FI
2f910 4c 45 4e 41 4d 45 20 44 45 4c 41 59 31 20 44 45  LENAME DELAY1 DE
2f920 4c 41 59 32 22 29 3b 0a 20 20 20 20 72 65 74 75  LAY2");.    retu
2f930 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2f940 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 31 20  }.  if( objc==1 
2f950 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ){.    sqlite3_s
2f960 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2f970 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 20  Buf), zBuf, "%d 
2f980 25 64 20 25 64 20 25 64 20 25 64 22 2c 0a 20 20  %d %d %d %d",.  
2f990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f9a0 20 20 20 78 2e 6f 6b 2c 20 78 2e 65 72 72 2c 20     x.ok, x.err, 
2f9b0 78 2e 64 65 6c 61 79 31 2c 20 78 2e 64 65 6c 61  x.delay1, x.dela
2f9c0 79 32 2c 20 78 2e 68 29 3b 0a 20 20 20 20 54 63  y2, x.h);.    Tc
2f9d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2f9e0 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 28 63 68  nterp, zBuf, (ch
2f9f0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2fa00 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20  rn TCL_OK;.  }. 
2fa10 20 77 68 69 6c 65 28 20 78 2e 68 20 26 26 20 72   while( x.h && r
2fa20 65 74 72 79 3c 33 30 20 29 7b 0a 20 20 20 20 72  etry<30 ){.    r
2fa30 65 74 72 79 2b 2b 3b 0a 20 20 20 20 53 6c 65 65  etry++;.    Slee
2fa40 70 28 31 30 30 29 3b 0a 20 20 7d 0a 20 20 69 66  p(100);.  }.  if
2fa50 28 20 78 2e 68 20 29 7b 0a 20 20 20 20 54 63 6c  ( x.h ){.    Tcl
2fa60 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2fa70 74 65 72 70 2c 20 22 62 75 73 79 22 2c 20 28 63  terp, "busy", (c
2fa80 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
2fa90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2faa0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
2fab0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2fac0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 78 2e 64  p, objv[2], &x.d
2fad0 65 6c 61 79 31 29 20 29 20 72 65 74 75 72 6e 20  elay1) ) return 
2fae0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
2faf0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
2fb00 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2fb10 33 5d 2c 20 26 78 2e 64 65 6c 61 79 32 29 20 29  3], &x.delay2) )
2fb20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2fb30 52 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  R;.  zFilename =
2fb40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2fb50 62 6a 76 5b 31 5d 29 3b 0a 20 20 78 2e 68 20 3d  bjv[1]);.  x.h =
2fb60 20 43 72 65 61 74 65 46 69 6c 65 28 7a 46 69 6c   CreateFile(zFil
2fb70 65 6e 61 6d 65 2c 20 47 45 4e 45 52 49 43 5f 52  ename, GENERIC_R
2fb80 45 41 44 7c 47 45 4e 45 52 49 43 5f 57 52 49 54  EAD|GENERIC_WRIT
2fb90 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
2fba0 20 46 49 4c 45 5f 53 48 41 52 45 5f 52 45 41 44   FILE_SHARE_READ
2fbb0 7c 46 49 4c 45 5f 53 48 41 52 45 5f 57 52 49 54  |FILE_SHARE_WRIT
2fbc0 45 2c 20 30 2c 20 4f 50 45 4e 5f 41 4c 57 41 59  E, 0, OPEN_ALWAY
2fbd0 53 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  S,.             
2fbe0 20 46 49 4c 45 5f 41 54 54 52 49 42 55 54 45 5f   FILE_ATTRIBUTE_
2fbf0 4e 4f 52 4d 41 4c 2c 20 30 29 3b 0a 20 20 69 66  NORMAL, 0);.  if
2fc00 28 20 21 78 2e 68 20 29 7b 0a 20 20 20 20 54 63  ( !x.h ){.    Tc
2fc10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2fc20 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74 20 6f  nterp, "cannot o
2fc30 70 65 6e 20 66 69 6c 65 3a 20 22 2c 20 7a 46 69  pen file: ", zFi
2fc40 6c 65 6e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  lename, (char*)0
2fc50 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2fc60 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 65  L_ERROR;.  }.  e
2fc70 76 20 3d 20 43 72 65 61 74 65 45 76 65 6e 74 28  v = CreateEvent(
2fc80 4e 55 4c 4c 2c 20 54 52 55 45 2c 20 46 41 4c 53  NULL, TRUE, FALS
2fc90 45 2c 20 78 2e 65 76 4e 61 6d 65 29 3b 0a 20 20  E, x.evName);.  
2fca0 69 66 20 28 20 21 65 76 20 29 7b 0a 20 20 20 20  if ( !ev ){.    
2fcb0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2fcc0 28 69 6e 74 65 72 70 2c 20 22 63 61 6e 6e 6f 74  (interp, "cannot
2fcd0 20 63 72 65 61 74 65 20 65 76 65 6e 74 3a 20 22   create event: "
2fce0 2c 20 78 2e 65 76 4e 61 6d 65 2c 20 28 63 68 61  , x.evName, (cha
2fcf0 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
2fd00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2fd10 0a 20 20 5f 62 65 67 69 6e 74 68 72 65 61 64 28  .  _beginthread(
2fd20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 65  win32_file_locke
2fd30 72 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26 78 29  r, 0, (void*)&x)
2fd40 3b 0a 20 20 53 6c 65 65 70 28 30 29 3b 0a 20 20  ;.  Sleep(0);.  
2fd50 69 66 20 28 20 28 77 52 65 73 75 6c 74 20 3d 20  if ( (wResult = 
2fd60 57 61 69 74 46 6f 72 53 69 6e 67 6c 65 4f 62 6a  WaitForSingleObj
2fd70 65 63 74 28 65 76 2c 20 31 30 30 30 30 29 29 21  ect(ev, 10000))!
2fd80 3d 57 41 49 54 5f 4f 42 4a 45 43 54 5f 30 20 29  =WAIT_OBJECT_0 )
2fd90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
2fda0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
2fdb0 75 66 29 2c 20 7a 42 75 66 2c 20 22 30 78 25 78  uf), zBuf, "0x%x
2fdc0 22 2c 20 77 52 65 73 75 6c 74 29 3b 0a 20 20 20  ", wResult);.   
2fdd0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2fde0 74 28 69 6e 74 65 72 70 2c 20 22 77 61 69 74 20  t(interp, "wait 
2fdf0 66 61 69 6c 65 64 3a 20 22 2c 20 7a 42 75 66 2c  failed: ", zBuf,
2fe00 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2fe10 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76 29 3b  CloseHandle(ev);
2fe20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2fe30 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 43 6c 6f  ERROR;.  }.  Clo
2fe40 73 65 48 61 6e 64 6c 65 28 65 76 29 3b 0a 20 20  seHandle(ev);.  
2fe50 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2fe60 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 65 78 69  ../*.**      exi
2fe70 73 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 20 50  sts_win32_path P
2fe80 41 54 48 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ATH.**.** Return
2fe90 73 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68  s non-zero if th
2fea0 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 68  e specified path
2feb0 20 65 78 69 73 74 73 2c 20 77 68 6f 73 65 20 66   exists, whose f
2fec0 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e  ully qualified n
2fed0 61 6d 65 0a 2a 2a 20 6d 61 79 20 65 78 63 65 65  ame.** may excee
2fee0 64 20 32 36 30 20 63 68 61 72 61 63 74 65 72 73  d 260 characters
2fef0 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78   if it is prefix
2ff00 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a  ed with "\\?\"..
2ff10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2ff20 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33  LITE_TCLAPI win3
2ff30 32 5f 65 78 69 73 74 73 5f 70 61 74 68 28 0a 20  2_exists_path(. 
2ff40 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
2ff50 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2ff60 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2ff70 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2ff80 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2ff90 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2ffa0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2ffb0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2ffc0 20 6f 62 6a 76 2c 20 22 50 41 54 48 22 29 3b 0a   objv, "PATH");.
2ffd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ffe0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
2fff0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
30000 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
30010 65 61 6e 4f 62 6a 28 0a 20 20 20 20 20 20 47 65  eanObj(.      Ge
30020 74 46 69 6c 65 41 74 74 72 69 62 75 74 65 73 57  tFileAttributesW
30030 28 20 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  ( Tcl_GetUnicode
30040 28 6f 62 6a 76 5b 31 5d 29 29 21 3d 49 4e 56 41  (objv[1]))!=INVA
30050 4c 49 44 5f 46 49 4c 45 5f 41 54 54 52 49 42 55  LID_FILE_ATTRIBU
30060 54 45 53 20 29 29 3b 0a 20 20 72 65 74 75 72 6e  TES ));.  return
30070 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
30080 2a 20 20 20 20 20 20 66 69 6e 64 5f 77 69 6e 33  *      find_win3
30090 32 5f 66 69 6c 65 20 50 41 54 54 45 52 4e 0a 2a  2_file PATTERN.*
300a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 61 20 6c  *.** Returns a l
300b0 69 73 74 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ist of entries i
300c0 6e 20 61 20 64 69 72 65 63 74 6f 72 79 20 74 68  n a directory th
300d0 61 74 20 6d 61 74 63 68 20 74 68 65 20 73 70 65  at match the spe
300e0 63 69 66 69 65 64 20 70 61 74 74 65 72 6e 2c 0a  cified pattern,.
300f0 2a 2a 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71  ** whose fully q
30100 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61  ualified name ma
30110 79 20 65 78 63 65 65 64 20 32 34 38 20 63 68 61  y exceed 248 cha
30120 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73  racters if it is
30130 20 70 72 65 66 69 78 65 64 20 77 69 74 68 0a 2a   prefixed with.*
30140 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61  * "\\?\"..*/.sta
30150 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
30160 43 4c 41 50 49 20 77 69 6e 33 32 5f 66 69 6e 64  CLAPI win32_find
30170 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63  _file(.  void *c
30180 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
30190 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
301a0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
301b0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
301c0 6a 76 5b 5d 0a 29 7b 0a 20 20 48 41 4e 44 4c 45  jv[].){.  HANDLE
301d0 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 49 4e 56   hFindFile = INV
301e0 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55  ALID_HANDLE_VALU
301f0 45 3b 0a 20 20 57 49 4e 33 32 5f 46 49 4e 44 5f  E;.  WIN32_FIND_
30200 44 41 54 41 57 20 66 69 6e 64 44 61 74 61 3b 0a  DATAW findData;.
30210 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f    Tcl_Obj *listO
30220 62 6a 3b 0a 20 20 44 57 4f 52 44 20 6c 61 73 74  bj;.  DWORD last
30230 45 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 62 6a  Errno;.  if( obj
30240 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
30250 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
30260 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50  erp, 1, objv, "P
30270 41 54 54 45 52 4e 22 29 3b 0a 20 20 20 20 72 65  ATTERN");.    re
30280 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
30290 20 20 7d 0a 20 20 68 46 69 6e 64 46 69 6c 65 20    }.  hFindFile 
302a0 3d 20 46 69 6e 64 46 69 72 73 74 46 69 6c 65 57  = FindFirstFileW
302b0 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28  (Tcl_GetUnicode(
302c0 6f 62 6a 76 5b 31 5d 29 2c 20 26 66 69 6e 64 44  objv[1]), &findD
302d0 61 74 61 29 3b 0a 20 20 69 66 28 20 68 46 69 6e  ata);.  if( hFin
302e0 64 46 69 6c 65 3d 3d 49 4e 56 41 4c 49 44 5f 48  dFile==INVALID_H
302f0 41 4e 44 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20  ANDLE_VALUE ){. 
30300 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
30310 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
30320 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65  NewWideIntObj(Ge
30330 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
30340 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
30350 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6c 69 73 74  RROR;.  }.  list
30360 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Obj = Tcl_NewObj
30370 28 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  ();.  Tcl_IncrRe
30380 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b  fCount(listObj);
30390 0a 20 20 64 6f 20 7b 0a 20 20 20 20 54 63 6c 5f  .  do {.    Tcl_
303a0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
303b0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
303c0 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 55 6e 69  tObj, Tcl_NewUni
303d0 63 6f 64 65 4f 62 6a 28 0a 20 20 20 20 20 20 20  codeObj(.       
303e0 20 66 69 6e 64 44 61 74 61 2e 63 46 69 6c 65 4e   findData.cFileN
303f0 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  ame, -1));.    T
30400 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
30410 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
30420 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77  listObj, Tcl_New
30430 57 69 64 65 49 6e 74 4f 62 6a 28 0a 20 20 20 20  WideIntObj(.    
30440 20 20 20 20 66 69 6e 64 44 61 74 61 2e 64 77 46      findData.dwF
30450 69 6c 65 41 74 74 72 69 62 75 74 65 73 29 29 3b  ileAttributes));
30460 0a 20 20 7d 20 77 68 69 6c 65 28 20 46 69 6e 64  .  } while( Find
30470 4e 65 78 74 46 69 6c 65 57 28 68 46 69 6e 64 46  NextFileW(hFindF
30480 69 6c 65 2c 20 26 66 69 6e 64 44 61 74 61 29 20  ile, &findData) 
30490 29 3b 0a 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d  );.  lastErrno =
304a0 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 3b   GetLastError();
304b0 0a 20 20 69 66 28 20 6c 61 73 74 45 72 72 6e 6f  .  if( lastErrno
304c0 21 3d 4e 4f 5f 45 52 52 4f 52 20 26 26 20 6c 61  !=NO_ERROR && la
304d0 73 74 45 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 4e  stErrno!=ERROR_N
304e0 4f 5f 4d 4f 52 45 5f 46 49 4c 45 53 20 29 7b 0a  O_MORE_FILES ){.
304f0 20 20 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 46      FindClose(hF
30500 69 6e 64 46 69 6c 65 29 3b 0a 20 20 20 20 54 63  indFile);.    Tc
30510 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c  l_DecrRefCount(l
30520 69 73 74 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c  istObj);.    Tcl
30530 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
30540 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
30550 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45  eIntObj(GetLastE
30560 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65  rror()));.    re
30570 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
30580 20 20 7d 0a 20 20 46 69 6e 64 43 6c 6f 73 65 28    }.  FindClose(
30590 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20 20 54 63  hFindFile);.  Tc
305a0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
305b0 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 29 3b  nterp, listObj);
305c0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
305d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
305e0 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c  delete_win32_fil
305f0 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a  e FILENAME.**.**
30600 20 44 65 6c 65 74 65 73 20 74 68 65 20 73 70 65   Deletes the spe
30610 63 69 66 69 65 64 20 66 69 6c 65 2c 20 77 68 6f  cified file, who
30620 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
30630 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65  ed name may exce
30640 65 64 20 32 36 30 0a 2a 2a 20 63 68 61 72 61 63  ed 260.** charac
30650 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72  ters if it is pr
30660 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f  efixed with "\\?
30670 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
30680 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
30690 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c  win32_delete_fil
306a0 65 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  e(.  void *clien
306b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
306c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
306d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
306e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
306f0 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .){.  if( objc!=
30700 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
30710 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
30720 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45  , 1, objv, "FILE
30730 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
30740 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
30750 7d 0a 20 20 69 66 28 20 21 44 65 6c 65 74 65 46  }.  if( !DeleteF
30760 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63  ileW(Tcl_GetUnic
30770 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b  ode(objv[1])) ){
30780 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
30790 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
307a0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
307b0 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
307c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
307d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
307e0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
307f0 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
30800 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
30810 20 20 20 20 20 20 6d 61 6b 65 5f 77 69 6e 33 32        make_win32
30820 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a 2a  _dir DIRECTORY.*
30830 2a 0a 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65  *.** Creates the
30840 20 73 70 65 63 69 66 69 65 64 20 64 69 72 65 63   specified direc
30850 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c  tory, whose full
30860 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  y qualified name
30870 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 0a   may exceed 248.
30880 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66  ** characters if
30890 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20   it is prefixed 
308a0 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a  with "\\?\"..*/.
308b0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
308c0 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f 6d  E_TCLAPI win32_m
308d0 6b 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c  kdir(.  void *cl
308e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
308f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
30900 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
30910 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
30920 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a  v[].){.  if( obj
30930 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
30940 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
30950 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
30960 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20 20  IRECTORY");.    
30970 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
30980 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 43 72 65  ;.  }.  if( !Cre
30990 61 74 65 44 69 72 65 63 74 6f 72 79 57 28 54 63  ateDirectoryW(Tc
309a0 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a  l_GetUnicode(obj
309b0 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 20 29 7b 0a  v[1]), NULL) ){.
309c0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
309d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
309e0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
309f0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
30a00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
30a10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
30a20 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
30a30 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
30a40 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
30a50 20 20 20 20 20 72 65 6d 6f 76 65 5f 77 69 6e 33       remove_win3
30a60 32 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a  2_dir DIRECTORY.
30a70 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 73 20 74 68  **.** Removes th
30a80 65 20 73 70 65 63 69 66 69 65 64 20 64 69 72 65  e specified dire
30a90 63 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c  ctory, whose ful
30aa0 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ly qualified nam
30ab0 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38  e may exceed 248
30ac0 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
30ad0 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64  f it is prefixed
30ae0 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f   with "\\?\"..*/
30af0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
30b00 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f  TE_TCLAPI win32_
30b10 72 6d 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63  rmdir(.  void *c
30b20 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
30b30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
30b40 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
30b50 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
30b60 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62  jv[].){.  if( ob
30b70 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
30b80 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
30b90 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
30ba0 44 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20  DIRECTORY");.   
30bb0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
30bc0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 52 65  R;.  }.  if( !Re
30bd0 6d 6f 76 65 44 69 72 65 63 74 6f 72 79 57 28 54  moveDirectoryW(T
30be0 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62  cl_GetUnicode(ob
30bf0 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54  jv[1])) ){.    T
30c00 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
30c10 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
30c20 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73  ideIntObj(GetLas
30c30 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20  tError()));.    
30c40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
30c50 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65  ;.  }.  Tcl_Rese
30c60 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
30c70 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
30c80 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
30c90 2a 2a 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61  **      optimiza
30ca0 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 44 42 20  tion_control DB 
30cb0 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a  OPT BOOLEAN.**.*
30cc0 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61  * Enable or disa
30cd0 62 6c 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  ble query optimi
30ce0 7a 61 74 69 6f 6e 73 20 75 73 69 6e 67 20 74 68  zations using th
30cf0 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  e sqlite3_test_c
30d00 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69 6e 74 65  ontrol().** inte
30d10 72 66 61 63 65 2e 20 20 44 69 73 61 62 6c 65 20  rface.  Disable 
30d20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 66 61  if BOOLEAN is fa
30d30 6c 73 65 20 61 6e 64 20 65 6e 61 62 6c 65 20 69  lse and enable i
30d40 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 74 72 75  f BOOLEAN is tru
30d50 65 2e 0a 2a 2a 20 4f 50 54 20 69 73 20 74 68 65  e..** OPT is the
30d60 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f 70 74   name of the opt
30d70 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 62 65 20  imization to be 
30d80 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73 74 61  disabled..*/.sta
30d90 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
30da0 43 4c 41 50 49 20 6f 70 74 69 6d 69 7a 61 74 69  CLAPI optimizati
30db0 6f 6e 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f  on_control(.  vo
30dc0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
30dd0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
30de0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
30df0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
30e00 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
30e10 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
30e20 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
30e30 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 69 6e 74 20  ar *zOpt;.  int 
30e40 6f 6e 6f 66 66 3b 0a 20 20 69 6e 74 20 6d 61 73  onoff;.  int mas
30e50 6b 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  k = 0;.  static 
30e60 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
30e70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
30e80 4f 70 74 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74  OptName;.    int
30e90 20 6d 61 73 6b 3b 0a 20 20 7d 20 61 4f 70 74 5b   mask;.  } aOpt[
30ea0 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6c 6c  ] = {.    { "all
30eb0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30ec0 20 20 20 53 51 4c 49 54 45 5f 41 6c 6c 4f 70 74     SQLITE_AllOpt
30ed0 73 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  s        },.    
30ee0 7b 20 22 6e 6f 6e 65 22 2c 20 20 20 20 20 20 20  { "none",       
30ef0 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20           0      
30f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
30f10 2c 0a 20 20 20 20 7b 20 22 71 75 65 72 79 2d 66  ,.    { "query-f
30f20 6c 61 74 74 65 6e 65 72 22 2c 20 20 20 20 20 53  lattener",     S
30f30 51 4c 49 54 45 5f 51 75 65 72 79 46 6c 61 74 74  QLITE_QueryFlatt
30f40 65 6e 65 72 20 7d 2c 0a 20 20 20 20 7b 20 22 67  ener },.    { "g
30f50 72 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c 20 20  roupby-order",  
30f60 20 20 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75       SQLITE_Grou
30f70 70 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20  pByOrder   },.  
30f80 20 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73    { "factor-cons
30f90 74 61 6e 74 73 22 2c 20 20 20 20 53 51 4c 49 54  tants",    SQLIT
30fa0 45 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74  E_FactorOutConst
30fb0 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73 74 69   },.    { "disti
30fc0 6e 63 74 2d 6f 70 74 22 2c 20 20 20 20 20 20 20  nct-opt",       
30fd0 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74   SQLITE_Distinct
30fe0 4f 70 74 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Opt    },.    { 
30ff0 22 63 6f 76 65 72 2d 69 64 78 2d 73 63 61 6e 22  "cover-idx-scan"
31000 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f  ,      SQLITE_Co
31010 76 65 72 49 64 78 53 63 61 6e 20 20 20 7d 2c 0a  verIdxScan   },.
31020 20 20 20 20 7b 20 22 6f 72 64 65 72 2d 62 79 2d      { "order-by-
31030 69 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53 51 4c  idx-join",   SQL
31040 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f  ITE_OrderByIdxJo
31050 69 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 61  in },.    { "tra
31060 6e 73 69 74 69 76 65 22 2c 20 20 20 20 20 20 20  nsitive",       
31070 20 20 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69     SQLITE_Transi
31080 74 69 76 65 20 20 20 20 20 7d 2c 0a 20 20 20 20  tive     },.    
31090 7b 20 22 6f 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f 69  { "omit-noop-joi
310a0 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  n",      SQLITE_
310b0 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 20 20 20 7d  OmitNoopJoin   }
310c0 2c 0a 20 20 20 20 7b 20 22 73 74 61 74 33 22 2c  ,.    { "stat3",
310d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
310e0 51 4c 49 54 45 5f 53 74 61 74 33 34 20 20 20 20  QLITE_Stat34    
310f0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
31100 74 61 74 34 22 2c 20 20 20 20 20 20 20 20 20 20  tat4",          
31110 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74       SQLITE_Stat
31120 33 34 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  34         },.  
31130 20 20 7b 20 22 73 6b 69 70 2d 73 63 61 6e 22 2c    { "skip-scan",
31140 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
31150 45 5f 53 6b 69 70 53 63 61 6e 20 20 20 20 20 20  E_SkipScan      
31160 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20   },.  };..  if( 
31170 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
31180 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
31190 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
311a0 20 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e   "DB OPT BOOLEAN
311b0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
311c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
311d0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
311e0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
311f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
31200 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
31210 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
31220 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
31230 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
31240 6a 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29  jv[3], &onoff) )
31250 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
31260 52 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f  R;.  zOpt = Tcl_
31270 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
31280 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
31290 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69  <sizeof(aOpt)/si
312a0 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69  zeof(aOpt[0]); i
312b0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
312c0 63 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69  cmp(zOpt, aOpt[i
312d0 5d 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29  ].zOptName)==0 )
312e0 7b 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61  {.      mask = a
312f0 4f 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  Opt[i].mask;.   
31300 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
31310 20 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20    }.  if( onoff 
31320 29 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a  ) mask = ~mask;.
31330 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
31340 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70  aOpt)/sizeof(aOp
31350 74 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c  t[0]) ){.    Tcl
31360 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
31370 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  terp, "unknown o
31380 70 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68  ptimization - sh
31390 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22  ould be one of:"
313a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
313b0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
313c0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
313d0 3c 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69  <sizeof(aOpt)/si
313e0 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69  zeof(aOpt[0]); i
313f0 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ++){.      Tcl_A
31400 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
31410 72 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d  rp, " ", aOpt[i]
31420 2e 7a 4f 70 74 4e 61 6d 65 2c 20 28 63 68 61 72  .zOptName, (char
31430 2a 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *)0);.    }.    
31440 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
31450 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
31460 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
31470 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
31480 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 64 62 2c 20  IMIZATIONS, db, 
31490 6d 61 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20  mask);.  return 
314a0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
314b0 20 20 20 20 20 6c 6f 61 64 5f 73 74 61 74 69 63       load_static
314c0 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 20 4e 41  _extension DB NA
314d0 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 61  ME ....**.** Loa
314e0 64 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 74  d one or more st
314f0 61 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20  atically linked 
31500 65 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 73  extensions..*/.s
31510 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
31520 5f 54 43 4c 41 50 49 20 74 63 6c 4c 6f 61 64 53  _TCLAPI tclLoadS
31530 74 61 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d  taticExtensionCm
31540 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
31550 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
31560 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
31570 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
31580 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
31590 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e  ].){.  extern in
315a0 74 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68  t sqlite3_amatch
315b0 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
315c0 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
315d0 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
315e0 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  *);.  extern int
315f0 20 73 71 6c 69 74 65 33 5f 63 61 72 72 61 79 5f   sqlite3_carray_
31600 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
31610 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
31620 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
31630 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
31640 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f  sqlite3_closure_
31650 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
31660 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
31670 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
31680 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
31690 73 71 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69 74  sqlite3_csv_init
316a0 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
316b0 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
316c0 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
316d0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
316e0 74 65 33 5f 65 76 61 6c 5f 69 6e 69 74 28 73 71  te3_eval_init(sq
316f0 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
31700 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
31710 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
31720 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
31730 5f 65 78 70 6c 61 69 6e 5f 69 6e 69 74 28 73 71  _explain_init(sq
31740 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
31750 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
31760 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
31770 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
31780 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 73 71 6c  _fileio_init(sql
31790 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
317a0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
317b0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
317c0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
317d0 66 75 7a 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69  fuzzer_init(sqli
317e0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
317f0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
31800 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
31810 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
31820 65 65 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  eee_init(sqlite3
31830 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
31840 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
31850 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
31860 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  int sqlite3_next
31870 63 68 61 72 5f 69 6e 69 74 28 73 71 6c 69 74 65  char_init(sqlite
31880 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
31890 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
318a0 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
318b0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 65 72   int sqlite3_per
318c0 63 65 6e 74 69 6c 65 5f 69 6e 69 74 28 73 71 6c  centile_init(sql
318d0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
318e0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
318f0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
31900 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
31910 72 65 67 65 78 70 5f 69 6e 69 74 28 73 71 6c 69  regexp_init(sqli
31920 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
31930 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
31940 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
31950 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72  rn int sqlite3_r
31960 65 6d 65 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c  emember_init(sql
31970 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
31980 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
31990 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
319a0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
319b0 73 65 72 69 65 73 5f 69 6e 69 74 28 73 71 6c 69  series_init(sqli
319c0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
319d0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
319e0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
319f0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
31a00 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c  pellfix_init(sql
31a10 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
31a20 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
31a30 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
31a40 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
31a50 74 6f 74 79 70 65 5f 69 6e 69 74 28 73 71 6c 69  totype_init(sqli
31a60 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
31a70 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
31a80 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
31a90 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  rn int sqlite3_w
31aa0 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28  holenumber_init(
31ab0 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
31ac0 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
31ad0 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
31ae0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
31af0 65 33 5f 75 6e 69 6f 6e 76 74 61 62 5f 69 6e 69  e3_unionvtab_ini
31b00 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
31b10 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
31b20 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
31b30 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
31b40 56 45 5f 5a 4c 49 42 0a 20 20 65 78 74 65 72 6e  VE_ZLIB.  extern
31b50 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 7a 69 70   int sqlite3_zip
31b60 66 69 6c 65 5f 69 6e 69 74 28 73 71 6c 69 74 65  file_init(sqlite
31b70 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
31b80 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
31b90 69 6e 65 73 2a 29 3b 0a 23 65 6e 64 69 66 0a 20  ines*);.#endif. 
31ba0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
31bb0 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74  ruct {.    const
31bc0 20 63 68 61 72 20 2a 7a 45 78 74 4e 61 6d 65 3b   char *zExtName;
31bd0 0a 20 20 20 20 69 6e 74 20 28 2a 70 49 6e 69 74  .    int (*pInit
31be0 29 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  )(sqlite3*,char*
31bf0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
31c00 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
31c10 20 20 7d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 5d    } aExtension[]
31c20 20 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6d 61 74   = {.    { "amat
31c30 63 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ch",            
31c40 20 20 20 20 73 71 6c 69 74 65 33 5f 61 6d 61 74      sqlite3_amat
31c50 63 68 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ch_init         
31c60 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
31c70 63 61 72 72 61 79 22 2c 20 20 20 20 20 20 20 20  carray",        
31c80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31c90 63 61 72 72 61 79 5f 69 6e 69 74 20 20 20 20 20  carray_init     
31ca0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
31cb0 20 7b 20 22 63 6c 6f 73 75 72 65 22 2c 20 20 20   { "closure",   
31cc0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31cd0 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74  te3_closure_init
31ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
31cf0 0a 20 20 20 20 7b 20 22 63 73 76 22 2c 20 20 20  .    { "csv",   
31d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d10 73 71 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69 74  sqlite3_csv_init
31d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31d30 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 76 61 6c    },.    { "eval
31d40 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
31d50 20 20 20 20 73 71 6c 69 74 65 33 5f 65 76 61 6c      sqlite3_eval
31d60 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
31d70 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
31d80 65 78 70 6c 61 69 6e 22 2c 20 20 20 20 20 20 20  explain",       
31d90 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31da0 65 78 70 6c 61 69 6e 5f 69 6e 69 74 20 20 20 20  explain_init    
31db0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
31dc0 20 7b 20 22 66 69 6c 65 69 6f 22 2c 20 20 20 20   { "fileio",    
31dd0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31de0 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 20  te3_fileio_init 
31df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
31e00 0a 20 20 20 20 7b 20 22 66 75 7a 7a 65 72 22 2c  .    { "fuzzer",
31e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31e20 73 71 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69  sqlite3_fuzzer_i
31e30 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
31e40 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 65 65 65    },.    { "ieee
31e50 37 35 34 22 2c 20 20 20 20 20 20 20 20 20 20 20  754",           
31e60 20 20 20 20 73 71 6c 69 74 65 33 5f 69 65 65 65      sqlite3_ieee
31e70 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
31e80 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
31e90 6e 65 78 74 63 68 61 72 22 2c 20 20 20 20 20 20  nextchar",      
31ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31eb0 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 20 20 20  nextchar_init   
31ec0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
31ed0 20 7b 20 22 70 65 72 63 65 6e 74 69 6c 65 22 2c   { "percentile",
31ee0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
31ef0 74 65 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69  te3_percentile_i
31f00 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 7d 2c  nit           },
31f10 0a 20 20 20 20 7b 20 22 72 65 67 65 78 70 22 2c  .    { "regexp",
31f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31f30 73 71 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69  sqlite3_regexp_i
31f40 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
31f50 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 6d 65    },.    { "reme
31f60 6d 62 65 72 22 2c 20 20 20 20 20 20 20 20 20 20  mber",          
31f70 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6d 65      sqlite3_reme
31f80 6d 62 65 72 5f 69 6e 69 74 20 20 20 20 20 20 20  mber_init       
31f90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
31fa0 73 65 72 69 65 73 22 2c 20 20 20 20 20 20 20 20  series",        
31fb0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31fc0 73 65 72 69 65 73 5f 69 6e 69 74 20 20 20 20 20  series_init     
31fd0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
31fe0 20 7b 20 22 73 70 65 6c 6c 66 69 78 22 2c 20 20   { "spellfix",  
31ff0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
32000 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69  te3_spellfix_ini
32010 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  t             },
32020 0a 20 20 20 20 7b 20 22 74 6f 74 79 70 65 22 2c  .    { "totype",
32030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32040 73 71 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f 69  sqlite3_totype_i
32050 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
32060 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 6e 69 6f    },.    { "unio
32070 6e 76 74 61 62 22 2c 20 20 20 20 20 20 20 20 20  nvtab",         
32080 20 20 20 20 73 71 6c 69 74 65 33 5f 75 6e 69 6f      sqlite3_unio
32090 6e 76 74 61 62 5f 69 6e 69 74 20 20 20 20 20 20  nvtab_init      
320a0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
320b0 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20 20 20  wholenumber",   
320c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
320d0 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74  wholenumber_init
320e0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69 66            },.#if
320f0 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
32100 5a 4c 49 42 0a 20 20 20 20 7b 20 22 7a 69 70 66  ZLIB.    { "zipf
32110 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ile",           
32120 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66      sqlite3_zipf
32130 69 6c 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ile_init        
32140 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
32150 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a    };.  sqlite3 *
32160 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
32170 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69   *zName;.  int i
32180 2c 20 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72 20  , j, rc;.  char 
32190 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
321a0 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20  if( objc<3 ){.  
321b0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
321c0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
321d0 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e 2e  jv, "DB NAME ...
321e0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
321f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
32200 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
32210 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
32220 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
32230 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
32240 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28  CL_ERROR;.  for(
32250 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b  j=2; j<objc; j++
32260 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54  ){.    zName = T
32270 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
32280 76 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69  v[j]);.    for(i
32290 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
322a0 61 45 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b  aExtension); i++
322b0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
322c0 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74 65  cmp(zName, aExte
322d0 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d  nsion[i].zExtNam
322e0 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  e)==0 ) break;. 
322f0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d     }.    if( i>=
32300 41 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e  ArraySize(aExten
32310 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 54  sion) ){.      T
32320 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
32330 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68  interp, "no such
32340 20 65 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a   extension: ", z
32350 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  Name, (char*)0);
32360 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
32370 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
32380 20 20 20 69 66 28 20 61 45 78 74 65 6e 73 69 6f     if( aExtensio
32390 6e 5b 69 5d 2e 70 49 6e 69 74 20 29 7b 0a 20 20  n[i].pInit ){.  
323a0 20 20 20 20 72 63 20 3d 20 61 45 78 74 65 6e 73      rc = aExtens
323b0 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c  ion[i].pInit(db,
323c0 20 26 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20   &zErrMsg, 0);. 
323d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
323e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
323f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
32400 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a  !=SQLITE_OK || z
32410 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
32420 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
32430 28 69 6e 74 65 72 70 2c 20 22 69 6e 69 74 69 61  (interp, "initia
32440 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 22 2c 20 7a  lization of ", z
32450 4e 61 6d 65 2c 20 22 20 66 61 69 6c 65 64 3a 20  Name, " failed: 
32460 22 2c 20 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20  ", zErrMsg,.    
32470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32480 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20     (char*)0);.  
32490 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
324a0 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
324b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
324c0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  R;.    }.  }.  r
324d0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
324e0 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65  ./*.**     sorte
324f0 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20  r_test_fakeheap 
32500 42 4f 4f 4c 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  BOOL.**.*/.stati
32510 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
32520 41 50 49 20 73 6f 72 74 65 72 5f 74 65 73 74 5f  API sorter_test_
32530 66 61 6b 65 68 65 61 70 28 0a 20 20 76 6f 69 64  fakeheap(.  void
32540 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
32550 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
32560 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
32570 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
32580 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
32590 74 20 62 41 72 67 3b 0a 20 20 69 66 28 20 6f 62  t bArg;.  if( ob
325a0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
325b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
325c0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
325d0 42 4f 4f 4c 22 29 3b 0a 20 20 20 20 72 65 74 75  BOOL");.    retu
325e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
325f0 7d 0a 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  }..  if( Tcl_Get
32600 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
32610 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
32620 26 62 41 72 67 29 20 29 7b 0a 20 20 20 20 72 65  &bArg) ){.    re
32630 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
32640 20 20 7d 0a 0a 20 20 69 66 28 20 62 41 72 67 20    }..  if( bArg 
32650 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
32660 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
32670 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Heap==0 ){.     
32680 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32690 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 53 51 4c  nfig.pHeap = SQL
326a0 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d  ITE_INT_TO_PTR(-
326b0 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
326c0 65 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  e{.    if( sqlit
326d0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
326e0 48 65 61 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  Heap==SQLITE_INT
326f0 5f 54 4f 5f 50 54 52 28 2d 31 29 20 29 7b 0a 20  _TO_PTR(-1) ){. 
32700 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
32710 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d  alConfig.pHeap =
32720 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
32730 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
32740 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
32750 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
32760 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74  .**     sorter_t
32770 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72  est_sort4_helper
32780 20 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53   DB SQL1 NSTEP S
32790 51 4c 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  QL2.**.** Compil
327a0 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
327b0 24 53 51 4c 31 20 61 6e 64 20 73 74 65 70 20 69  $SQL1 and step i
327c0 74 20 24 4e 53 54 45 50 20 74 69 6d 65 73 2e 20  t $NSTEP times. 
327d0 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 0a 2a  For each row, .*
327e0 2a 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 65  * check that the
327f0 20 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20 72 69   leftmost and ri
32800 67 68 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20  ghtmost columns 
32810 72 65 74 75 72 6e 65 64 20 61 72 65 20 62 6f 74  returned are bot
32820 68 20 69 6e 74 65 67 65 72 73 2c 0a 2a 2a 20 61  h integers,.** a
32830 6e 64 20 74 68 61 74 20 62 6f 74 68 20 63 6f 6e  nd that both con
32840 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 76 61  tain the same va
32850 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20  lue..**.** Then 
32860 65 78 65 63 75 74 65 20 73 74 61 74 65 6d 65 6e  execute statemen
32870 74 20 24 53 51 4c 32 2e 20 43 68 65 63 6b 20 74  t $SQL2. Check t
32880 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e  hat the statemen
32890 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 61  t returns the sa
328a0 6d 65 0a 2a 2a 20 73 65 74 20 6f 66 20 69 6e 74  me.** set of int
328b0 65 67 65 72 73 20 69 6e 20 74 68 65 20 73 61 6d  egers in the sam
328c0 65 20 6f 72 64 65 72 20 61 73 20 69 6e 20 74 68  e order as in th
328d0 65 20 70 72 65 76 69 6f 75 73 20 73 74 65 70 20  e previous step 
328e0 28 75 73 69 6e 67 20 24 53 51 4c 31 29 2e 0a 2a  (using $SQL1)..*
328f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
32900 49 54 45 5f 54 43 4c 41 50 49 20 73 6f 72 74 65  ITE_TCLAPI sorte
32910 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c  r_test_sort4_hel
32920 70 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  per(.  void * cl
32930 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
32940 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
32950 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
32960 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
32970 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  v[].){.  const c
32980 68 61 72 20 2a 7a 53 71 6c 31 3b 0a 20 20 63 6f  har *zSql1;.  co
32990 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32 3b  nst char *zSql2;
329a0 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b 20 0a 20  .  int nStep; . 
329b0 20 69 6e 74 20 69 53 74 65 70 3b 20 0a 20 20 75   int iStep; .  u
329c0 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43 6b 73  nsigned int iCks
329d0 75 6d 31 20 3d 20 30 3b 20 0a 20 20 75 6e 73 69  um1 = 0; .  unsi
329e0 67 6e 65 64 20 69 6e 74 20 69 43 6b 73 75 6d 32  gned int iCksum2
329f0 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 72 63 3b   = 0; .  int rc;
32a00 0a 20 20 69 6e 74 20 69 42 3b 0a 20 20 73 71 6c  .  int iB;.  sql
32a10 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69  ite3 *db;.  sqli
32a20 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
32a30 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
32a40 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  5 ){.    Tcl_Wro
32a50 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
32a60 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53  , 1, objv, "DB S
32a70 51 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 22 29  QL1 NSTEP SQL2")
32a80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
32a90 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
32aa0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
32ab0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
32ac0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
32ad0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
32ae0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 31  L_ERROR;.  zSql1
32af0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
32b00 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
32b10 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
32b20 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
32b30 33 5d 2c 20 26 6e 53 74 65 70 29 20 29 20 72 65  3], &nStep) ) re
32b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
32b50 20 20 7a 53 71 6c 32 20 3d 20 54 63 6c 5f 47 65    zSql2 = Tcl_Ge
32b60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29  tString(objv[4])
32b70 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
32b80 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
32b90 20 7a 53 71 6c 31 2c 20 2d 31 2c 20 26 70 53 74   zSql1, -1, &pSt
32ba0 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
32bb0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
32bc0 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20  to sql_error;.. 
32bd0 20 69 42 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   iB = sqlite3_co
32be0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74  lumn_count(pStmt
32bf0 29 2d 31 3b 0a 20 20 66 6f 72 28 69 53 74 65 70  )-1;.  for(iStep
32c00 3d 30 3b 20 69 53 74 65 70 3c 6e 53 74 65 70 20  =0; iStep<nStep 
32c10 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  && SQLITE_ROW==s
32c20 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
32c30 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20  t); iStep++){.  
32c40 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65    int a = sqlite
32c50 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
32c60 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  mt, 0);.    if( 
32c70 61 21 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  a!=sqlite3_colum
32c80 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 42 29  n_int(pStmt, iB)
32c90 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
32ca0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
32cb0 70 2c 20 22 64 61 74 61 20 65 72 72 6f 72 3a 20  p, "data error: 
32cc0 28 61 21 3d 62 29 22 2c 20 30 29 3b 0a 20 20 20  (a!=b)", 0);.   
32cd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
32ce0 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
32cf0 69 43 6b 73 75 6d 31 20 2b 3d 20 28 69 43 6b 73  iCksum1 += (iCks
32d00 75 6d 31 20 3c 3c 20 33 29 20 2b 20 28 75 6e 73  um1 << 3) + (uns
32d10 69 67 6e 65 64 20 69 6e 74 29 61 3b 0a 20 20 7d  igned int)a;.  }
32d20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
32d30 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
32d40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
32d50 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f  E_OK ) goto sql_
32d60 65 72 72 6f 72 3b 0a 0a 20 20 72 63 20 3d 20 73  error;..  rc = s
32d70 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
32d80 32 28 64 62 2c 20 7a 53 71 6c 32 2c 20 2d 31 2c  2(db, zSql2, -1,
32d90 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69   &pStmt, 0);.  i
32da0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
32db0 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f   ) goto sql_erro
32dc0 72 3b 0a 20 20 66 6f 72 28 69 53 74 65 70 3d 30  r;.  for(iStep=0
32dd0 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ; SQLITE_ROW==sq
32de0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
32df0 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20  ); iStep++){.   
32e00 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65 33   int a = sqlite3
32e10 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
32e20 74 2c 20 30 29 3b 0a 20 20 20 20 69 43 6b 73 75  t, 0);.    iCksu
32e30 6d 32 20 2b 3d 20 28 69 43 6b 73 75 6d 32 20 3c  m2 += (iCksum2 <
32e40 3c 20 33 29 20 2b 20 28 75 6e 73 69 67 6e 65 64  < 3) + (unsigned
32e50 20 69 6e 74 29 61 3b 0a 20 20 7d 0a 20 20 72 63   int)a;.  }.  rc
32e60 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
32e70 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
32e80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
32e90 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72  ) goto sql_error
32ea0 3b 0a 0a 20 20 69 66 28 20 69 43 6b 73 75 6d 31  ;..  if( iCksum1
32eb0 21 3d 69 43 6b 73 75 6d 32 20 29 7b 0a 20 20 20  !=iCksum2 ){.   
32ec0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
32ed0 74 28 69 6e 74 65 72 70 2c 20 22 63 68 65 63 6b  t(interp, "check
32ee0 73 75 6d 20 6d 69 73 6d 61 74 63 68 22 2c 20 30  sum mismatch", 0
32ef0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
32f00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
32f10 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20  return TCL_OK;. 
32f20 73 71 6c 5f 65 72 72 6f 72 3a 0a 20 20 54 63 6c  sql_error:.  Tcl
32f30 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
32f40 74 65 72 70 2c 20 22 73 71 6c 20 65 72 72 6f 72  terp, "sql error
32f50 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  : ", sqlite3_err
32f60 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 72  msg(db), 0);.  r
32f70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
32f80 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  .}...#ifdef SQLI
32f90 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
32fa0 43 41 54 49 4f 4e 0a 23 69 6e 63 6c 75 64 65 20  CATION.#include 
32fb0 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68  "sqlite3userauth
32fc0 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .h"./*.** tclcmd
32fd0 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  :  sqlite3_user_
32fe0 61 75 74 68 65 6e 74 69 63 61 74 65 20 44 42 20  authenticate DB 
32ff0 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
33000 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  D.*/.static int 
33010 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
33020 73 74 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69  st_user_authenti
33030 63 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  cate(.  ClientDa
33040 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
33050 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
33060 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
33070 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
33080 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
33090 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
330a0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
330b0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
330c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
330d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
330e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
330f0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
33100 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
33110 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20    char *zUser = 
33120 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73  0;.  char *zPass
33130 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50  wd = 0;.  int nP
33140 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 73 71 6c  asswd = 0;.  sql
33150 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
33160 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
33170 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
33180 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
33190 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
331a0 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52  USERNAME PASSWOR
331b0 44 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  D");.    return 
331c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
331d0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
331e0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
331f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
33200 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
33210 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
33220 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63    }.  zUser = Tc
33230 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
33240 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64 20  [2]);.  zPasswd 
33250 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
33260 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
33270 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 72 63 20  &nPasswd);.  rc 
33280 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61  = sqlite3_user_a
33290 75 74 68 65 6e 74 69 63 61 74 65 28 64 62 2c 20  uthenticate(db, 
332a0 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c 20  zUser, zPasswd, 
332b0 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f  nPasswd);.  Tcl_
332c0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
332d0 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
332e0 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
332f0 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
33300 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
33310 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
33320 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
33330 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
33340 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
33350 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ATION./*.** tclc
33360 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65  md:  sqlite3_use
33370 72 5f 61 64 64 20 44 42 20 55 53 45 52 4e 41 4d  r_add DB USERNAM
33380 45 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d  E PASSWORD ISADM
33390 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  IN.*/.static int
333a0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
333b0 65 73 74 5f 75 73 65 72 5f 61 64 64 28 0a 20 20  est_user_add(.  
333c0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
333d0 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
333e0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
333f0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
33400 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
33410 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
33420 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
33430 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
33440 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
33450 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
33460 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
33470 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
33480 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
33490 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
334a0 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63 68 61  zUser = 0;.  cha
334b0 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a  r *zPasswd = 0;.
334c0 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20 3d 20    int nPasswd = 
334d0 30 3b 0a 20 20 69 6e 74 20 69 73 41 64 6d 69 6e  0;.  int isAdmin
334e0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
334f0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
33500 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
33510 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
33520 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
33530 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e   objv, "DB USERN
33540 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53 41  AME PASSWORD ISA
33550 44 4d 49 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  DMIN");.    retu
33560 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
33570 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
33580 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
33590 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
335a0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
335b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
335c0 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d  R;.  }.  zUser =
335d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
335e0 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73  bjv[2]);.  zPass
335f0 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  wd = Tcl_GetStri
33600 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
33610 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20 20  ], &nPasswd);.  
33620 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
33630 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
33640 6a 76 5b 34 5d 2c 20 26 69 73 41 64 6d 69 6e 29  jv[4], &isAdmin)
33650 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
33660 5f 75 73 65 72 5f 61 64 64 28 64 62 2c 20 7a 55  _user_add(db, zU
33670 73 65 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50  ser, zPasswd, nP
33680 61 73 73 77 64 2c 20 69 73 41 64 6d 69 6e 29 3b  asswd, isAdmin);
33690 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
336a0 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
336b0 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
336c0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
336d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
336e0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
336f0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
33700 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65  CATION */..#ifde
33710 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
33720 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a  THENTICATION./*.
33730 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
33740 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65 20  te3_user_change 
33750 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53  DB USERNAME PASS
33760 57 4f 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a  WORD ISADMIN.*/.
33770 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
33780 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73  E_TCLAPI test_us
33790 65 72 5f 63 68 61 6e 67 65 28 0a 20 20 43 6c 69  er_change(.  Cli
337a0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
337b0 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
337c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
337d0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
337e0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
337f0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
33800 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
33810 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
33820 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
33830 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
33840 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
33850 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
33860 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
33870 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73  /.){.  char *zUs
33880 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  er = 0;.  char *
33890 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69  zPasswd = 0;.  i
338a0 6e 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a  nt nPasswd = 0;.
338b0 20 20 69 6e 74 20 69 73 41 64 6d 69 6e 20 3d 20    int isAdmin = 
338c0 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  0;.  sqlite3 *db
338d0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
338e0 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
338f0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
33900 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
33910 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45  jv, "DB USERNAME
33920 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49   PASSWORD ISADMI
33930 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
33940 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
33950 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
33960 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
33970 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
33980 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
33990 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
339a0 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63    }.  zUser = Tc
339b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
339c0 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64 20  [2]);.  zPasswd 
339d0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
339e0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
339f0 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63 6c  &nPasswd);.  Tcl
33a00 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
33a10 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
33a20 34 5d 2c 20 26 69 73 41 64 6d 69 6e 29 3b 0a 20  4], &isAdmin);. 
33a30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   rc = sqlite3_us
33a40 65 72 5f 63 68 61 6e 67 65 28 64 62 2c 20 7a 55  er_change(db, zU
33a50 73 65 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50  ser, zPasswd, nP
33a60 61 73 73 77 64 2c 20 69 73 41 64 6d 69 6e 29 3b  asswd, isAdmin);
33a70 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
33a80 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
33a90 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
33aa0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
33ab0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
33ac0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
33ad0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
33ae0 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65  CATION */..#ifde
33af0 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55  f SQLITE_USER_AU
33b00 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a  THENTICATION./*.
33b10 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
33b20 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 20  te3_user_delete 
33b30 44 42 20 55 53 45 52 4e 41 4d 45 0a 2a 2f 0a 73  DB USERNAME.*/.s
33b40 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
33b50 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73 65  _TCLAPI test_use
33b60 72 5f 64 65 6c 65 74 65 28 0a 20 20 43 6c 69 65  r_delete(.  Clie
33b70 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
33b80 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a  a, /* Unused */.
33b90 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
33ba0 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
33bb0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
33bc0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
33bd0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
33be0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
33bf0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
33c00 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
33c10 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
33c20 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
33c30 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
33c40 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65  .){.  char *zUse
33c50 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  r = 0;.  sqlite3
33c60 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
33c70 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
33c80 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
33c90 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
33ca0 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52  , objv, "DB USER
33cb0 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
33cc0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
33cd0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
33ce0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
33cf0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
33d00 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
33d10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
33d20 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d  R;.  }.  zUser =
33d30 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
33d40 62 6a 76 5b 32 5d 29 3b 0a 20 20 72 63 20 3d 20  bjv[2]);.  rc = 
33d50 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c  sqlite3_user_del
33d60 65 74 65 28 64 62 2c 20 7a 55 73 65 72 29 3b 0a  ete(db, zUser);.
33d70 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
33d80 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
33d90 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
33da0 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
33db0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
33dc0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
33dd0 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
33de0 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  ATION */../*.** 
33df0 74 63 6c 63 6d 64 3a 20 62 61 64 5f 62 65 68 61  tclcmd: bad_beha
33e00 76 69 6f 72 20 54 59 50 45 0a 2a 2a 0a 2a 2a 20  vior TYPE.**.** 
33e10 44 6f 20 73 6f 6d 65 20 74 68 69 6e 67 73 20 74  Do some things t
33e20 68 61 74 20 73 68 6f 75 6c 64 20 74 72 69 67 67  hat should trigg
33e30 65 72 20 61 20 76 61 6c 67 72 69 6e 64 20 6f 72  er a valgrind or
33e40 20 2d 66 73 61 6e 69 74 69 7a 65 3d 75 6e 64 65   -fsanitize=unde
33e50 66 69 6e 65 64 0a 2a 2a 20 77 61 72 6e 69 6e 67  fined.** warning
33e60 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20  .  This is used 
33e70 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 65  to verify that e
33e80 72 72 6f 72 73 20 61 6e 64 20 77 61 72 6e 69 6e  rrors and warnin
33e90 67 73 20 6f 75 74 70 75 74 20 62 79 20 74 68 6f  gs output by tho
33ea0 73 65 0a 2a 2a 20 74 6f 6f 6c 73 20 61 72 65 20  se.** tools are 
33eb0 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65 20  detected by the 
33ec0 74 65 73 74 20 73 63 72 69 70 74 73 2e 0a 2a 2a  test scripts..**
33ed0 0a 2a 2a 20 20 20 20 20 20 20 54 59 50 45 20 20  .**       TYPE  
33ee0 20 20 20 20 20 42 45 48 41 56 49 4f 52 0a 2a 2a       BEHAVIOR.**
33ef0 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
33f00 20 20 4f 76 65 72 66 6c 6f 77 20 61 20 73 69 67    Overflow a sig
33f10 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20  ned integer.**  
33f20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
33f30 4a 75 6d 70 20 62 61 73 65 64 20 6f 6e 20 61 6e  Jump based on an
33f40 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76   uninitialized v
33f50 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20  ariable.**      
33f60 20 33 20 20 20 20 20 20 20 20 20 20 52 65 61 64   3          Read
33f70 20 61 66 74 65 72 20 66 72 65 65 0a 2a 2a 20 20   after free.**  
33f80 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20 20       4          
33f90 50 61 6e 69 63 0a 2a 2f 0a 73 74 61 74 69 63 20  Panic.*/.static 
33fa0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
33fb0 49 20 74 65 73 74 5f 62 61 64 5f 62 65 68 61 76  I test_bad_behav
33fc0 69 6f 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ior(.  ClientDat
33fd0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
33fe0 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   Pointer to an i
33ff0 6e 74 65 67 65 72 20 63 6f 6e 74 61 69 6e 69 6e  nteger containin
34000 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 54 63 6c 5f  g zero */.  Tcl_
34010 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
34020 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
34030 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
34040 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
34050 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
34060 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
34070 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
34080 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
34090 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
340a0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
340b0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
340c0 69 6e 74 20 69 54 79 70 65 3b 0a 20 20 69 6e 74  int iType;.  int
340d0 20 78 79 7a 3b 0a 20 20 69 6e 74 20 69 20 3d 20   xyz;.  int i = 
340e0 2a 28 69 6e 74 2a 29 63 6c 69 65 6e 74 44 61 74  *(int*)clientDat
340f0 61 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e  a;.  int j;.  in
34100 74 20 77 5b 31 30 5d 3b 0a 20 20 69 6e 74 20 2a  t w[10];.  int *
34110 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  a;.  if( objc!=2
34120 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
34130 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
34140 20 31 2c 20 6f 62 6a 76 2c 20 22 54 59 50 45 22   1, objv, "TYPE"
34150 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
34160 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
34170 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
34180 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
34190 76 5b 31 5d 2c 20 26 69 54 79 70 65 29 20 29 20  v[1], &iType) ) 
341a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
341b0 3b 0a 20 20 73 77 69 74 63 68 28 20 69 54 79 70  ;.  switch( iTyp
341c0 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a  e ){.    case 1:
341d0 20 7b 0a 20 20 20 20 20 20 78 79 7a 20 3d 20 30   {.      xyz = 0
341e0 78 37 66 66 66 66 66 30 30 20 2d 20 69 3b 0a 20  x7fffff00 - i;. 
341f0 20 20 20 20 20 78 79 7a 20 2b 3d 20 30 78 31 30       xyz += 0x10
34200 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  0;.      Tcl_Set
34210 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
34220 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
34230 78 79 7a 29 29 3b 0a 20 20 20 20 20 20 62 72 65  xyz));.      bre
34240 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
34250 73 65 20 32 3a 20 7b 0a 20 20 20 20 20 20 77 5b  se 2: {.      w[
34260 31 5d 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66  1] = 5;.      if
34270 28 20 77 5b 69 5d 3e 30 20 29 20 77 5b 31 5d 2b  ( w[i]>0 ) w[1]+
34280 2b 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  +;.      Tcl_Set
34290 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
342a0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
342b0 77 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 62 72  w[1]));.      br
342c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
342d0 61 73 65 20 33 3a 20 7b 0a 20 20 20 20 20 20 61  ase 3: {.      a
342e0 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f   = malloc( sizeo
342f0 66 28 69 6e 74 29 2a 31 30 20 29 3b 0a 20 20 20  f(int)*10 );.   
34300 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 30     for(j=0; j<10
34310 3b 20 6a 2b 2b 29 20 61 5b 6a 5d 20 3d 20 6a 3b  ; j++) a[j] = j;
34320 0a 20 20 20 20 20 20 66 72 65 65 28 61 29 3b 0a  .      free(a);.
34330 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a        Tcl_SetObj
34340 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
34350 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 5b 69  cl_NewIntObj(a[i
34360 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ]));.      break
34370 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
34380 20 34 3a 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f   4: {.      Tcl_
34390 50 61 6e 69 63 28 22 44 65 6c 69 62 65 72 61 74  Panic("Deliberat
343a0 65 20 70 61 6e 69 63 22 29 3b 0a 20 20 20 20 20  e panic");.     
343b0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
343c0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
343d0 4b 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 74 63  K;.}  ../*.** tc
343e0 6c 63 6d 64 3a 20 20 20 72 65 67 69 73 74 65 72  lcmd:   register
343f0 5f 64 62 73 74 61 74 5f 76 74 61 62 20 44 42 0a  _dbstat_vtab DB.
34400 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 74 68 65 20  **.** Cause the 
34410 64 62 73 74 61 74 20 76 69 72 74 75 61 6c 20 74  dbstat virtual t
34420 61 62 6c 65 20 74 6f 20 62 65 20 61 76 61 69 6c  able to be avail
34430 61 62 6c 65 20 6f 6e 20 74 68 65 20 63 6f 6e 6e  able on the conn
34440 65 63 74 69 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61  ection DB.*/.sta
34450 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
34460 43 4c 41 50 49 20 74 65 73 74 5f 72 65 67 69 73  CLAPI test_regis
34470 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62 28  ter_dbstat_vtab(
34480 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
34490 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
344a0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
344b0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
344c0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
344d0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
344e0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
344f0 45 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  E.  Tcl_AppendRe
34500 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 62  sult(interp, "db
34510 73 74 61 74 20 6e 6f 74 20 61 76 61 69 6c 61 62  stat not availab
34520 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20 22 0a  le because of ".
34530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34540 20 20 20 20 20 20 20 20 20 20 20 22 53 51 4c 49             "SQLI
34550 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
34560 41 42 4c 45 22 2c 20 28 76 6f 69 64 2a 29 30 29  ABLE", (void*)0)
34570 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
34580 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 74  RROR;.#else.  st
34590 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b 20  ruct SqliteDb { 
345a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 7d 3b 0a  sqlite3 *db; };.
345b0 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 54    char *zDb;.  T
345c0 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e  cl_CmdInfo cmdIn
345d0 66 6f 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  fo;..  if( objc!
345e0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
345f0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
34600 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
34610 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
34620 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
34630 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
34640 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
34650 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  if( Tcl_GetComma
34660 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a  ndInfo(interp, z
34670 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  Db, &cmdInfo) ){
34680 0a 20 20 20 20 73 71 6c 69 74 65 33 2a 20 64 62  .    sqlite3* db
34690 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c 69   = ((struct Sqli
346a0 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62  teDb*)cmdInfo.ob
346b0 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62  jClientData)->db
346c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 73  ;.    sqlite3Dbs
346d0 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29 3b  tatRegister(db);
346e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
346f0 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  L_OK;.#endif /* 
34700 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
34710 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a 2f  UALTABLE */.}../
34720 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73  *.** tclcmd:   s
34730 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
34740 20 44 42 20 53 45 54 54 49 4e 47 20 56 41 4c 55   DB SETTING VALU
34750 45 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73  E.**.** Invoke s
34760 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
34770 28 29 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68  () for one of th
34780 65 20 73 65 74 74 69 6e 67 20 76 61 6c 75 65 73  e setting values
34790 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
347a0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
347b0 73 74 5f 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  st_sqlite3_db_co
347c0 6e 66 69 67 28 0a 20 20 76 6f 69 64 20 2a 63 6c  nfig(.  void *cl
347d0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
347e0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
347f0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
34800 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
34810 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  v[].){.  static 
34820 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
34830 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
34840 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 65 56  Name;.    int eV
34850 61 6c 3b 0a 20 20 7d 20 61 53 65 74 74 69 6e 67  al;.  } aSetting
34860 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 46 4b  [] = {.    { "FK
34870 45 59 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  EY",            
34880 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
34890 45 4e 41 42 4c 45 5f 46 4b 45 59 20 7d 2c 0a 20  ENABLE_FKEY },. 
348a0 20 20 20 7b 20 22 54 52 49 47 47 45 52 22 2c 20     { "TRIGGER", 
348b0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
348c0 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54  BCONFIG_ENABLE_T
348d0 52 49 47 47 45 52 20 7d 2c 0a 20 20 20 20 7b 20  RIGGER },.    { 
348e0 22 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 22  "FTS3_TOKENIZER"
348f0 2c 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  ,  SQLITE_DBCONF
34900 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54  IG_ENABLE_FTS3_T
34910 4f 4b 45 4e 49 5a 45 52 20 7d 2c 0a 20 20 20 20  OKENIZER },.    
34920 7b 20 22 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  { "LOAD_EXTENSIO
34930 4e 22 2c 20 20 53 51 4c 49 54 45 5f 44 42 43 4f  N",  SQLITE_DBCO
34940 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  NFIG_ENABLE_LOAD
34950 5f 45 58 54 45 4e 53 49 4f 4e 20 7d 2c 0a 20 20  _EXTENSION },.  
34960 20 20 7b 20 22 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f    { "NO_CKPT_ON_
34970 43 4c 4f 53 45 22 2c 53 51 4c 49 54 45 5f 44 42  CLOSE",SQLITE_DB
34980 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f 4f  CONFIG_NO_CKPT_O
34990 4e 5f 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20 7b  N_CLOSE },.    {
349a0 20 22 51 50 53 47 22 2c 20 20 20 20 20 20 20 20   "QPSG",        
349b0 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
349c0 46 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47 20  FIG_ENABLE_QPSG 
349d0 7d 2c 0a 20 20 20 20 7b 20 22 54 52 49 47 47 45  },.    { "TRIGGE
349e0 52 5f 45 51 50 22 2c 20 20 20 20 20 53 51 4c 49  R_EQP",     SQLI
349f0 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47  TE_DBCONFIG_TRIG
34a00 47 45 52 5f 45 51 50 20 7d 2c 0a 20 20 20 20 7b  GER_EQP },.    {
34a10 20 22 52 45 53 45 54 5f 44 42 22 2c 20 20 20 20   "RESET_DB",    
34a20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
34a30 46 49 47 5f 52 45 53 45 54 5f 44 41 54 41 42 41  FIG_RESET_DATABA
34a40 53 45 20 7d 2c 0a 20 20 20 20 7b 20 22 44 45 46  SE },.    { "DEF
34a50 45 4e 53 49 56 45 22 2c 20 20 20 20 20 20 20 53  ENSIVE",       S
34a60 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44  QLITE_DBCONFIG_D
34a70 45 46 45 4e 53 49 56 45 20 7d 2c 0a 20 20 7d 3b  EFENSIVE },.  };
34a80 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
34a90 76 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  v;.  const char 
34aa0 2a 7a 53 65 74 74 69 6e 67 3b 0a 20 20 73 71 6c  *zSetting;.  sql
34ab0 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
34ac0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
34ad0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
34ae0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
34af0 2c 20 22 44 42 20 53 45 54 54 49 4e 47 20 56 41  , "DB SETTING VA
34b00 4c 55 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  LUE");.    retur
34b10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
34b20 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
34b30 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
34b40 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
34b50 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
34b60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
34b70 53 65 74 74 69 6e 67 20 3d 20 54 63 6c 5f 47 65  Setting = Tcl_Ge
34b80 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
34b90 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
34ba0 73 74 72 67 6c 6f 62 28 22 53 51 4c 49 54 45 5f  strglob("SQLITE_
34bb0 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29 3d 3d 30  *", zSetting)==0
34bc0 20 29 20 7a 53 65 74 74 69 6e 67 20 2b 3d 20 37   ) zSetting += 7
34bd0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
34be0 73 74 72 67 6c 6f 62 28 22 44 42 43 4f 4e 46 49  strglob("DBCONFI
34bf0 47 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29 3d  G_*", zSetting)=
34c00 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b 3d  =0 ) zSetting +=
34c10 20 39 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   9;.  if( sqlite
34c20 33 5f 73 74 72 67 6c 6f 62 28 22 45 4e 41 42 4c  3_strglob("ENABL
34c30 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29 3d  E_*", zSetting)=
34c40 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b 3d  =0 ) zSetting +=
34c50 20 37 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   7;.  for(i=0; i
34c60 3c 41 72 72 61 79 53 69 7a 65 28 61 53 65 74 74  <ArraySize(aSett
34c70 69 6e 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ing); i++){.    
34c80 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65 74 74  if( strcmp(zSett
34c90 69 6e 67 2c 20 61 53 65 74 74 69 6e 67 5b 69 5d  ing, aSetting[i]
34ca0 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
34cb0 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e  ak;.  }.  if( i>
34cc0 3d 41 72 72 61 79 53 69 7a 65 28 61 53 65 74 74  =ArraySize(aSett
34cd0 69 6e 67 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ing) ){.    Tcl_
34ce0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
34cf0 65 72 70 2c 0a 20 20 20 20 20 20 54 63 6c 5f 4e  erp,.      Tcl_N
34d00 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 6b  ewStringObj("unk
34d10 6e 6f 77 6e 20 73 71 6c 69 74 65 33 5f 64 62 5f  nown sqlite3_db_
34d20 63 6f 6e 66 69 67 20 73 65 74 74 69 6e 67 22 2c  config setting",
34d30 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72   -1));.    retur
34d40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
34d50 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
34d60 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
34d70 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 29 20 29 20   objv[3], &v) ) 
34d80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
34d90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  ;.  sqlite3_db_c
34da0 6f 6e 66 69 67 28 64 62 2c 20 61 53 65 74 74 69  onfig(db, aSetti
34db0 6e 67 5b 69 5d 2e 65 56 61 6c 2c 20 76 2c 20 26  ng[i].eVal, v, &
34dc0 76 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  v);.  Tcl_SetObj
34dd0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
34de0 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
34df0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
34e00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
34e10 67 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ge the name of t
34e20 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
34e30 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 22 6d 61   schema from "ma
34e40 69 6e 22 20 74 6f 20 22 69 63 65 63 75 62 65 22  in" to "icecube"
34e50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
34e60 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
34e70 73 74 5f 64 62 63 6f 6e 66 69 67 5f 6d 61 69 6e  st_dbconfig_main
34e80 64 62 6e 61 6d 65 5f 69 63 65 63 75 62 65 28 0a  dbname_icecube(.
34e90 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
34ea0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
34eb0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
34ec0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
34ed0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
34ee0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
34ef0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 65 78 74  lite3 *db;.  ext
34f00 65 72 6e 20 69 6e 74 20 67 65 74 44 62 50 6f 69  ern int getDbPoi
34f10 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 2a  nter(Tcl_Interp*
34f20 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73  , const char*, s
34f30 71 6c 69 74 65 33 2a 2a 29 3b 0a 20 20 69 66 28  qlite3**);.  if(
34f40 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
34f50 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
34f60 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
34f70 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
34f80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
34f90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
34fa0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
34fb0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
34fc0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
34fd0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
34fe0 52 52 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73  RROR;.    rc = s
34ff0 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
35000 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
35010 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 2c  NFIG_MAINDBNAME,
35020 20 22 69 63 65 63 75 62 65 22 29 3b 0a 20 20 20   "icecube");.   
35030 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
35040 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
35050 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
35060 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
35070 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  .  }.}../*.** Us
35080 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 77 61 6c  age: sqlite3_wal
35090 5f 69 6e 66 6f 20 44 42 20 44 42 4e 41 4d 45 0a  _info DB DBNAME.
350a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
350b0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
350c0 5f 77 61 6c 5f 69 6e 66 6f 28 0a 20 20 76 6f 69  _wal_info(.  voi
350d0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
350e0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
350f0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
35100 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
35110 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
35120 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
35130 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e   *db;.  char *zN
35140 61 6d 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  ame;.  unsigned 
35150 69 6e 74 20 6e 50 72 69 6f 72 3b 0a 20 20 75 6e  int nPrior;.  un
35160 73 69 67 6e 65 64 20 69 6e 74 20 6e 46 72 61 6d  signed int nFram
35170 65 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  e;..  if( objc!=
35180 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
35190 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
351a0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
351b0 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  BNAME");.    ret
351c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
351d0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
351e0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
351f0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
35200 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
35210 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
35220 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
35230 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
35240 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
35250 5f 77 61 6c 5f 69 6e 66 6f 28 64 62 2c 20 7a 4e  _wal_info(db, zN
35260 61 6d 65 2c 20 26 6e 50 72 69 6f 72 2c 20 26 6e  ame, &nPrior, &n
35270 46 72 61 6d 65 29 3b 0a 20 20 69 66 28 20 72 63  Frame);.  if( rc
35280 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
35290 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
352a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
352b0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
352c0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
352d0 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72   -1));.    retur
352e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
352f0 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 4f 62  else{.    Tcl_Ob
35300 6a 20 2a 70 4e 65 77 20 3d 20 54 63 6c 5f 4e 65  j *pNew = Tcl_Ne
35310 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63 6c 5f  wObj();.    Tcl_
35320 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
35330 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 4e 65  ment(interp, pNe
35340 77 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  w, Tcl_NewWideIn
35350 74 4f 62 6a 28 28 69 36 34 29 6e 50 72 69 6f 72  tObj((i64)nPrior
35360 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
35370 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
35380 28 69 6e 74 65 72 70 2c 20 70 4e 65 77 2c 20 54  (interp, pNew, T
35390 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
353a0 28 28 69 36 34 29 6e 46 72 61 6d 65 29 29 3b 0a  ((i64)nFrame));.
353b0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
353c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 4e 65  sult(interp, pNe
353d0 77 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  w);.  }.  return
353e0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
353f0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
35400 5f 6d 6d 61 70 5f 77 61 72 6d 20 44 42 20 44 42  _mmap_warm DB DB
35410 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NAME.*/.static i
35420 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
35430 20 74 65 73 74 5f 6d 6d 61 70 5f 77 61 72 6d 28   test_mmap_warm(
35440 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
35450 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
35460 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
35470 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
35480 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
35490 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
354a0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
354b0 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74 20  _Interp*, const 
354c0 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a 2a  char*, sqlite3**
354d0 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
354e0 73 71 6c 69 74 65 33 5f 6d 6d 61 70 5f 77 61 72  sqlite3_mmap_war
354f0 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  m(sqlite3 *db, c
35500 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 20  onst char *);.. 
35510 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
35520 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
35530 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
35540 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
35550 20 22 44 42 20 3f 44 42 4e 41 4d 45 3f 22 29 3b   "DB ?DBNAME?");
35560 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
35570 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
35580 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
35590 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20  sqlite3 *db;.   
355a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
355b0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 67 65   = 0;.    if( ge
355c0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
355d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
355e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
355f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
35600 4f 52 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  OR;.    if( objc
35610 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  ==3 ){.      zDb
35620 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
35630 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d  (objv[2]);.    }
35640 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
35650 33 5f 6d 6d 61 70 5f 77 61 72 6d 28 64 62 2c 20  3_mmap_warm(db, 
35660 7a 44 62 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  zDb);.    Tcl_Se
35670 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
35680 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
35690 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61  Obj(sqlite3ErrNa
356a0 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20  me(rc), -1));.  
356b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
356c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
356d0 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20  gister commands 
356e0 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74  with the TCL int
356f0 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74  erpreter..*/.int
35700 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
35710 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
35720 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20  terp){.  extern 
35730 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
35740 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  ch_count;.  exte
35750 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
35760 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  ound_count;.  ex
35770 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
35780 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
35790 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
357a0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65  qlite3_open_file
357b0 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
357c0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72   int sqlite3_sor
357d0 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  t_count;.  exter
357e0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  n int sqlite3_cu
357f0 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20  rrent_time;.#if 
35800 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26  SQLITE_OS_UNIX &
35810 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
35820 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
35830 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
35840 59 4c 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  YLE.  extern int
35850 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
35860 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78  num;.#endif.  ex
35870 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
35880 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20  _max_blobsize;. 
35890 20 65 78 74 65 72 6e 20 69 6e 74 20 53 51 4c 49   extern int SQLI
358a0 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65  TE_TCLAPI sqlite
358b0 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
358c0 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20  eReport(void*,. 
358d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358f0 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74           Tcl_Int
35900 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a  erp*,int,Tcl_Obj
35910 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74  *CONST*);.  stat
35920 69 63 20 69 6e 74 20 69 5a 65 72 6f 20 3d 20 30  ic int iZero = 0
35930 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
35940 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
35950 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 43  Name;.     Tcl_C
35960 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20  mdProc *xProc;. 
35970 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20   } aCmd[] = {.  
35980 20 20 20 7b 20 22 64 62 5f 65 6e 74 65 72 22 2c     { "db_enter",
35990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359a0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
359b0 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20 20 20 20  oc*)db_enter    
359c0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
359d0 20 20 20 7b 20 22 64 62 5f 6c 65 61 76 65 22 2c     { "db_leave",
359e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
359f0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35a00 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20 20 20 20  oc*)db_leave    
35a10 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
35a20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
35a30 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20  rintf_int",     
35a40 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35a50 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
35a60 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20 20  ntf_int    },.  
35a70 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
35a80 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20 20  rintf_int64",   
35a90 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35aa0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
35ab0 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20 20  ntf_int64  },.  
35ac0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
35ad0 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20 20 20  rintf_long",    
35ae0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35af0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
35b00 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a 20 20  ntf_long   },.  
35b10 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
35b20 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20  rintf_str",     
35b30 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35b40 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
35b50 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20 20  ntf_str    },.  
35b60 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e     { "sqlite3_sn
35b70 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20  printf_str",    
35b80 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35b90 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70 72  oc*)sqlite3_snpr
35ba0 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20 20  intf_str   },.  
35bb0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
35bc0 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c 20  rintf_stronly", 
35bd0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35be0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
35bf0 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20 20  ntf_stronly},.  
35c00 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
35c10 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20 20  rintf_double",  
35c20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35c30 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
35c40 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20 20  ntf_double },.  
35c50 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
35c60 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20 20  rintf_scaled",  
35c70 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35c80 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
35c90 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20 20  ntf_scaled },.  
35ca0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
35cb0 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 22  rintf_hexdouble"
35cc0 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  ,   (Tcl_CmdProc
35cd0 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
35ce0 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20 20  f_hexdouble},.  
35cf0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
35d00 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20 20  rintf_z_test",  
35d10 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
35d20 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66  oc*)test_mprintf
35d30 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  _z        },.   
35d40 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
35d50 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20 20  intf_n_test",   
35d60 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
35d70 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  c*)test_mprintf_
35d80 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  n        },.    
35d90 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72   { "sqlite3_snpr
35da0 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20  intf_int",      
35db0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
35dc0 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f  *)test_snprintf_
35dd0 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  int     },.     
35de0 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  { "sqlite3_last_
35df0 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20  insert_rowid",  
35e00 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
35e10 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64  )test_last_rowid
35e20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
35e30 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70   "sqlite3_exec_p
35e40 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20  rintf",         
35e50 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
35e60 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66  test_exec_printf
35e70 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
35e80 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65  "sqlite3_exec_he
35e90 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
35ea0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
35eb0 65 73 74 5f 65 78 65 63 5f 68 65 78 20 20 20 20  est_exec_hex    
35ec0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
35ed0 73 71 6c 69 74 65 33 5f 65 78 65 63 22 2c 20 20  sqlite3_exec",  
35ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35ef0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
35f00 73 74 5f 65 78 65 63 20 20 20 20 20 20 20 20 20  st_exec         
35f10 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
35f20 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 22 2c  qlite3_exec_nr",
35f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
35f40 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
35f50 74 5f 65 78 65 63 5f 6e 72 20 20 20 20 20 20 20  t_exec_nr       
35f60 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51     },.#ifndef SQ
35f70 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41  LITE_OMIT_GET_TA
35f80 42 4c 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  BLE.     { "sqli
35f90 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
35fa0 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54 63 6c  intf",      (Tcl
35fb0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 67  _CmdProc*)test_g
35fc0 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20  et_table_printf 
35fd0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
35fe0 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 22   "sqlite3_close"
35ff0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36000 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36010 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73  sqlite_test_clos
36020 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  e     },.     { 
36030 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76  "sqlite3_close_v
36040 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
36050 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
36060 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65  qlite_test_close
36070 5f 76 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  _v2  },.     { "
36080 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
36090 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  unction",       
360a0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
360b0 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
360c0 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  on  },.     { "s
360d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67  qlite3_create_ag
360e0 67 72 65 67 61 74 65 22 2c 20 20 20 20 20 20 28  gregate",      (
360f0 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
36100 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
36110 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  te },.     { "sq
36120 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65  lite_register_te
36130 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28 54  st_function", (T
36140 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
36150 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 20 20  _register_func  
36160 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
36170 69 74 65 5f 61 62 6f 72 74 22 2c 20 20 20 20 20  ite_abort",     
36180 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
36190 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
361a0 65 5f 61 62 6f 72 74 20 20 20 20 20 20 20 20 20  e_abort         
361b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
361c0 74 65 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20  te_bind",       
361d0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
361e0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62  _CmdProc*)test_b
361f0 69 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ind             
36200 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b  },.     { "break
36210 70 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  point",         
36220 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
36230 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72  CmdProc*)test_br
36240 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d  eakpoint       }
36250 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
36260 33 5f 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20  3_key",         
36270 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
36280 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65 79  mdProc*)test_key
36290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
362a0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
362b0 5f 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20  _rekey",        
362c0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
362d0 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b 65  dProc*)test_reke
362e0 79 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  y            },.
362f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73       { "sqlite_s
36300 65 74 5f 6d 61 67 69 63 22 2c 20 20 20 20 20 20  et_magic",      
36310 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
36320 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65 74  Proc*)sqlite_set
36330 5f 6d 61 67 69 63 20 20 20 20 20 20 7d 2c 0a 20  _magic      },. 
36340 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69      { "sqlite3_i
36350 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20 20 20  nterrupt",      
36360 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
36370 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74 65 72 72  roc*)test_interr
36380 75 70 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  upt        },.  
36390 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c     { "sqlite_del
363a0 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  ete_function",  
363b0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
363c0 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63 74  oc*)delete_funct
363d0 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  ion       },.   
363e0 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65    { "sqlite_dele
363f0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20  te_collation",  
36400 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
36410 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  c*)delete_collat
36420 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ion      },.    
36430 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f   { "sqlite3_get_
36440 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20 20  autocommit",    
36450 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
36460 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  *)get_autocommit
36470 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
36480 7b 20 22 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  { "sqlite3_busy_
36490 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
364a0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
364b0 29 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f  )test_busy_timeo
364c0 75 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ut     },.     {
364d0 20 22 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20   "printf",      
364e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364f0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
36500 74 65 73 74 5f 70 72 69 6e 74 66 20 20 20 20 20  test_printf     
36510 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
36520 22 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 22  "sqlite3IoTrace"
36530 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
36540 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
36550 74 5f 69 6f 5f 74 72 61 63 65 20 20 20 20 20 20  t_io_trace      
36560 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 63 6c     },.     { "cl
36570 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64  ang_sanitize_add
36580 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 28 54  ress",        (T
36590 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 63 6c 61 6e  cl_CmdProc*)clan
365a0 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
365b0 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  ss },.  };.  sta
365c0 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
365d0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
365e0 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72      Tcl_ObjCmdPr
365f0 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20  oc *xProc;.     
36600 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
36610 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20  ;.  } aObjCmd[] 
36620 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  = {.     { "sqli
36630 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 22 2c 20  te3_db_config", 
36640 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
36650 5f 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66  _sqlite3_db_conf
36660 69 67 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ig, 0 },.     { 
36670 22 62 61 64 5f 62 65 68 61 76 69 6f 72 22 2c 20  "bad_behavior", 
36680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36690 20 74 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69   test_bad_behavi
366a0 6f 72 2c 20 20 28 76 6f 69 64 2a 29 26 69 5a 65  or,  (void*)&iZe
366b0 72 6f 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65  ro },.     { "re
366c0 67 69 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74  gister_dbstat_vt
366d0 61 62 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  ab",          te
366e0 73 74 5f 72 65 67 69 73 74 65 72 5f 64 62 73 74  st_register_dbst
366f0 61 74 5f 76 74 61 62 20 20 7d 2c 0a 20 20 20 20  at_vtab  },.    
36700 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e   { "sqlite3_conn
36710 65 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c  ection_pointer",
36720 20 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70      get_sqlite_p
36730 6f 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20  ointer, 0 },.   
36740 20 20 7b 20 22 69 6e 74 61 72 72 61 79 5f 61 64    { "intarray_ad
36750 64 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  dr",            
36760 20 20 20 20 20 74 65 73 74 5f 69 6e 74 61 72 72       test_intarr
36770 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20 20  ay_addr, 0 },.  
36780 20 20 20 7b 20 22 69 6e 74 36 34 61 72 72 61 79     { "int64array
36790 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20 20 20  _addr",         
367a0 20 20 20 20 20 20 74 65 73 74 5f 69 6e 74 36 34        test_int64
367b0 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c  array_addr, 0 },
367c0 0a 20 20 20 20 20 7b 20 22 64 6f 75 62 6c 65 61  .     { "doublea
367d0 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20  rray_addr",     
367e0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 6f           test_do
367f0 75 62 6c 65 61 72 72 61 79 5f 61 64 64 72 2c 20  ublearray_addr, 
36800 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 78  0 },.     { "tex
36810 74 61 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20  tarray_addr",   
36820 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
36830 74 5f 74 65 78 74 61 72 72 61 79 5f 61 64 64 72  t_textarray_addr
36840 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
36850 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22  qlite3_bind_int"
36860 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
36870 65 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20  est_bind_int,   
36880 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
36890 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
368a0 6f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  oblob",         
368b0 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  test_bind_zerobl
368c0 6f 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ob, 0 },.     { 
368d0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65  "sqlite3_bind_ze
368e0 72 6f 62 6c 6f 62 36 34 22 2c 20 20 20 20 20 20  roblob64",      
368f0 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62   test_bind_zerob
36900 6c 6f 62 36 34 2c 20 30 20 7d 2c 0a 20 20 20 20  lob64, 0 },.    
36910 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
36920 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20  _int64",        
36930 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
36940 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20  t64,    0 },.   
36950 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
36960 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20  d_double",      
36970 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64       test_bind_d
36980 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20  ouble,   0 },.  
36990 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
369a0 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20  nd_null",       
369b0 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
369c0 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20  null     ,0 },. 
369d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
369e0 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20  ind_text",      
369f0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
36a00 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a  _text     ,0 },.
36a10 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36a20 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20  bind_text16",   
36a30 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
36a40 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c  d_text16   ,0 },
36a50 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
36a60 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20  _bind_blob",    
36a70 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
36a80 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d  nd_blob     ,0 }
36a90 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
36aa0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
36ab0 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62  _count",  test_b
36ac0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
36ad0 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  unt, 0},.     { 
36ae0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61  "sqlite3_bind_pa
36af0 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20  rameter_name",  
36b00 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
36b10 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a  eter_name,  0},.
36b20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36b30 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
36b40 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e  ndex",  test_bin
36b50 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
36b60 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  x, 0},.     { "s
36b70 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
36b80 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74  dings",        t
36b90 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  est_clear_bindin
36ba0 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  gs, 0},.     { "
36bb0 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20  sqlite3_sleep", 
36bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36bd0 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20  test_sleep,     
36be0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
36bf0 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65  "sqlite3_errcode
36c00 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
36c10 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20   test_errcode   
36c20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
36c30 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64   "sqlite3_extend
36c40 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20  ed_errcode",    
36c50 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64    test_ex_errcod
36c60 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  e    ,0 },.     
36c70 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
36c80 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  g",             
36c90 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20     test_errmsg  
36ca0 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
36cb0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
36cc0 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  sg16",          
36cd0 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31      test_errmsg1
36ce0 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  6      ,0 },.   
36cf0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
36d00 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
36d10 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20       test_open  
36d20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
36d30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
36d40 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20  en16",          
36d50 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31        test_open1
36d60 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  6        ,0 },. 
36d70 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
36d80 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20 20 20  pen_v2",        
36d90 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
36da0 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  _v2       ,0 },.
36db0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36dc0 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20  complete16",    
36dd0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d          test_com
36de0 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c  plete16    ,0 },
36df0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
36e00 5f 6e 6f 72 6d 61 6c 69 7a 65 22 2c 20 20 20 20  _normalize",    
36e10 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e 6f           test_no
36e20 72 6d 61 6c 69 7a 65 20 20 20 20 20 2c 30 20 7d  rmalize     ,0 }
36e30 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
36e40 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20  e3_prepare",    
36e50 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
36e60 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30  prepare       ,0
36e70 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
36e80 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20  te3_prepare16", 
36e90 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
36ea0 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c  _prepare16     ,
36eb0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
36ec0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22  ite3_prepare_v2"
36ed0 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
36ee0 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20  t_prepare_v2    
36ef0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
36f00 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 33  lite3_prepare_v3
36f10 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
36f20 73 74 5f 70 72 65 70 61 72 65 5f 76 33 20 20 20  st_prepare_v3   
36f30 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
36f40 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74  qlite3_prepare_t
36f50 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74  kt3134",       t
36f60 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
36f70 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  134, 0},.     { 
36f80 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
36f90 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  16_v2",         
36fa0 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
36fb0 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  v2  ,0 },.     {
36fc0 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   "sqlite3_finali
36fd0 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
36fe0 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20    test_finalize 
36ff0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
37000 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
37010 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20  status",        
37020 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61     test_stmt_sta
37030 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  tus   ,0 },.    
37040 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65   { "sqlite3_rese
37050 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
37060 20 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20      test_reset  
37070 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
37080 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70    { "sqlite3_exp
37090 69 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20  ired",          
370a0 20 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65       test_expire
370b0 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  d       ,0 },.  
370c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72     { "sqlite3_tr
370d0 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22  ansfer_bindings"
370e0 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73  ,     test_trans
370f0 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20  fer_bind ,0 },. 
37100 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
37110 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
37120 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e         test_chan
37130 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ges       ,0 },.
37140 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37150 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  step",          
37160 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65          test_ste
37170 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  p          ,0 },
37180 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37190 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20  _sql",          
371a0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71           test_sq
371b0 6c 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  l           ,0 }
371c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
371d0 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 22 2c  3_expanded_sql",
371e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 65            test_e
371f0 78 5f 73 71 6c 20 20 20 20 20 20 20 20 2c 30 20  x_sql        ,0 
37200 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
37210 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a  _ENABLE_NORMALIZ
37220 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
37230 33 5f 6e 6f 72 6d 61 6c 69 7a 65 64 5f 73 71 6c  3_normalized_sql
37240 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e  ",        test_n
37250 6f 72 6d 5f 73 71 6c 20 20 20 20 20 20 2c 30 20  orm_sql      ,0 
37260 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
37270 20 22 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73   "sqlite3_next_s
37280 74 6d 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  tmt",           
37290 20 20 74 65 73 74 5f 6e 65 78 74 5f 73 74 6d 74    test_next_stmt
372a0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
372b0 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
372c0 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20  readonly",      
372d0 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61     test_stmt_rea
372e0 64 6f 6e 6c 79 20 2c 30 20 7d 2c 0a 20 20 20 20  donly ,0 },.    
372f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74   { "sqlite3_stmt
37300 5f 62 75 73 79 22 2c 20 20 20 20 20 20 20 20 20  _busy",         
37310 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 62 75      test_stmt_bu
37320 73 79 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  sy     ,0 },.   
37330 20 20 7b 20 22 75 73 65 73 5f 73 74 6d 74 5f 6a    { "uses_stmt_j
37340 6f 75 72 6e 61 6c 22 2c 20 20 20 20 20 20 20 20  ournal",        
37350 20 20 20 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a       uses_stmt_j
37360 6f 75 72 6e 61 6c 20 2c 30 20 7d 2c 0a 0a 20 20  ournal ,0 },..  
37370 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65     { "sqlite3_re
37380 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20  lease_memory",  
37390 20 20 20 20 20 20 74 65 73 74 5f 72 65 6c 65 61        test_relea
373a0 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 20 20 20 30  se_memory,     0
373b0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
373c0 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  e3_db_release_me
373d0 6d 6f 72 79 22 2c 20 20 20 20 20 74 65 73 74 5f  mory",     test_
373e0 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
373f0 79 2c 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  y,  0},.     { "
37400 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
37410 66 6c 75 73 68 22 2c 20 20 20 20 20 20 20 20 20  flush",         
37420 74 65 73 74 5f 64 62 5f 63 61 63 68 65 66 6c 75  test_db_cacheflu
37430 73 68 2c 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  sh,      0},.   
37440 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 79 73    { "sqlite3_sys
37450 74 65 6d 5f 65 72 72 6e 6f 22 2c 20 20 20 20 20  tem_errno",     
37460 20 20 20 20 20 74 65 73 74 5f 73 79 73 74 65 6d       test_system
37470 5f 65 72 72 6e 6f 2c 20 20 20 20 20 20 20 30 7d  _errno,       0}
37480 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
37490 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20  3_db_filename", 
374a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 64            test_d
374b0 62 5f 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20  b_filename,     
374c0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
374d0 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
374e0 6c 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  ly",           t
374f0 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c  est_db_readonly,
37500 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
37510 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74   { "sqlite3_soft
37520 5f 68 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20  _heap_limit",   
37530 20 20 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65      test_soft_he
37540 61 70 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c  ap_limit,    0},
37550 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37560 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22  _thread_cleanup"
37570 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 74 68  ,        test_th
37580 72 65 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20  read_cleanup,   
37590 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
375a0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63  lite3_pager_refc
375b0 6f 75 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65  ounts",       te
375c0 73 74 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  st_pager_refcoun
375d0 74 73 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20  ts,    0},..    
375e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64   { "sqlite3_load
375f0 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20  _extension",    
37600 20 20 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78      test_load_ex
37610 74 65 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c  tension,     0},
37620 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37630 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
37640 65 6e 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e  ension", test_en
37650 61 62 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20  able_load,      
37660 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71    0},.     { "sq
37670 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
37680 65 73 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65  esult_codes", te
37690 73 74 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  st_extended_resu
376a0 6c 74 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20  lt_codes, 0},.  
376b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69     { "sqlite3_li
376c0 6d 69 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  mit",           
376d0 20 20 20 20 20 20 74 65 73 74 5f 6c 69 6d 69 74        test_limit
376e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
376f0 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62    0},.     { "db
37700 63 6f 6e 66 69 67 5f 6d 61 69 6e 64 62 6e 61 6d  config_maindbnam
37710 65 5f 69 63 65 63 75 62 65 22 2c 20 20 20 74 65  e_icecube",   te
37720 73 74 5f 64 62 63 6f 6e 66 69 67 5f 6d 61 69 6e  st_dbconfig_main
37730 64 62 6e 61 6d 65 5f 69 63 65 63 75 62 65 20 7d  dbname_icecube }
37740 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65 5f  ,..     { "save_
37750 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20  prng_state",    
37760 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65 5f             save_
37770 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20 30  prng_state,    0
37780 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73 74   },.     { "rest
37790 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  ore_prng_state",
377a0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73 74              rest
377b0 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  ore_prng_state, 
377c0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73  0 },.     { "res
377d0 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20  et_prng_state", 
377e0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73               res
377f0 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20  et_prng_state,  
37800 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61   0 },.     { "da
37810 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
37820 72 75 70 74 22 2c 20 20 20 20 20 20 20 20 64 61  rupt",        da
37830 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
37840 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  rupt, 0},.     {
37850 20 22 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62   "database_may_b
37860 65 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20 20  e_corrupt",     
37870 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62    database_may_b
37880 65 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a 20  e_corrupt, 0},. 
37890 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74      { "optimizat
378a0 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20 20  ion_control",   
378b0 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61 74         optimizat
378c0 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a  ion_control,0},.
378d0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
378e0 4e 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b 5f 77  N.     { "lock_w
378f0 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20  in32_file",     
37900 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
37910 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20 30 20  file_lock,    0 
37920 7d 2c 0a 20 20 20 20 20 7b 20 22 65 78 69 73 74  },.     { "exist
37930 73 5f 77 69 6e 33 32 5f 70 61 74 68 22 2c 20 20  s_win32_path",  
37940 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
37950 5f 65 78 69 73 74 73 5f 70 61 74 68 2c 20 20 30  _exists_path,  0
37960 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6e 64   },.     { "find
37970 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20  _win32_file",   
37980 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
37990 32 5f 66 69 6e 64 5f 66 69 6c 65 2c 20 20 20 20  2_find_file,    
379a0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 6c  0 },.     { "del
379b0 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c  ete_win32_file",
379c0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
379d0 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65 2c 20  32_delete_file, 
379e0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61   0 },.     { "ma
379f0 6b 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20 20  ke_win32_dir",  
37a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
37a10 6e 33 32 5f 6d 6b 64 69 72 2c 20 20 20 20 20 20  n32_mkdir,      
37a20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72    0 },.     { "r
37a30 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 22  emove_win32_dir"
37a40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77  ,              w
37a50 69 6e 33 32 5f 72 6d 64 69 72 2c 20 20 20 20 20  in32_rmdir,     
37a60 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20     0 },.#endif. 
37a70 20 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a 70 72      { "tcl_objpr
37a80 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  oc",            
37a90 20 20 20 20 20 20 20 72 75 6e 41 73 4f 62 6a 50         runAsObjP
37aa0 72 6f 63 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a  roc,       0 },.
37ab0 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  .     /* sqlite3
37ac0 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49 20  _column_*() API 
37ad0 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  */.     { "sqlit
37ae0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22  e3_column_count"
37af0 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ,          test_
37b00 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30  column_count  ,0
37b10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
37b20 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22 2c  te3_data_count",
37b30 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
37b40 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20 2c  _data_count    ,
37b50 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37b60 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
37b70 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
37b80 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20 20  t_column_type   
37b90 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
37ba0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
37bb0 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  b",           te
37bc0 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20  st_column_blob  
37bd0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
37be0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
37bf0 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 74  uble",         t
37c00 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  est_column_doubl
37c10 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  e ,0 },.     { "
37c20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
37c30 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 20  nt64",          
37c40 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  test_column_int6
37c50 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  4  ,0 },.     { 
37c60 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
37c70 74 65 78 74 22 2c 20 20 20 74 65 73 74 5f 73 74  text",   test_st
37c80 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a  mt_utf8,  (void*
37c90 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
37ca0 74 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20 22  text },.     { "
37cb0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
37cc0 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 73 74 6d  ame",   test_stm
37cd0 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a 29  t_utf8,  (void*)
37ce0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
37cf0 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ame },.     { "s
37d00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
37d10 74 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d 74  t",    test_stmt
37d20 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73  _int,   (void*)s
37d30 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
37d40 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  t  },.     { "sq
37d50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
37d60 65 73 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f  es",  test_stmt_
37d70 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73 71  int,   (void*)sq
37d80 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
37d90 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  es},.#ifndef SQL
37da0 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50  ITE_OMIT_DECLTYP
37db0 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  E.     { "sqlite
37dc0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
37dd0 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
37de0 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
37df0 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65  _column_decltype
37e00 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  },.#endif.#ifdef
37e10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
37e20 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b  OLUMN_METADATA.{
37e30 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
37e40 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 22 2c  _database_name",
37e50 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
37e60 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
37e70 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61  lumn_database_na
37e80 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f  me},.{ "sqlite3_
37e90 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
37ea0 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  e",test_stmt_utf
37eb0 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  8,(void*)sqlite3
37ec0 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
37ed0 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33 5f  me},.{ "sqlite3_
37ee0 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
37ef0 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  me",test_stmt_ut
37f00 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
37f10 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
37f20 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23  name},.#endif..#
37f30 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
37f40 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20  IT_UTF16.     { 
37f50 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
37f60 62 79 74 65 73 31 36 22 2c 20 74 65 73 74 5f 73  bytes16", test_s
37f70 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a 29  tmt_int, (void*)
37f80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
37f90 79 74 65 73 31 36 20 7d 2c 0a 20 20 20 20 20 7b  ytes16 },.     {
37fa0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
37fb0 5f 74 65 78 74 31 36 22 2c 20 20 74 65 73 74 5f  _text16",  test_
37fc0 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
37fd0 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
37fe0 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20 20  n_text16},.     
37ff0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
38000 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65 73 74  n_name16",  test
38010 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
38020 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
38030 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20 20  mn_name16},.    
38040 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65 6e   { "add_alignmen
38050 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
38060 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  s", add_alignmen
38070 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
38080 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69 66  s, 0      },.#if
38090 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
380a0 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b  _DECLTYPE.     {
380b0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
380c0 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 74 65 73  _decltype16",tes
380d0 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28 76 6f  t_stmt_utf16,(vo
380e0 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
380f0 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c 0a  mn_decltype16},.
38100 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
38110 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55  LITE_ENABLE_COLU
38120 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73 71  MN_METADATA.{"sq
38130 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
38140 61 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a 20  abase_name16",. 
38150 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
38160 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
38170 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65  _column_database
38180 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69  _name16},.{"sqli
38190 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65  te3_column_table
381a0 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73  _name16", test_s
381b0 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
381c0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
381d0 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a  _table_name16},.
381e0 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
381f0 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22 2c  _origin_name16",
38200 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
38210 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
38220 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
38230 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23  ame16},.#endif.#
38240 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
38250 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
38260 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73 74  lation_v2", test
38270 5f 63 72 65 61