/ Hex Artifact Content
Login

Artifact 5a199289e5d5a795f375db50223de1f9a2f7c3927de5c0c88a19f5134da8d56d:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 66 20 64  vdbeInt.h".#if d
0280: 65 66 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 53  efined(INCLUDE_S
0290: 51 4c 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20 20  QLITE_TCL_H).#  
02a0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 5f  include "sqlite_
02b0: 74 63 6c 2e 68 22 0a 23 65 6c 73 65 0a 23 20 20  tcl.h".#else.#  
02c0: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
02d0: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
02e0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
02f0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0300: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
0310: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73  copy of the firs
0320: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 71  t part of the Sq
0330: 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72 65  liteDb structure
0340: 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69 74   in .** tclsqlit
0350: 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69 74  e.c.  We need it
0360: 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74 68   here so that th
0370: 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  e get_sqlite_poi
0380: 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  nter routine.** 
0390: 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65 20  can extract the 
03a0: 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65 72  sqlite3* pointer
03b0: 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69 6e   from an existin
03c0: 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a 20  g Tcl SQLite.** 
03d0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
03e0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
03f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0400: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  };../*.** Conver
0410: 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65 64  t text generated
0420: 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f 6e   by the "%p" con
0430: 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 62  version format b
0440: 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f  ack into.** a po
0450: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
0460: 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49 6e   int testHexToIn
0470: 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28 20  t(int h){.  if( 
0480: 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27  h>='0' && h<='9'
0490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
04a0: 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20   - '0';.  }else 
04b0: 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68 3c  if( h>='a' && h<
04c0: 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75  ='f' ){.    retu
04d0: 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30 3b  rn h - 'a' + 10;
04e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
04f0: 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26 20  sert( h>='A' && 
0500: 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72 65  h<='F' );.    re
0510: 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20 31  turn h - 'A' + 1
0520: 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a 73  0;.  }.}.void *s
0530: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
0540: 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ptr(const char *
0550: 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  z){.  void *p;. 
0560: 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32   u64 v;.  u32 v2
0570: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30  ;.  if( z[0]=='0
0580: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29  ' && z[1]=='x' )
0590: 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  {.    z += 2;.  
05a0: 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  }.  v = 0;.  whi
05b0: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20  le( *z ){.    v 
05c0: 3d 20 28 76 3c 3c 34 29 20 2b 20 74 65 73 74 48  = (v<<4) + testH
05d0: 65 78 54 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20 20  exToInt(*z);.   
05e0: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   z++;.  }.  if( 
05f0: 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f  sizeof(p)==sizeo
0600: 66 28 76 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63  f(v) ){.    memc
0610: 70 79 28 26 70 2c 20 26 76 2c 20 73 69 7a 65 6f  py(&p, &v, sizeo
0620: 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f(p));.  }else{.
0630: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
0640: 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 32  of(p)==sizeof(v2
0650: 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28 75  ) );.    v2 = (u
0660: 33 32 29 76 3b 0a 20 20 20 20 6d 65 6d 63 70 79  32)v;.    memcpy
0670: 28 26 70 2c 20 26 76 32 2c 20 73 69 7a 65 6f 66  (&p, &v2, sizeof
0680: 28 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (p));.  }.  retu
0690: 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
06a0: 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 68  A TCL command th
06b0: 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  at returns the a
06c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 71  ddress of the sq
06d0: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 2a 2a  lite* pointer.**
06e0: 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 63   for an sqlite c
06f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 73 74 61 6e  onnection instan
0700: 63 65 2e 20 20 42 61 64 20 74 68 69 6e 67 73 20  ce.  Bad things 
0710: 68 61 70 70 65 6e 20 69 66 20 74 68 65 0a 2a 2a  happen if the.**
0720: 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 6e   input is not an
0730: 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69   sqlite connecti
0740: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
0750: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
0760: 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74  get_sqlite_point
0770: 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
0780: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
0790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
07a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
07b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
07c0: 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  [].){.  struct S
07d0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
07e0: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
07f0: 6f 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  o;.  char zBuf[1
0800: 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  00];.  if( objc!
0810: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
0820: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
0830: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 1, objv, "SQL
0840: 49 54 45 2d 43 4f 4e 4e 45 43 54 49 4f 4e 22 29  ITE-CONNECTION")
0850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
0860: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
0870: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
0880: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
0890: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
08a0: 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
08b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
08c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
08d0: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
08e0: 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  nd: ",.         
08f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
0900: 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
0910: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
0920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0930: 20 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c   p = (struct Sql
0940: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
0950: 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  bjClientData;.  
0960: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
0970: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
0980: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0990: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
09a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
09b0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
09c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
09d0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
09e0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
09f0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
0a00: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0a10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0a30: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0a40: 7b 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74  {.  struct Sqlit
0a50: 65 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d  eDb *p;.  Tcl_Cm
0a60: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
0a70: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
0a80: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
0a90: 7a 41 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  zA, &cmdInfo) ){
0aa0: 0a 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74  .    p = (struct
0ab0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
0ac0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
0ad0: 3b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 70 2d  ;.    *ppDb = p-
0ae0: 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >db;.  }else{.  
0af0: 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74    *ppDb = (sqlit
0b00: 65 33 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  e3*)sqlite3TestT
0b10: 65 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20  extToPtr(zA);.  
0b20: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
0b30: 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
0b40: 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 44 65  _OS_WIN./*.** De
0b50: 63 6f 64 65 20 61 20 57 69 6e 33 32 20 48 41 4e  code a Win32 HAN
0b60: 44 4c 45 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69  DLE object..*/.i
0b70: 6e 74 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c  nt getWin32Handl
0b80: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
0b90: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
0ba0: 20 2a 7a 41 2c 20 4c 50 48 41 4e 44 4c 45 20 70   *zA, LPHANDLE p
0bb0: 68 46 69 6c 65 29 7b 0a 20 20 2a 70 68 46 69 6c  hFile){.  *phFil
0bc0: 65 20 3d 20 28 48 41 4e 44 4c 45 29 73 71 6c 69  e = (HANDLE)sqli
0bd0: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
0be0: 28 7a 41 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (zA);.  return T
0bf0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
0c00: 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68  .extern const ch
0c10: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
0c20: 6d 65 28 69 6e 74 29 3b 0a 23 64 65 66 69 6e 65  me(int);.#define
0c30: 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c   t1ErrorName sql
0c40: 69 74 65 33 45 72 72 4e 61 6d 65 0a 0a 2f 2a 0a  ite3ErrName../*.
0c50: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71  ** Convert an sq
0c60: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f  lite3_stmt* into
0c70: 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54   an sqlite3*.  T
0c80: 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  his depends on t
0c90: 68 65 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20  he.** fact that 
0ca0: 74 68 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20  the sqlite3* is 
0cb0: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
0cc0: 69 6e 20 74 68 65 20 56 64 62 65 20 73 74 72 75  in the Vdbe stru
0cd0: 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cture..*/.#defin
0ce0: 65 20 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20  e StmtToDb(X)   
0cf0: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
0d00: 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e(X)../*.** Chec
0d10: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
0d20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
0d30: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
0d40: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
0d50: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0d60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0d70: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
0d80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0da0: 20 72 63 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   rc){.  if( sqli
0db0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
0dc0: 3d 3d 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ==0 && rc!=SQLIT
0dd0: 45 5f 4d 49 53 55 53 45 20 26 26 20 72 63 21 3d  E_MISUSE && rc!=
0de0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
0df0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e00: 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20 20 63  db)!=rc ){.    c
0e10: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
0e20: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
0e30: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
0e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
0e50: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
0e60: 66 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20  f), zBuf,.      
0e70: 20 22 65 72 72 6f 72 20 63 6f 64 65 20 25 73 20   "error code %s 
0e80: 28 25 64 29 20 64 6f 65 73 20 6e 6f 74 20 6d 61  (%d) does not ma
0e90: 74 63 68 20 73 71 6c 69 74 65 33 5f 65 72 72 63  tch sqlite3_errc
0ea0: 6f 64 65 20 25 73 20 28 25 64 29 22 2c 0a 20 20  ode %s (%d)",.  
0eb0: 20 20 20 20 20 74 31 45 72 72 6f 72 4e 61 6d 65       t1ErrorName
0ec0: 28 72 63 29 2c 20 72 63 2c 20 74 31 45 72 72 6f  (rc), rc, t1Erro
0ed0: 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29 3b 0a  rName(r2), r2);.
0ee0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0ef0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0f00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0f10: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0f20: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
0f30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0f50: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0f60: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
0f70: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
0f80: 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f 69 6e   int getStmtPoin
0f90: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
0fa0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
0fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
0fc0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
0fd0: 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a   **ppStmt.){.  *
0fe0: 70 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65  ppStmt = (sqlite
0ff0: 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65 33 54  3_stmt*)sqlite3T
1000: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 72  estTextToPtr(zAr
1010: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  g);.  return TCL
1020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
1030: 6e 65 72 61 74 65 20 61 20 74 65 78 74 20 72 65  nerate a text re
1040: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1050: 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 63  a pointer that c
1060: 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f 6f 64  an be understood
1070: 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74 44 62  .** by the getDb
1080: 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65 74 56  Pointer and getV
1090: 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65  mPointer routine
10a0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  s above..**.** T
10b0: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f  he problem is, o
10c0: 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20  n some machines 
10d0: 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79 6f 75  (Solaris) if you
10e0: 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77 69 74   do a printf wit
10f0: 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20 63 61  h.** "%p" you ca
1100: 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75 6e 64  nnot turn around
1110: 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e 66 20   and do a scanf 
1120: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 22 25  with the same "%
1130: 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f  p" and.** get yo
1140: 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e  ur pointer back.
1150: 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20 70 72    You have to pr
1160: 65 70 65 6e 64 20 61 20 22 30 78 22 20 62 65 66  epend a "0x" bef
1170: 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77  ore it will.** w
1180: 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65 61 73  ork.  Or at leas
1190: 74 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69  t that is what i
11a0: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
11b0: 20 28 64 72 68 29 2e 20 20 42 75 74 20 74 68 69   (drh).  But thi
11c0: 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20 76 61  s.** behavior va
11d0: 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e  ries from machin
11e0: 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54  e to machine.  T
11f0: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64  he solution used
1200: 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65   her is.** to te
1210: 73 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 69  st the string ri
1220: 67 68 74 20 61 66 74 65 72 20 69 74 20 69 73 20  ght after it is 
1230: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 65 65  generated to see
1240: 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a   if it can be.**
1250: 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79 20 73   understood by s
1260: 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74  canf, and if not
1270: 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69 6e 67  , try prepending
1280: 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65 65 20   an "0x" to see 
1290: 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c 70 73  if.** that helps
12a0: 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f  .  If nothing wo
12b0: 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65 72 72  rks, a fatal err
12c0: 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  or is generated.
12d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
12e0: 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
12f0: 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  r(Tcl_Interp *in
1300: 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50 74 72  terp, char *zPtr
1310: 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71  , void *p){.  sq
1320: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
1330: 30 30 2c 20 7a 50 74 72 2c 20 22 25 70 22 2c 20  00, zPtr, "%p", 
1340: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
1350: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1360: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
1370: 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 65  ne for sqlite3_e
1380: 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a 2a 2f  xec_printf()..*/
1390: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
13a0: 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69 64 20  _printf_cb(void 
13b0: 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67 63 2c  *pArg, int argc,
13c0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
13d0: 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54 63  ar **name){.  Tc
13e0: 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72 20 3d  l_DString *str =
13f0: 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a 29 70   (Tcl_DString*)p
1400: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  Arg;.  int i;.. 
1410: 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69 6e 67   if( Tcl_DString
1420: 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30 20 29  Length(str)==0 )
1430: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1440: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1450: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
1460: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c  pendElement(str,
1470: 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b   name[i] ? name[
1480: 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  i] : "NULL");.  
1490: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
14a0: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
14b0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
14c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
14d0: 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61 72 67  r, argv[i] ? arg
14e0: 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  v[i] : "NULL");.
14f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1500: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f  }../*.** The I/O
1510: 20 74 72 61 63 69 6e 67 20 63 61 6c 6c 62 61 63   tracing callbac
1520: 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  k..*/.#if !defin
1530: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
1540: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
1550: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
1560: 4f 54 52 41 43 45 29 0a 73 74 61 74 69 63 20 46  OTRACE).static F
1570: 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f 66 69 6c  ILE *iotrace_fil
1580: 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f  e = 0;.static vo
1590: 69 64 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c  id io_trace_call
15a0: 62 61 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  back(const char 
15b0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
15c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
15d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
15e0: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
15f0: 66 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 2c 20  f(iotrace_file, 
1600: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1610: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 66  va_end(ap);.  ff
1620: 6c 75 73 68 28 69 6f 74 72 61 63 65 5f 66 69 6c  lush(iotrace_fil
1630: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e);.}.#endif../*
1640: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f 5f 74  .** Usage:  io_t
1650: 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a  race FILENAME.**
1660: 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74 72 61  .** Turn I/O tra
1670: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  cing on or off. 
1680: 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20   If FILENAME is 
1690: 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72  not an empty str
16a0: 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72 61 63  ing,.** I/O trac
16b0: 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69 6e 67  ing begins going
16c0: 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45 2e 20   into FILENAME. 
16d0: 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20 61  If FILENAME is a
16e0: 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e  n empty.** strin
16f0: 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 69  g, I/O tracing i
1700: 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  s turned off..*/
1710: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1720: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69  TE_TCLAPI test_i
1730: 6f 5f 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20  o_trace(.  void 
1740: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1750: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1760: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1770: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1780: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1790: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
17a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
17b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
17c0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
17d0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
17e0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
17f0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1800: 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
1810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1820: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1830: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
1840: 43 45 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d  CE).  if( argc!=
1850: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1860: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1870: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1880: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1890: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
18a0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
18b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18d0: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18e0: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f  le ){.    if( io
18f0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f  trace_file!=stdo
1900: 75 74 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69  ut && iotrace_fi
1910: 6c 65 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20  le!=stderr ){.  
1920: 20 20 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61      fclose(iotra
1930: 63 65 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  ce_file);.    }.
1940: 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65      iotrace_file
1950: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1960: 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
1970: 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b  }.  if( argv[1][
1980: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  0] ){.    if( st
1990: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74  rcmp(argv[1],"st
19a0: 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  dout")==0 ){.   
19b0: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
19c0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
19d0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
19e0: 72 67 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29  rgv[1],"stderr")
19f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74  ==0 ){.      iot
1a00: 72 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65  race_file = stde
1a10: 72 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rr;.    }else{. 
1a20: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
1a30: 65 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31  e = fopen(argv[1
1a40: 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20  ], "w");.    }. 
1a50: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
1a60: 65 20 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c  e = io_trace_cal
1a70: 6c 62 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  lback;.  }.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1a90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1aa0: 65 3a 20 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69  e:  clang_saniti
1ab0: 7a 65 5f 61 64 64 72 65 73 73 20 0a 2a 2a 0a 2a  ze_address .**.*
1ac0: 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69  * Returns true i
1ad0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 77 61  f the program wa
1ae0: 73 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67  s compiled using
1af0: 20 63 6c 61 6e 67 20 77 69 74 68 20 74 68 65 20   clang with the 
1b00: 0a 2a 2a 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61  .** -fsanitize=a
1b10: 64 64 72 65 73 73 20 73 77 69 74 63 68 20 6f 6e  ddress switch on
1b20: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1b30: 65 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  e. False otherwi
1b40: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  se..**.** Also r
1b50: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1b60: 65 20 4f 4d 49 54 5f 4d 49 53 55 53 45 20 65 6e  e OMIT_MISUSE en
1b70: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1b80: 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74  le exists..*/.st
1b90: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1ba0: 54 43 4c 41 50 49 20 63 6c 61 6e 67 5f 73 61 6e  TCLAPI clang_san
1bb0: 69 74 69 7a 65 5f 61 64 64 72 65 73 73 28 0a 20  itize_address(. 
1bc0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
1bd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1be0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1bf0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1c00: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1c10: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1c20: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
1c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1c50: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
1c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
1c70: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
1c80: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  t */.){.  int re
1c90: 73 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e  s = 0;.#if defin
1ca0: 65 64 28 5f 5f 68 61 73 5f 66 65 61 74 75 72 65  ed(__has_feature
1cb0: 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f 66 65 61  ).# if __has_fea
1cc0: 74 75 72 65 28 61 64 64 72 65 73 73 5f 73 61 6e  ture(address_san
1cd0: 69 74 69 7a 65 72 29 0a 20 20 72 65 73 20 3d 20  itizer).  res = 
1ce0: 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  1;.# endif.#endi
1cf0: 66 0a 23 69 66 64 65 66 20 5f 5f 53 41 4e 49 54  f.#ifdef __SANIT
1d00: 49 5a 45 5f 41 44 44 52 45 53 53 5f 5f 0a 20 20  IZE_ADDRESS__.  
1d10: 72 65 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  res = 1;.#endif.
1d20: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
1d30: 67 65 74 65 6e 76 28 22 4f 4d 49 54 5f 4d 49 53  getenv("OMIT_MIS
1d40: 55 53 45 22 29 21 3d 30 20 29 20 72 65 73 20 3d  USE")!=0 ) res =
1d50: 20 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   1;.  Tcl_SetObj
1d60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73  cl_NewIntObj(res
1d80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1d90: 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20  _OK;.}.  ./*.** 
1da0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1db0: 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42 20  exec_printf  DB 
1dc0: 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a   FORMAT  STRING.
1dd0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
1de0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72   sqlite3_exec_pr
1df0: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
1e00: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
1e10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
1e20: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
1e30: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
1e40: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
1e50: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
1e60: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
1e70: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
1e80: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
1e90: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
1ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1eb0: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1ec0: 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20 76  exec_printf(.  v
1ed0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1ee0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ef0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1f00: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1f10: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1f20: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1f30: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
1f40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f60: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1f70: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
1f80: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
1f90: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1fa0: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
1fb0: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
1fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
1fd0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   0;.  char *zSql
1fe0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
1ff0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  ];.  if( argc!=4
2000: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2020: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2030: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2040: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2050: 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49  " DB FORMAT STRI
2060: 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  NG", 0);.    ret
2070: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2080: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2090: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
20a0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
20b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
20d0: 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20  t(&str);.  zSql 
20e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20f0: 66 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b  f(argv[2], argv[
2100: 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  3]);.  rc = sqli
2110: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2120: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
2130: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
2140: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2150: 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
2160: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2170: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
2180: 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41  d", rc);.  Tcl_A
2190: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
21a0: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  erp, zBuf);.  Tc
21b0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
21c0: 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49  interp, rc==SQLI
21d0: 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72  TE_OK ? Tcl_DStr
21e0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a  ingValue(&str) :
21f0: 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53   zErr);.  Tcl_DS
2200: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
2210: 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73 71  .  if( zErr ) sq
2220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
2230: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
2240: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
2250: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
2260: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2270: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2280: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
2290: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65   sqlite3_exec_he
22a0: 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a  x  DB  HEX.**.**
22b0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
22c0: 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61 20  te3_exec() on a 
22d0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6f  string that is o
22e0: 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e 73  btained by trans
22f0: 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69 6e  lating.** HEX in
2300: 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74 20  to ASCII.  Most 
2310: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 74  characters are t
2320: 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73 2e  ranslated as is.
2330: 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a 2a    %HH becomes.**
2340: 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65 72   a hex character
2350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2360: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2370: 73 74 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76  st_exec_hex(.  v
2380: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23a0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23b0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23c0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23d0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23e0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
23f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2400: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2410: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2420: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2430: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2440: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2450: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
2460: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
2470: 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a  , i, j;.  char *
2480: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zErr = 0;.  char
2490: 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a   *zHex;.  char z
24a0: 53 71 6c 5b 35 30 31 5d 3b 0a 20 20 63 68 61 72  Sql[501];.  char
24b0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
24c0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
24d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24e0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
24f0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2500: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2510: 0a 20 20 20 20 20 20 20 22 20 44 42 20 48 45 58  .       " DB HEX
2520: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2540: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2550: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2560: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2580: 7a 48 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  zHex = argv[2];.
2590: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 28    for(i=j=0; i<(
25a0: 73 69 7a 65 6f 66 28 7a 53 71 6c 29 2d 31 29 20  sizeof(zSql)-1) 
25b0: 26 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c  && zHex[j]; i++,
25c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   j++){.    if( z
25d0: 48 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a  Hex[j]=='%' && z
25e0: 48 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78  Hex[j+2] && zHex
25f0: 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a  [j+2] ){.      z
2600: 53 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65  Sql[i] = (testHe
2610: 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d  xToInt(zHex[j+1]
2620: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2630: 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b  oInt(zHex[j+2]);
2640: 0a 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20  .      j += 2;. 
2650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2660: 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a  zSql[i] = zHex[j
2670: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
2680: 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63  Sql[i] = 0;.  Tc
2690: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
26a0: 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  tr);.  rc = sqli
26b0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
26c0: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
26d0: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
26e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
26f0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
2700: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  , zBuf, "%d", rc
2710: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
2720: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
2730: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
2740: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2750: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
2760: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
2770: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
2780: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2790: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
27a0: 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f   zErr ) sqlite3_
27b0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66  free(zErr);.  if
27c0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
27d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
27e0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
27f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
2800: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2810: 2a 2a 20 55 73 61 67 65 3a 20 20 64 62 5f 65 6e  ** Usage:  db_en
2820: 74 65 72 20 44 42 0a 2a 2a 20 20 20 20 20 20 20  ter DB.**       
2830: 20 20 64 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a    db_leave DB.**
2840: 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c 65 61  .** Enter or lea
2850: 76 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ve the mutex on 
2860: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2870: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2880: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2890: 50 49 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76  PI db_enter(.  v
28a0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
28b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28c0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
28d0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
28e0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
28f0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2900: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2910: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2920: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2930: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2940: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2950: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2960: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2970: 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
2980: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
2990: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
29b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
29c0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
29d0: 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
29e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29f0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2a00: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2a10: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2a20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2a30: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OR;.  sqlite3_mu
2a40: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
2a50: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
2a60: 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  CL_OK;.}.static 
2a70: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2a80: 49 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  I db_leave(.  vo
2a90: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2aa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2ab0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2ac0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2ad0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2ae0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2af0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2b20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2b30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2b40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2b50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2b60: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
2b70: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
2b80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2b90: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2ba0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2bb0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2bc0: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2bd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2be0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2bf0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2c00: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2c10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c20: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
2c30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
2c40: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
2c50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2c60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2c70: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
2c80: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2c90: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2ca0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2cb0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2cd0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2ce0: 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _exec(.  void *N
2cf0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2d00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2d10: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2d20: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2d30: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2d40: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2d70: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2d80: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2d90: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2da0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2db0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2dc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
2dd0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
2de0: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2df0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
2e00: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
2e10: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2e20: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2e30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2e40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2e50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2e60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
2e70: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
2e80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2e90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ea0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2eb0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2ec0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2ed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
2ee0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
2ef0: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
2f00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2f10: 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  s", argv[2]);.  
2f20: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b  for(i=j=0; zSql[
2f30: 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i];){.    if( zS
2f40: 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20  ql[i]=='%' ){.  
2f50: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2f60: 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53  (testHexToInt(zS
2f70: 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74  ql[i+1])<<4) + t
2f80: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
2f90: 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20  [i+2]);.      i 
2fa0: 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  += 3;.    }else{
2fb0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
2fc0: 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20   = zSql[i++];.  
2fd0: 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a    }.  }.  zSql[j
2fe0: 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  ] = 0;.  rc = sq
2ff0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
3000: 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66  Sql, exec_printf
3010: 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  _cb, &str, &zErr
3020: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3030: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zSql);.  sqlit
3040: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3050: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
3060: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
3070: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3080: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3090: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
30a0: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
30b0: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
30c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
30d0: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
30e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
30f0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
3100: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
3110: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
3120: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
3130: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
3140: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3150: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3170: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
3180: 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a  nr  DB  SQL.**.*
3190: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
31a0: 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72 66  ite3_exec interf
31b0: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
31c0: 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  en database DB. 
31d0: 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c 20   Discard.** all 
31e0: 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74 69  results.*/.stati
31f0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
3200: 41 50 49 20 74 65 73 74 5f 65 78 65 63 5f 6e 72  API test_exec_nr
3210: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3220: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3230: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3240: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3250: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3260: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3270: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3290: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
32a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32c0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
32d0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
32e0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
32f0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
3300: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63   = 0;.  if( argc
3310: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
3320: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3330: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3340: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
3350: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
3360: 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29     " DB SQL", 0)
3370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3380: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3390: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
33a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
33b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
33c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
33d0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
33e0: 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20   argv[2], 0, 0, 
33f0: 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  &zErr);.  if( sq
3400: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
3410: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
3420: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3430: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
3440: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3450: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
3460: 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53  printf_z_test  S
3470: 45 50 41 52 41 54 4f 52 20 20 41 52 47 30 20 20  EPARATOR  ARG0  
3480: 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  ARG1 ....**.** T
3490: 65 73 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61  est the %z forma
34a0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
34b0: 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74  ntf().  Use mult
34c0: 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63  iple mprintf() c
34d0: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63  alls to .** conc
34e0: 61 74 65 6e 61 74 65 20 61 72 67 30 20 74 68 72  atenate arg0 thr
34f0: 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20  ough argn using 
3500: 73 65 70 61 72 61 74 6f 72 20 61 73 20 74 68 65  separator as the
3510: 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52   separator..** R
3520: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
3530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3540: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3550: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
3560: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3570: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3580: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3590: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
35a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
35b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
35c0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
35d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
35f0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3600: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3610: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3620: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
3630: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
3640: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
3650: 20 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32   i<argc && (i==2
3660: 20 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b   || zResult); i+
3670: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
3680: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3690: 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  f("%z%s%s", zRes
36a0: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
36b0: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
36c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
36d0: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
36e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
36f0: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
3700: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3710: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3720: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
3730: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
3740: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
3750: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
3760: 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74  _mprintf().  Ret
3770: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
3780: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
3790: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
37a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
37b0: 50 49 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  PI test_mprintf_
37c0: 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  n(.  void *NotUs
37d0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
37e0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
37f0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3800: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3810: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3820: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3840: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3850: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3860: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3870: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3880: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
3890: 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20  ar *zStr;.  int 
38a0: 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20  n = 0;.  zStr = 
38b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
38c0: 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c  "%s%n", argv[1],
38d0: 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   &n);.  sqlite3_
38e0: 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20 54 63  free(zStr);.  Tc
38f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
3900: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
3910: 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75  tObj(n));.  retu
3920: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
3930: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3940: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
3950: 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20 20 49    SIZE FORMAT  I
3960: 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  NT.**.** Test th
3970: 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 6e 70  e of sqlite3_snp
3980: 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e 65 2e  rintf() routine.
3990: 20 20 53 49 5a 45 20 69 73 20 74 68 65 20 73 69    SIZE is the si
39a0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ze of the.** out
39b0: 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
39c0: 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69 6d 75  tes.  The maximu
39d0: 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e 20 20  m size is 100.  
39e0: 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a  FORMAT is the.**
39f0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20   format string. 
3a00: 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67 6c 65   INT is a single
3a10: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
3a20: 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a  t.  The FORMAT.*
3a30: 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20 72 65  * string must re
3a40: 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68  quire no more th
3a50: 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e 74 65  an this one inte
3a60: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  ger argument.  I
3a70: 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20 69 6e  f.** You pass in
3a80: 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67   a format string
3a90: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6d   that requires m
3aa0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 72 67  ore than one arg
3ab0: 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68  ument,.** bad th
3ac0: 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70 65 6e  ings will happen
3ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3af0: 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28  st_snprintf_int(
3b00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3b10: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3b20: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3b30: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3b40: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3b50: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3b60: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3b80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3b90: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3bb0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3bc0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
3bd0: 20 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e   zStr[100];.  in
3be0: 74 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b  t n = atoi(argv[
3bf0: 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  1]);.  const cha
3c00: 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67  r *zFormat = arg
3c10: 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d  v[2];.  int a1 =
3c20: 20 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a   atoi(argv[3]);.
3c30: 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a    if( n>sizeof(z
3c40: 53 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f  Str) ) n = sizeo
3c50: 66 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  f(zStr);.  sqlit
3c60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3c70: 6f 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20  of(zStr), zStr, 
3c80: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
3c90: 70 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20  pqrstuvwxyz");. 
3ca0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3cb0: 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d  f(n, zStr, zForm
3cc0: 61 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41  at, a1);.  Tcl_A
3cd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3ce0: 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20  rp, zStr, 0);.  
3cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d10: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a  _OMIT_GET_TABLE.
3d20: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3d30: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
3d40: 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52  _printf  DB  FOR
3d50: 4d 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d  MAT  STRING  ?--
3d60: 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a  no-counts?.**.**
3d70: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
3d80: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3d90: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
3da0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
3db0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
3dc0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
3dd0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
3de0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
3df0: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
3e00: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
3e10: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
3e20: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
3e30: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
3e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
3e50: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
3e60: 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
3e70: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3e80: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3e90: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3ea0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3eb0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3ec0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3ed0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3ef0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3f20: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
3f30: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
3f40: 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f  ite3 *db;.  Tcl_
3f50: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69  DString str;.  i
3f60: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
3f70: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Err = 0;.  int n
3f80: 52 6f 77 20 3d 20 30 2c 20 6e 43 6f 6c 20 3d 20  Row = 0, nCol = 
3f90: 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73  0;.  char **aRes
3fa0: 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
3fb0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
3fc0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
3fd0: 6e 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31  nt resCount = -1
3fe0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3ff0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
4000: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
4010: 67 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74  gv[4], &resCount
4020: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4030: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4040: 61 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21  argc!=4 && argc!
4050: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
4060: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4070: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4080: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4090: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
40a0: 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54    " DB FORMAT ST
40b0: 52 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30  RING ?COUNT?", 0
40c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
40d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
40e0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
40f0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4100: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4110: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
4120: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4130: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
4140: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
4150: 5b 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20  [2],argv[3]);.  
4160: 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20  if( argc==5 ){. 
4170: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4180: 67 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53  get_table(db, zS
4190: 71 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c  ql, &aResult, 0,
41a0: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65   0, &zErr);.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
41c0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28  lite3_get_table(
41d0: 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75  db, zSql, &aResu
41e0: 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c  lt, &nRow, &nCol
41f0: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65  , &zErr);.    re
4200: 73 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31  sCount = (nRow+1
4210: 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71  )*nCol;.  }.  sq
4220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
4230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
4240: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
4250: 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72  ), zBuf, "%d", r
4260: 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  c);.  Tcl_Append
4270: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4280: 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
4290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
42a0: 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b    if( argc==4 ){
42b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
42c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
42d0: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22  Buf), zBuf, "%d"
42e0: 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54  , nRow);.      T
42f0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4300: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
4310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4320: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
4330: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
4340: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63   nCol);.      Tc
4350: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4360: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4370: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
4380: 3b 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b  ; i<resCount; i+
4390: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
43a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
43b0: 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f  rp, aResult[i] ?
43c0: 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e   aResult[i] : "N
43d0: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
43e0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
43f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4400: 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  rp, zErr);.  }. 
4410: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61   sqlite3_free_ta
4420: 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20  ble(aResult);.  
4430: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
4440: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
4450: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
4460: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
4470: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
4480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
4490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
44a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
44b0: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20  _OMIT_GET_TABLE 
44c0: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  */.../*.** Usage
44d0: 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  :  sqlite3_last_
44e0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a  insert_rowid DB.
44f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
4500: 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
4510: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
4520: 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74  nt insert..*/.st
4530: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
4540: 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 61 73 74  TCLAPI test_last
4550: 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20 2a  _rowid(.  void *
4560: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4570: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4580: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4590: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
45a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
45b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
45c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
45d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
45e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
45f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
4600: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4610: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
4630: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
4640: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
4650: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4660: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4670: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4680: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4690: 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c 20  gv[0], " DB\"", 
46a0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
46b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
46c0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
46d0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
46e0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
46f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
4700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4710: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
4720: 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65  , "%lld", sqlite
4730: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
4740: 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  wid(db));.  Tcl_
4750: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4760: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
4770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4780: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4790: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20  e:  sqlite3_key 
47a0: 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74  DB KEY.**.** Set
47b0: 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a   the codec key..
47c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
47d0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
47e0: 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _key(.  void *No
47f0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4800: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4810: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4820: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4830: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4840: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4860: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4870: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4880: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4890: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
48a0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23  argument */.){.#
48b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
48c0: 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
48d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
48e0: 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
48f0: 54 43 4c 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  TCL).  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  );.  sqlite3_key
4a20: 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  (db, zKey, nKey)
4a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4a40: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4a50: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4a60: 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a  e3_rekey DB KEY.
4a70: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
4a80: 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73   codec key..*/.s
4a90: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
4aa0: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 6b  _TCLAPI test_rek
4ab0: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4ac0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4ad0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4ae0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4af0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4b00: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4b10: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4b30: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4b40: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4b50: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4b60: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4b70: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
4b80: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
4b90: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4ba0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4bb0: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4bc0: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4bd0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4be0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4bf0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4c00: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4c10: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4c20: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4c30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4c40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4c50: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
4c60: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4c70: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4c80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
4c90: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4ca0: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4cb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4cc0: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4cd0: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4ce0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4cf0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4d00: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4d10: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4d20: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4d30: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
4d50: 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69  LITE_TCLAPI sqli
4d60: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20  te_test_close(. 
4d70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4d80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4d90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4da0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4db0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4dc0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4dd0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4df0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4e00: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4e20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4e30: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4e40: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
4e50: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
4e60: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
4e70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
4e80: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
4e90: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
4ea0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
4eb0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
4ec0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4ed0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4ee0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
4ef0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
4f00: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
4f10: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
4f20: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
4f30: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
4f40: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
4f50: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
4f60: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
4f70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
4f90: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
4fa0: 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65  2 DB.**.** Close
4fb0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  s the database o
4fc0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
4fd0: 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  _open..*/.static
4fe0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
4ff0: 50 49 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  PI sqlite_test_c
5000: 6c 6f 73 65 5f 76 32 28 0a 20 20 76 6f 69 64 20  lose_v2(.  void 
5010: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
5020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5030: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
5040: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
5050: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
5060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5070: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5090: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
50a0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
50b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
50c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
50d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
50e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
50f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
5100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5110: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
5120: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
5130: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
5140: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
5150: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
5160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5170: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
5180: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
5190: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
51a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
51b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
51c0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 3b 0a 20 20  close_v2(db);.  
51d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
51e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
51f0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
5200: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
5210: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5220: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5230: 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f  tion of the x_co
5240: 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f  alesce() functio
5250: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  n..** Return the
5260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
5270: 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5290: 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28  d t1_ifnullFunc(
52a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
52b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
52c0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
52d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
52e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
52f0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
5300: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
5310: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
5320: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
5330: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  v[i]) ){.      i
5340: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt n = sqlite3_v
5350: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
5360: 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i]);.      sqlit
5370: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5380: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
5390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
53a0: 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20  t(argv[i]),.    
53b0: 20 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f        n, SQLITE_
53c0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
53d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
53e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73   }.}../*.** Thes
53f0: 65 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74  e are test funct
5400: 69 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20  ions.    hex8() 
5410: 69 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61  interprets its a
5420: 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54  rgument as.** UT
5430: 46 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  F8 and returns a
5440: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20   hex encoding.  
5450: 68 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70  hex16le() interp
5460: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
5470: 74 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20  t.** as UTF16le 
5480: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
5490: 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  x encoding..*/.s
54a0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46  tatic void hex8F
54b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
54c0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
54d0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
54e0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
54f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5500: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5510: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
5520: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5530: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5540: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
5550: 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32  zeof(zBuf)/2 - 2
5560: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
5570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5580: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
5590: 29 2d 69 2a 32 2c 20 26 7a 42 75 66 5b 69 2a 32  )-i*2, &zBuf[i*2
55a0: 5d 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 29  ], "%02x", z[i])
55b0: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32  ;.  }.  zBuf[i*2
55c0: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
55d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20  _result_text(p, 
55e0: 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c  (char*)zBuf, -1,
55f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5600: 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  T);.}.#ifndef SQ
5610: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
5620: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 31  static void hex1
5630: 36 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  6Func(sqlite3_co
5640: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72  ntext *p, int ar
5650: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5660: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
5670: 73 74 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  st unsigned shor
5680: 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20  t int *z;.  int 
5690: 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34  i;.  char zBuf[4
56a0: 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  00];.  z = sqlit
56b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
56c0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
56d0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
56e0: 75 66 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69  uf)/4 - 4 && z[i
56f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
5700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5710: 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 34 2c 20  zeof(zBuf)-i*4, 
5720: 26 7a 42 75 66 5b 69 2a 34 5d 2c 22 25 30 34 78  &zBuf[i*4],"%04x
5730: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
5740: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d   }.  zBuf[i*4] =
5750: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
5760: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
5770: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
5780: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5790: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
57a0: 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74   A structure int
57b0: 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d  o which to accum
57c0: 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73  ulate text..*/.s
57d0: 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69  truct dstr {.  i
57e0: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53  nt nAlloc;  /* S
57f0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  pace allocated *
5800: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
5810: 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a   /* Space used *
5820: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
5830: 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f   /* The space */
5840: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .};../*.** Appen
5850: 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72  d text to a dstr
5860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5870: 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63  dstrAppend(struc
5880: 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74  t dstr *p, const
5890: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69   char *z, int di
58a0: 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  vider){.  int n 
58b0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
58c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
58d0: 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41   + n + 2 > p->nA
58e0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72  lloc ){.    char
58f0: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e   *zNew;.    p->n
5900: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
5910: 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20  c*2 + n + 200;. 
5920: 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65     zNew = sqlite
5930: 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  3_realloc(p->z, 
5940: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
5950: 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( zNew==0 ){. 
5960: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5970: 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d  e(p->z);.      m
5980: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5990: 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72  of(*p));.      r
59a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
59b0: 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20   p->z = zNew;.  
59c0: 7d 0a 20 20 69 66 28 20 64 69 76 69 64 65 72 20  }.  if( divider 
59d0: 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b  && p->nUsed>0 ){
59e0: 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73  .    p->z[p->nUs
59f0: 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b  ed++] = divider;
5a00: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
5a10: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a  ->z[p->nUsed], z
5a20: 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73  , n+1);.  p->nUs
5a30: 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  ed += n;.}../*.*
5a40: 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61  * Invoked for ea
5a50: 63 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d  ch callback from
5a60: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
5a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
5a80: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28  xecFuncCallback(
5a90: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
5aa0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
5ab0: 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73  gv, char **NotUs
5ac0: 65 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  ed){.  struct ds
5ad0: 74 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  tr *p = (struct 
5ae0: 64 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69  dstr*)pData;.  i
5af0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5b00: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
5b10: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d     if( argv[i]==
5b20: 30 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41  0 ){.      dstrA
5b30: 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c  ppend(p, "NULL",
5b40: 20 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   ' ');.    }else
5b50: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
5b60: 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27  nd(p, argv[i], '
5b70: 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   ');.    }.  }. 
5b80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5b90: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5ba0: 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69  on of the x_sqli
5bb0: 74 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69  te_exec() functi
5bc0: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
5bd0: 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69  on takes.** a si
5be0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e  ngle argument an
5bf0: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78  d attempts to ex
5c00: 65 63 75 74 65 20 74 68 61 74 20 61 72 67 75 6d  ecute that argum
5c10: 65 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e  ent as SQL code.
5c20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65  .** This is ille
5c30: 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73  gal and should s
5c40: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49  et the SQLITE_MI
5c50: 53 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65  SUSE flag on the
5c60: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
5c70: 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57   2004-Jan-07:  W
5c80: 65 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 74  e have changed t
5c90: 68 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c  his to make it l
5ca0: 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
5cb0: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
5cc0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e  rom within a fun
5cd0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a  ction call.  .**
5ce0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
5cf0: 65 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20  e simulates the 
5d00: 65 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67  effect of having
5d10: 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 74   two threads att
5d20: 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74  empt to.** use t
5d30: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5d40: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5d50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5d60: 64 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  d sqlite3ExecFun
5d70: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5d80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
5d90: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
5da0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5db0: 61 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74  argv.){.  struct
5dc0: 20 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65   dstr x;.  memse
5dd0: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
5de0: 78 29 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  x));.  (void)sql
5df0: 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74  ite3_exec((sqlit
5e00: 65 33 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  e3*)sqlite3_user
5e10: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a  _data(context),.
5e20: 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
5e30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5e40: 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20  argv[0]),.      
5e50: 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b  execFuncCallback
5e60: 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , &x, 0);.  sqli
5e70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5e80: 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e  context, x.z, x.
5e90: 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52  nUsed, SQLITE_TR
5ea0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
5eb0: 74 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d  te3_free(x.z);.}
5ec0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
5ed0: 74 61 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31  tation of tkt221
5ee0: 33 66 75 6e 63 28 29 2c 20 61 20 73 63 61 6c 61  3func(), a scala
5ef0: 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  r function that 
5f00: 74 61 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a  takes exactly.**
5f10: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20 49   one argument. I
5f20: 74 20 68 61 73 20 74 77 6f 20 69 6e 74 65 72 65  t has two intere
5f30: 73 74 69 6e 67 20 66 65 61 74 75 72 65 73 3a 0a  sting features:.
5f40: 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73  **.** * It calls
5f50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5f60: 65 78 74 28 29 20 33 20 74 69 6d 65 73 20 6f 6e  ext() 3 times on
5f70: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 73 71   the argument sq
5f80: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a  lite3_value*..**
5f90: 20 20 20 49 66 20 74 68 65 20 74 68 72 65 65 20     If the three 
5fa0: 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65  pointers returne
5fb0: 64 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  d are not the sa
5fc0: 6d 65 20 61 6e 20 53 51 4c 20 65 72 72 6f 72 20  me an SQL error 
5fd0: 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a  is raised..**.**
5fe0: 20 2a 20 4f 74 68 65 72 77 69 73 65 20 69 74 20   * Otherwise it 
5ff0: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
6000: 66 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  f the text repre
6010: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74 73  sentation of its
6020: 20 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20   .**   argument 
6030: 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
6040: 20 74 68 65 20 56 44 42 45 20 72 65 70 72 65 73   the VDBE repres
6050: 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 4d 65  entation is a Me
6060: 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69  m* cell .**   wi
6070: 74 68 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20  th the MEM_Term 
6080: 66 6c 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a  flag clear. .**.
6090: 2a 2a 20 54 69 63 6b 65 74 20 23 32 32 31 33 20  ** Ticket #2213 
60a0: 63 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65  can therefore be
60b0: 20 74 65 73 74 65 64 20 62 79 20 65 76 61 6c 75   tested by evalu
60c0: 61 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  ating the follow
60d0: 69 6e 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65  ing.** SQL expre
60e0: 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74  ssion:.**.**   t
60f0: 6b 74 32 32 31 33 66 75 6e 63 28 74 6b 74 32 32  kt2213func(tkt22
6100: 31 33 66 75 6e 63 28 27 61 20 73 74 72 69 6e 67  13func('a string
6110: 27 29 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '));.*/.static v
6120: 6f 69 64 20 74 6b 74 32 32 31 33 46 75 6e 63 74  oid tkt2213Funct
6130: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
6140: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6150: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a   .  int argc,  .
6160: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6170: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
6180: 6e 54 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65  nText;.  unsigne
6190: 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  d char const *zT
61a0: 65 78 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ext1;.  unsigned
61b0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65   char const *zTe
61c0: 78 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt2;.  unsigned 
61d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78  char const *zTex
61e0: 74 33 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73  t3;..  nText = s
61f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6200: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  es(argv[0]);.  z
6210: 54 65 78 74 31 20 3d 20 73 71 6c 69 74 65 33 5f  Text1 = sqlite3_
6220: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6230: 30 5d 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20  0]);.  zText2 = 
6240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6250: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
6260: 54 65 78 74 33 20 3d 20 73 71 6c 69 74 65 33 5f  Text3 = sqlite3_
6270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6280: 30 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78  0]);..  if( zTex
6290: 74 31 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54  t1!=zText2 || zT
62a0: 65 78 74 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a  ext2!=zText3 ){.
62b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
62c0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
62d0: 2c 20 22 74 6b 74 32 32 31 33 20 69 73 20 6e 6f  , "tkt2213 is no
62e0: 74 20 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20  t fixed", -1);. 
62f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
6300: 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20   *zCopy = (char 
6310: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6320: 28 6e 54 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d  (nText);.    mem
6330: 63 70 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74  cpy(zCopy, zText
6340: 31 2c 20 6e 54 65 78 74 29 3b 0a 20 20 20 20 73  1, nText);.    s
6350: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6360: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70  xt(context, zCop
6370: 79 2c 20 6e 54 65 78 74 2c 20 73 71 6c 69 74 65  y, nText, sqlite
6380: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
6390: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
63a0: 69 6e 67 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ing SQL function
63b0: 20 74 61 6b 65 73 20 34 20 61 72 67 75 6d 65 6e   takes 4 argumen
63c0: 74 73 2e 20 20 54 68 65 20 32 6e 64 20 61 6e 64  ts.  The 2nd and
63d0: 0a 2a 2a 20 34 74 68 20 61 72 67 75 6d 65 6e 74  .** 4th argument
63e0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
63f0: 74 68 65 73 65 20 73 74 72 69 6e 67 73 3a 20 20  these strings:  
6400: 27 74 65 78 74 27 2c 20 27 74 65 78 74 31 36 27  'text', 'text16'
6410: 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63  ,.** or 'blob' c
6420: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6430: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  API functions.**
6440: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
6450: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a  _value_text().**
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20  lue_text16().** 
6480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6490: 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20  ue_blob().**.** 
64a0: 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
64b0: 6e 74 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  nt is a string, 
64c0: 65 69 74 68 65 72 20 27 62 79 74 65 73 27 20 6f  either 'bytes' o
64d0: 72 20 27 62 79 74 65 73 31 36 27 20 6f 72 20 27  r 'bytes16' or '
64e0: 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73  noop',.** corres
64f0: 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 73 3a  ponding to APIs:
6500: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
6510: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6520: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6530: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
6540: 29 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a  ).**      noop.*
6550: 2a 0a 2a 2a 20 54 68 65 20 41 50 49 73 20 64 65  *.** The APIs de
6560: 73 69 67 6e 61 74 65 64 20 62 79 20 74 68 65 20  signated by the 
6570: 32 6e 64 20 74 68 72 6f 75 67 68 20 34 74 68 20  2nd through 4th 
6580: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
6590: 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  plied.** to the 
65a0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
65b0: 6e 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 65  n order.  If the
65c0: 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e   pointers return
65d0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 65 63  ed by the.** sec
65e0: 6f 6e 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61  ond and fourth a
65f0: 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68  re different, th
6600: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6610: 6e 73 20 31 2e 20 20 4f 74 68 65 72 77 69 73 65  ns 1.  Otherwise
6620: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
6630: 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a  e returns 0..**.
6640: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6650: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
6660: 20 74 6f 20 73 65 65 20 77 68 65 6e 20 72 65 74   to see when ret
6670: 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 73 20 66  urned pointers f
6680: 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74  rom.** the _text
6690: 28 29 2c 20 5f 74 65 78 74 31 36 28 29 20 61 6e  (), _text16() an
66a0: 64 20 5f 62 6c 6f 62 28 29 20 41 50 49 73 20 62  d _blob() APIs b
66b0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74 65  ecome invalidate
66c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
66d0: 64 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f  d ptrChngFunctio
66e0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
66f0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
6700: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
6710: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6720: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
6730: 76 6f 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20  void *p1, *p2;. 
6740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
6750: 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  d;.  if( argc!=4
6760: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d   ) return;.  zCm
6770: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6780: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6790: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
67a0: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
67b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
67c0: 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d  mp(zCmd,"text")=
67d0: 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28  =0 ){.    p1 = (
67e0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
67f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6800: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
6820: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
6830: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78  trcmp(zCmd, "tex
6840: 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t16")==0 ){.    
6850: 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p1 = (const void
6860: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6870: 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b  text16(argv[0]);
6880: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6890: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
68a0: 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20   "blob")==0 ){. 
68b0: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
68c0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
68d0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
68e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
68f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d  eturn;.  }.  zCm
6900: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6910: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6920: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
6930: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
6940: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
6950: 6d 70 28 7a 43 6d 64 2c 22 62 79 74 65 73 22 29  mp(zCmd,"bytes")
6960: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6970: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
6980: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6990: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
69a0: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
69b0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74  trcmp(zCmd, "byt
69c0: 65 73 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  es16")==0 ){.   
69d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
69e0: 79 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b  ytes16(argv[0]);
69f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6a00: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6a10: 20 22 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20   "noop")==0 ){. 
6a20: 20 20 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67     /* do nothing
6a30: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
6a40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
6a50: 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Cmd = (const cha
6a60: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6a70: 5f 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a  _text(argv[3]);.
6a80: 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20    if( zCmd==0 ) 
6a90: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74  return;.  if( st
6aa0: 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22  rcmp(zCmd,"text"
6ab0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d  )==0 ){.    p2 =
6ac0: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6ad0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6ae0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64  (argv[0]);.#ifnd
6af0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
6b00: 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28  TF16.  }else if(
6b10: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74   strcmp(zCmd, "t
6b20: 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20  ext16")==0 ){.  
6b30: 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p2 = (const vo
6b40: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
6b50: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
6b60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
6b70: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
6b80: 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b  d, "blob")==0 ){
6b90: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6ba0: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6bb0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
6bc0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
6bd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
6be0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6bf0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70  t(context, p1!=p
6c00: 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  2);.}../*.** Thi
6c10: 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72  s SQL function r
6c20: 65 74 75 72 6e 73 20 61 20 64 69 66 66 65 72 65  eturns a differe
6c30: 6e 74 20 61 6e 73 77 65 72 20 65 61 63 68 20 74  nt answer each t
6c40: 69 6d 65 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ime it is called
6c50: 2c 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  , even if.** the
6c60: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74   arguments are t
6c70: 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
6c80: 69 63 20 76 6f 69 64 20 6e 6f 6e 64 65 74 65 72  ic void nondeter
6c90: 6d 69 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e  ministicFunction
6ca0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6cb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6cc0: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
6cd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6ce0: 72 67 76 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  rgv.){.  static 
6cf0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 73  int cnt = 0;.  s
6d00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6d10: 74 28 63 6f 6e 74 65 78 74 2c 20 63 6e 74 2b 2b  t(context, cnt++
6d20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
6d30: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72 65   SQL function re
6d40: 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65 67 65  turns the intege
6d50: 72 20 76 61 6c 75 65 20 6f 66 20 69 74 73 20 61  r value of its a
6d60: 72 67 75 6d 65 6e 74 20 61 73 20 61 20 4d 45 4d  rgument as a MEM
6d70: 5f 49 6e 74 52 65 61 6c 0a 2a 2a 20 76 61 6c 75  _IntReal.** valu
6d80: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
6d90: 64 20 69 6e 74 72 65 61 6c 46 75 6e 63 74 69 6f  d intrealFunctio
6da0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
6db0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
6dc0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
6dd0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6de0: 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65  argv.){.  sqlite
6df0: 33 5f 69 6e 74 36 34 20 76 20 3d 20 73 71 6c 69  3_int64 v = sqli
6e00: 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28  te3_value_int64(
6e10: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 73 71 6c 69  argv[0]);.  sqli
6e20: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
6e30: 28 63 6f 6e 74 65 78 74 2c 20 76 29 3b 0a 20 20  (context, v);.  
6e40: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
6e50: 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
6e60: 43 54 52 4c 5f 52 45 53 55 4c 54 5f 49 4e 54 52  CTRL_RESULT_INTR
6e70: 45 41 4c 2c 20 63 6f 6e 74 65 78 74 29 3b 0a 7d  EAL, context);.}
6e80: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
6e90: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
6ea0: 75 6e 63 74 69 6f 6e 20 44 42 0a 2a 2a 0a 2a 2a  unction DB.**.**
6eb0: 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65   Call the sqlite
6ec0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
6ed0: 6e 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76  n API on the giv
6ee0: 65 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f  en database in o
6ef0: 72 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74  rder.** to creat
6f00: 65 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  e a function nam
6f10: 65 64 20 22 78 5f 63 6f 61 6c 65 73 63 65 22 2e  ed "x_coalesce".
6f20: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
6f30: 64 6f 65 73 20 74 68 65 20 73 61 6d 65 20 74 68  does the same th
6f40: 69 6e 67 0a 2a 2a 20 61 73 20 74 68 65 20 22 63  ing.** as the "c
6f50: 6f 61 6c 65 73 63 65 22 20 66 75 6e 63 74 69 6f  oalesce" functio
6f60: 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f  n.  This functio
6f70: 6e 20 61 6c 73 6f 20 72 65 67 69 73 74 65 72 73  n also registers
6f80: 20 61 6e 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e   an SQL function
6f90: 0a 2a 2a 20 6e 61 6d 65 64 20 22 78 5f 73 71 6c  .** named "x_sql
6fa0: 69 74 65 5f 65 78 65 63 22 20 74 68 61 74 20 69  ite_exec" that i
6fb0: 6e 76 6f 6b 65 73 20 73 71 6c 69 74 65 33 5f 65  nvokes sqlite3_e
6fc0: 78 65 63 28 29 2e 20 20 49 6e 76 6f 6b 69 6e 67  xec().  Invoking
6fd0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
6fe0: 2a 2a 20 69 6e 20 74 68 69 73 20 77 61 79 20 69  ** in this way i
6ff0: 73 20 69 6c 6c 65 67 61 6c 20 72 65 63 75 72 73  s illegal recurs
7000: 69 6f 6e 20 61 6e 64 20 73 68 6f 75 6c 64 20 72  ion and should r
7010: 61 69 73 65 20 61 6e 20 53 51 4c 49 54 45 5f 4d  aise an SQLITE_M
7020: 49 53 55 53 45 20 65 72 72 6f 72 2e 0a 2a 2a 20  ISUSE error..** 
7030: 54 68 65 20 65 66 66 65 63 74 20 69 73 20 73 69  The effect is si
7040: 6d 69 6c 61 72 20 74 6f 20 74 72 79 69 6e 67 20  milar to trying 
7050: 74 6f 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  to use the same 
7060: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
7070: 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20 74 77 6f 20  ion from.** two 
7080: 74 68 72 65 61 64 73 20 61 74 20 74 68 65 20 73  threads at the s
7090: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
70a0: 54 68 65 20 6f 72 69 67 69 6e 61 6c 20 6d 6f 74  The original mot
70b0: 69 76 61 74 69 6f 6e 20 66 6f 72 20 74 68 69 73  ivation for this
70c0: 20 72 6f 75 74 69 6e 65 20 77 61 73 20 74 6f 20   routine was to 
70d0: 62 65 20 61 62 6c 65 20 74 6f 20 63 61 6c 6c 20  be able to call 
70e0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63  the.** sqlite3_c
70f0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 66  reate_function f
7100: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 61 20  unction while a 
7110: 71 75 65 72 79 20 69 73 20 69 6e 20 70 72 6f 67  query is in prog
7120: 72 65 73 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  ress in order.**
7130: 20 74 6f 20 74 65 73 74 20 74 68 65 20 53 51 4c   to test the SQL
7140: 49 54 45 5f 4d 49 53 55 53 45 20 64 65 74 65 63  ITE_MISUSE detec
7150: 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73  tion logic..*/.s
7160: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
7170: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 72 65  _TCLAPI test_cre
7180: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
7190: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
71a0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
71b0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
71c0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
71d0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
71e0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
71f0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
7200: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
7210: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
7220: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
7230: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
7240: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
7250: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
7260: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
7270: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
7280: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
7290: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
72a0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
72b0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
72c0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44  v[0],.       " D
72d0: 42 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  B\"", 0);.    re
72e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
72f0: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
7300: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
7310: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
7320: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7330: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
7340: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
7350: 64 62 2c 20 22 78 5f 63 6f 61 6c 65 73 63 65 22  db, "x_coalesce"
7360: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
7370: 38 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20 74  8, 0, .        t
7380: 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 2c 20 30 2c  1_ifnullFunc, 0,
7390: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53   0);.  if( rc==S
73a0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
73b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
73c0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
73d0: 20 22 68 65 78 38 22 2c 20 31 2c 20 53 51 4c 49   "hex8", 1, SQLI
73e0: 54 45 5f 55 54 46 38 20 7c 20 53 51 4c 49 54 45  TE_UTF8 | SQLITE
73f0: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a  _DETERMINISTIC,.
7400: 20 20 20 20 20 20 20 20 20 20 30 2c 20 68 65 78            0, hex
7410: 38 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  8Func, 0, 0);.  
7420: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7430: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69 66  _OMIT_UTF16.  if
7440: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7450: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
7460: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
7470: 69 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22 2c  ion(db, "hex16",
7480: 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
7490: 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d   | SQLITE_DETERM
74a0: 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20  INISTIC,.       
74b0: 20 20 20 30 2c 20 68 65 78 31 36 46 75 6e 63 2c     0, hex16Func,
74c0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
74d0: 69 66 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  if.  if( rc==SQL
74e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
74f0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
7500: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
7510: 74 6b 74 32 32 31 33 66 75 6e 63 22 2c 20 31 2c  tkt2213func", 1,
7520: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
7530: 0a 20 20 20 20 20 20 20 20 20 20 74 6b 74 32 32  .          tkt22
7540: 31 33 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  13Function, 0, 0
7550: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
7560: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7570: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
7580: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
7590: 62 2c 20 22 70 6f 69 6e 74 65 72 5f 63 68 61 6e  b, "pointer_chan
75a0: 67 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 41  ge", 4, SQLITE_A
75b0: 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20 20 20  NY, 0, .        
75c0: 20 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f    ptrChngFunctio
75d0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  n, 0, 0);.  }.. 
75e0: 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 63 6f   /* Functions co
75f0: 75 6e 74 65 72 31 28 29 20 61 6e 64 20 63 6f 75  unter1() and cou
7600: 6e 74 65 72 32 28 29 20 68 61 76 65 20 74 68 65  nter2() have the
7610: 20 73 61 6d 65 20 69 6d 70 6c 65 6d 65 6e 74 61   same implementa
7620: 74 69 6f 6e 20 2d 20 74 68 65 79 0a 20 20 2a 2a  tion - they.  **
7630: 20 62 6f 74 68 20 72 65 74 75 72 6e 20 61 6e 20   both return an 
7640: 61 73 63 65 6e 64 69 6e 67 20 69 6e 74 65 67 65  ascending intege
7650: 72 20 77 69 74 68 20 65 61 63 68 20 63 61 6c 6c  r with each call
7660: 2e 20 20 42 75 74 20 63 6f 75 6e 74 65 72 31 28  .  But counter1(
7670: 29 20 69 73 20 6d 61 72 6b 65 64 0a 20 20 2a 2a  ) is marked.  **
7680: 20 61 73 20 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e   as non-determin
7690: 69 73 74 69 63 20 61 6e 64 20 63 6f 75 6e 74 65  istic and counte
76a0: 72 32 28 29 20 69 73 20 6d 61 72 6b 65 64 20 61  r2() is marked a
76b0: 73 20 64 65 74 65 72 6d 69 6e 69 73 74 69 63 2e  s deterministic.
76c0: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
76d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
76e0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
76f0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7700: 2c 20 22 63 6f 75 6e 74 65 72 31 22 2c 20 2d 31  , "counter1", -1
7710: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20  , SQLITE_UTF8,. 
7720: 20 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64           0, nond
7730: 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63  eterministicFunc
7740: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tion, 0, 0);.  }
7750: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7760: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7770: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7780: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f  function(db, "co
7790: 75 6e 74 65 72 32 22 2c 20 2d 31 2c 20 53 51 4c  unter2", -1, SQL
77a0: 49 54 45 5f 55 54 46 38 7c 53 51 4c 49 54 45 5f  ITE_UTF8|SQLITE_
77b0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20  DETERMINISTIC,. 
77c0: 20 20 20 20 20 20 20 20 20 30 2c 20 6e 6f 6e 64           0, nond
77d0: 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63  eterministicFunc
77e0: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tion, 0, 0);.  }
77f0: 0a 0a 20 20 2f 2a 20 54 68 65 20 69 6e 74 72 65  ..  /* The intre
7800: 61 6c 28 29 20 66 75 6e 63 74 69 6f 6e 20 63 6f  al() function co
7810: 6e 76 65 72 74 73 20 69 74 73 20 61 72 67 75 6d  nverts its argum
7820: 65 6e 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65  ent to an intege
7830: 72 20 61 6e 64 20 72 65 74 75 72 6e 73 0a 20 20  r and returns.  
7840: 2a 2a 20 69 74 20 61 73 20 61 20 4d 45 4d 5f 49  ** it as a MEM_I
7850: 6e 74 52 65 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69  ntReal..  */.  i
7860: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7870: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
7880: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
7890: 74 69 6f 6e 28 64 62 2c 20 22 69 6e 74 72 65 61  tion(db, "intrea
78a0: 6c 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  l", 1, SQLITE_UT
78b0: 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c  F8,.          0,
78c0: 20 69 6e 74 72 65 61 6c 46 75 6e 63 74 69 6f 6e   intrealFunction
78d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69  , 0, 0);.  }..#i
78e0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
78f0: 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 55 73 65  T_UTF16.  /* Use
7900: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
7910: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29  ate_function16()
7920: 20 41 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c   API here. Mainl
7930: 79 20 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61  y for fun, but a
7940: 6c 73 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73  lso .  ** becaus
7950: 65 20 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74  e it is not test
7960: 65 64 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65  ed anywhere else
7970: 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
7980: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7990: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66  const void *zUtf
79a0: 31 36 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  16;.    sqlite3_
79b0: 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20  value *pVal;.   
79c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
79d0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
79e0: 0a 20 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  .    pVal = sqli
79f0: 74 65 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b  te3ValueNew(db);
7a00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
7a10: 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
7a20: 2c 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  , "x_sqlite_exec
7a30: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
7a40: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
7a50: 20 20 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c      zUtf16 = sql
7a60: 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70 56  ite3ValueText(pV
7a70: 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  al, SQLITE_UTF16
7a80: 4e 41 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28  NATIVE);.    if(
7a90: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
7aa0: 64 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  d ){.      rc = 
7ab0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
7ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
7ad0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
7ae0: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 64 62  te_function16(db
7af0: 2c 20 7a 55 74 66 31 36 2c 20 0a 20 20 20 20 20  , zUtf16, .     
7b00: 20 20 20 20 20 20 20 20 20 20 20 31 2c 20 53 51             1, SQ
7b10: 4c 49 54 45 5f 55 54 46 31 36 2c 20 64 62 2c 20  LITE_UTF16, db, 
7b20: 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63 2c  sqlite3ExecFunc,
7b30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20   0, 0);.    }.  
7b40: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
7b50: 65 65 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71  ee(pVal);.    sq
7b60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
7b70: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
7b80: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  }.#endif..  if( 
7b90: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
7ba0: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
7bb0: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
7bc0: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
7bd0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
7be0: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
7bf0: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
7c00: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
7c10: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7c20: 6c 69 74 65 33 5f 64 72 6f 70 5f 6d 6f 64 75 6c  lite3_drop_modul
7c30: 65 73 20 44 42 20 3f 4e 41 4d 45 20 2e 2e 2e 3f  es DB ?NAME ...?
7c40: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
7c50: 65 20 73 71 6c 69 74 65 33 5f 64 72 6f 70 5f 6d  e sqlite3_drop_m
7c60: 6f 64 75 6c 65 73 28 44 2c 4c 29 20 69 6e 74 65  odules(D,L) inte
7c70: 72 66 61 63 65 20 6f 6e 20 64 61 74 61 62 61 73  rface on databas
7c80: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  e.** connection 
7c90: 44 42 2c 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  DB, in order to 
7ca0: 64 72 6f 70 20 61 6c 6c 20 6d 6f 64 75 6c 65 73  drop all modules
7cb0: 20 65 78 63 65 70 74 20 74 68 6f 73 65 20 6e 61   except those na
7cc0: 6d 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 61 72  med in.** the ar
7cd0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
7ce0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
7cf0: 41 50 49 20 74 65 73 74 5f 64 72 6f 70 5f 6d 6f  API test_drop_mo
7d00: 64 75 6c 65 73 28 0a 20 20 76 6f 69 64 20 2a 4e  dules(.  void *N
7d10: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
7d20: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
7d30: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
7d40: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
7d50: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
7d60: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
7d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7d80: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
7d90: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
7da0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
7db0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
7dc0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
7dd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
7de0: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
7df0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
7e00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
7e10: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
7e20: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
7e30: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 44 42  [0],.       " DB
7e40: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
7e50: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7e60: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
7e70: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
7e80: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
7e90: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
7ea0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7eb0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
7ec0: 0a 20 20 73 71 6c 69 74 65 33 5f 64 72 6f 70 5f  .  sqlite3_drop_
7ed0: 6d 6f 64 75 6c 65 73 28 64 62 2c 20 61 72 67 63  modules(db, argc
7ee0: 3e 32 20 3f 20 28 63 6f 6e 73 74 20 63 68 61 72  >2 ? (const char
7ef0: 2a 2a 29 28 61 72 67 76 2b 32 29 20 3a 20 30 29  **)(argv+2) : 0)
7f00: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
7f10: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
7f20: 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20 69  ** Routines to i
7f30: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f 63  mplement the x_c
7f40: 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74 65  ount() aggregate
7f50: 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
7f60: 20 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e 74   x_count() count
7f70: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
7f80: 6e 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65 6e  non-null argumen
7f90: 74 73 2e 20 20 42 75 74 20 74 68 65 72 65 20 61  ts.  But there a
7fa0: 72 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73 74  re.** some twist
7fb0: 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
7fc0: 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  rposes..**.** If
7fd0: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
7fe0: 20 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34 30   x_count() is 40
7ff0: 20 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65 72   then a UTF-8 er
8000: 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64 0a  ror is reported.
8010: 2a 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20 66  ** on the step f
8020: 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f 63  unction.  If x_c
8030: 6f 75 6e 74 28 34 31 29 20 69 73 20 73 65 65 6e  ount(41) is seen
8040: 2c 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36 20  , then a UTF-16 
8050: 65 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70 6f  error.** is repo
8060: 72 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65 70  rted on the step
8070: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 74   function.  If t
8080: 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20 69  he total count i
8090: 73 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61 20  s 42, then.** a 
80a0: 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20 72  UTF-8 error is r
80b0: 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 66  eported on the f
80c0: 69 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e  inalize function
80d0: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
80e0: 75 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 74  uct t1CountCtx t
80f0: 31 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75 63  1CountCtx;.struc
8100: 74 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a 20  t t1CountCtx {. 
8110: 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69   int n;.};.stati
8120: 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53 74  c void t1CountSt
8130: 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  ep(.  sqlite3_co
8140: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a  ntext *context,.
8150: 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71    int argc,.  sq
8160: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
8170: 67 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43  gv.){.  t1CountC
8180: 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c  tx *p;.  p = sql
8190: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
81a0: 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  ontext(context, 
81b0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69  sizeof(*p));.  i
81c0: 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53  f( (argc==0 || S
81d0: 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69  QLITE_NULL!=sqli
81e0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
81f0: 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20 29  rgv[0]) ) && p )
8200: 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20  {.    p->n++;.  
8210: 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20 29  }.  if( argc>0 )
8220: 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73 71  {.    int v = sq
8230: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
8240: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66  argv[0]);.    if
8250: 28 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20 20  ( v==40 ){.     
8260: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8270: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
8280: 76 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e 64  value of 40 hand
8290: 65 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c 20  ed to x_count", 
82a0: 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  -1);.#ifndef SQL
82b0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
82c0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d     }else if( v==
82d0: 34 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  41 ){.      cons
82e0: 74 20 63 68 61 72 20 7a 55 74 66 31 36 45 72 72  t char zUtf16Err
82f0: 4d 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78 36  Msg[] = { 0, 0x6
8300: 31 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20 30  1, 0, 0x62, 0, 0
8310: 78 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20  x63, 0, 0, 0};. 
8320: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
8330: 75 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e 74  ult_error16(cont
8340: 65 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72 4d  ext, &zUtf16ErrM
8350: 73 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47 45  sg[1-SQLITE_BIGE
8360: 4e 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65 6e  NDIAN], -1);.#en
8370: 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20  dif.    }.  }.} 
8380: 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74    .static void t
8390: 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73  1CountFinalize(s
83a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
83b0: 63 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43 6f  context){.  t1Co
83c0: 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d  untCtx *p;.  p =
83d0: 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61   sqlite3_aggrega
83e0: 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65  te_context(conte
83f0: 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b  xt, sizeof(*p));
8400: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
8410: 69 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b 0a  if( p->n==42 ){.
8420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
8430: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8440: 78 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f 74  xt, "x_count tot
8450: 61 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29 3b  als to 42", -1);
8460: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
8470: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
8480: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70 20  _int(context, p 
8490: 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20 20  ? p->n : 0);.   
84a0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65   }.  }.}..#ifnde
84b0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45  f SQLITE_OMIT_DE
84c0: 50 52 45 43 41 54 45 44 0a 73 74 61 74 69 63 20  PRECATED.static 
84d0: 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e 74  void legacyCount
84e0: 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f  Step(.  sqlite3_
84f0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
8500: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
8510: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8520: 61 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d  argv.){.  /* no-
8530: 6f 70 20 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63 20  op */.}..static 
8540: 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e 74  void legacyCount
8550: 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65 33  Finalize(sqlite3
8560: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
8570: 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  t){.  sqlite3_re
8580: 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74  sult_int(context
8590: 2c 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  , sqlite3_aggreg
85a0: 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78  ate_count(contex
85b0: 74 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  t));.}.#endif../
85c0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
85d0: 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
85e0: 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43  egate DB.**.** C
85f0: 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f  all the sqlite3_
8600: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
8610: 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65 6e  API on the given
8620: 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72 64   database in ord
8630: 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65 20  er.** to create 
8640: 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  a function named
8650: 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68 69   "x_count".  Thi
8660: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73 69  s function is si
8670: 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 74 68 65 20  milar.** to the 
8680: 62 75 69 6c 74 2d 69 6e 20 63 6f 75 6e 74 28 29  built-in count()
8690: 20 66 75 6e 63 74 69 6f 6e 2c 20 77 69 74 68 20   function, with 
86a0: 61 20 66 65 77 20 73 70 65 63 69 61 6c 20 71 75  a few special qu
86b0: 69 72 6b 73 0a 2a 2a 20 66 6f 72 20 74 65 73 74  irks.** for test
86c0: 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
86d0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20 41  result_error() A
86e0: 50 49 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  PIs..**.** The o
86f0: 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69  riginal motivati
8700: 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75 74  on for this rout
8710: 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61 62  ine was to be ab
8720: 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a  le to call the.*
8730: 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  * sqlite3_create
8740: 5f 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74  _aggregate funct
8750: 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65 72  ion while a quer
8760: 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73 73  y is in progress
8770: 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20   in order.** to 
8780: 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45 5f  test the SQLITE_
8790: 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f 6e  MISUSE detection
87a0: 20 6c 6f 67 69 63 2e 20 20 53 65 65 20 6d 69 73   logic.  See mis
87b0: 75 73 65 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20  use.test..**.** 
87c0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  This routine was
87d0: 20 6c 61 74 65 72 20 65 78 74 65 6e 64 65 64 20   later extended 
87e0: 74 6f 20 74 65 73 74 20 74 68 65 20 75 73 65 20  to test the use 
87f0: 6f 66 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  of sqlite3_resul
8800: 74 5f 65 72 72 6f 72 28 29 0a 2a 2a 20 77 69 74  t_error().** wit
8810: 68 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75  hin aggregate fu
8820: 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c  nctions..**.** L
8830: 61 74 65 72 3a 20 49 74 20 69 73 20 6e 6f 77 20  ater: It is now 
8840: 61 6c 73 6f 20 65 78 74 65 6e 64 65 64 20 74 6f  also extended to
8850: 20 72 65 67 69 73 74 65 72 20 74 68 65 20 61 67   register the ag
8860: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
8870: 0a 2a 2a 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e  .** "legacy_coun
8880: 74 28 29 22 20 77 69 74 68 20 74 68 65 20 73 75  t()" with the su
8890: 70 70 6c 69 65 64 20 64 61 74 61 62 61 73 65 20  pplied database 
88a0: 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73 20  handle. This is 
88b0: 75 73 65 64 0a 2a 2a 20 74 6f 20 74 65 73 74 20  used.** to test 
88c0: 74 68 65 20 64 65 70 72 65 63 61 74 65 64 20 73  the deprecated s
88d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
88e0: 5f 63 6f 75 6e 74 28 29 20 41 50 49 2e 0a 2a 2f  _count() API..*/
88f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
8900: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
8910: 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 28  reate_aggregate(
8920: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
8930: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
8940: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
8950: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
8960: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
8970: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
8980: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
8990: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
89a0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
89b0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
89c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
89d0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
89e0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
89f0: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
8a00: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
8a10: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8a20: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8a30: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8a40: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
8a50: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
8a60: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
8a70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
8a80: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
8a90: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
8aa0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
8ab0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
8ac0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
8ad0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
8ae0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63  unction(db, "x_c
8af0: 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45  ount", 0, SQLITE
8b00: 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20  _UTF8, 0, 0,.   
8b10: 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74     t1CountStep,t
8b20: 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b  1CountFinalize);
8b30: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
8b40: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
8b50: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
8b60: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f  function(db, "x_
8b70: 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54  count", 1, SQLIT
8b80: 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20  E_UTF8, 0, 0,.  
8b90: 20 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65        t1CountSte
8ba0: 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a  p,t1CountFinaliz
8bb0: 65 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  e);.  }.#ifndef 
8bc0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
8bd0: 45 43 41 54 45 44 0a 20 20 69 66 28 20 72 63 3d  ECATED.  if( rc=
8be0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
8bf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
8c00: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
8c10: 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74  b, "legacy_count
8c20: 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f 41 4e 59  ", 0, SQLITE_ANY
8c30: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  , 0, 0,.        
8c40: 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 2c  legacyCountStep,
8c50: 20 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61   legacyCountFina
8c60: 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  lize.    );.  }.
8c70: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c  #endif.  if( sql
8c80: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
8c90: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
8ca0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8cb0: 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  OR;.  Tcl_SetRes
8cc0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
8cd0: 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
8ce0: 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
8cf0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
8d00: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70 72 69 6e  .** Usage:  prin
8d10: 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 53 65  tf TEXT.**.** Se
8d20: 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 70 72 69  nd output to pri
8d30: 6e 74 66 2e 20 20 55 73 65 20 74 68 69 73 20 72  ntf.  Use this r
8d40: 61 74 68 65 72 20 74 68 61 6e 20 70 75 74 73 20  ather than puts 
8d50: 74 6f 20 6d 65 72 67 65 20 74 68 65 20 6f 75 74  to merge the out
8d60: 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f  put.** in the co
8d70: 72 72 65 63 74 20 73 65 71 75 65 6e 63 65 20 77  rrect sequence w
8d80: 69 74 68 20 64 65 62 75 67 67 69 6e 67 20 70 72  ith debugging pr
8d90: 69 6e 74 66 73 20 69 6e 73 65 72 74 65 64 20 69  intfs inserted i
8da0: 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a 2a 20 50  nto C code..** P
8db0: 75 74 73 20 75 73 65 73 20 61 20 73 65 70 61 72  uts uses a separ
8dc0: 61 74 65 20 62 75 66 66 65 72 20 61 6e 64 20 64  ate buffer and d
8dd0: 65 62 75 67 67 69 6e 67 20 73 74 61 74 65 6d 65  ebugging stateme
8de0: 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f 75 74 20  nts will be out 
8df0: 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69  of.** sequence i
8e00: 66 20 69 74 20 69 73 20 75 73 65 64 2e 0a 2a 2f  f it is used..*/
8e10: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
8e20: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70  TE_TCLAPI test_p
8e30: 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e  rintf(.  void *N
8e40: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
8e50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
8e60: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
8e70: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
8e80: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
8e90: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
8ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8eb0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
8ec0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
8ed0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
8ee0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
8ef0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
8f00: 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b    if( argc!=2 ){
8f10: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
8f20: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
8f30: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
8f40: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
8f50: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 54 45  [0],.       " TE
8f60: 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  XT\"", 0);.    r
8f70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8f80: 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22 25  .  }.  printf("%
8f90: 73 5c 6e 22 2c 20 61 72 67 76 5b 31 5d 29 3b 0a  s\n", argv[1]);.
8fa0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8fb0: 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  .}..../*.** Usag
8fc0: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
8fd0: 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54 20 49  ntf_int FORMAT I
8fe0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49  NTEGER INTEGER I
8ff0: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c  NTEGER.**.** Cal
9000: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
9010: 68 72 65 65 20 69 6e 74 65 67 65 72 20 61 72 67  hree integer arg
9020: 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63  uments.*/.static
9030: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
9040: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
9050: 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  tf_int(.  void *
9060: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9070: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
9080: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
9090: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
90a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
90b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
90c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
90d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
90e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
90f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9100: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9110: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9120: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
9130: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9140: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
9150: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9160: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9170: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9180: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
9190: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
91a0: 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20  INT INT INT\"", 
91b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
91c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
91d0: 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b  for(i=2; i<5; i+
91e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
91f0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9200: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9210: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9220: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9230: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9240: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9250: 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c  1], a[2]);.  Tcl
9260: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
9270: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
9280: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
9290: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
92a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
92b0: 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74    sqlite3_mprint
92c0: 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41 54 20 49  f_int64 FORMAT I
92d0: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 49  NTEGER INTEGER I
92e0: 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c  NTEGER.**.** Cal
92f0: 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74  l mprintf with t
9300: 68 72 65 65 20 36 34 2d 62 69 74 20 69 6e 74 65  hree 64-bit inte
9310: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f  ger arguments.*/
9320: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
9330: 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65  TE_TCLAPI sqlite
9340: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 28  3_mprintf_int64(
9350: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
9360: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
9370: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
9380: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
9390: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
93a0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
93b0: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
93c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
93d0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
93e0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
93f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
9400: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
9410: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ent */.){.  int 
9420: 69 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  i;.  sqlite_int6
9430: 34 20 61 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a  4 a[3];.  char *
9440: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
9450: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
9460: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9470: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
9480: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
9490: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
94a0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
94b0: 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  INT\"", 0);.    
94c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
94d0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
94e0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
94f0: 69 66 28 20 73 71 6c 69 74 65 33 41 74 6f 69 36  if( sqlite3Atoi6
9500: 34 28 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  4(argv[i], &a[i-
9510: 32 5d 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  2], sqlite3Strle
9520: 6e 33 30 28 61 72 67 76 5b 69 5d 29 2c 20 53 51  n30(argv[i]), SQ
9530: 4c 49 54 45 5f 55 54 46 38 29 20 29 7b 0a 20 20  LITE_UTF8) ){.  
9540: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9550: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 61 72  sult(interp, "ar
9560: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20  gument is not a 
9570: 76 61 6c 69 64 20 36 34 2d 62 69 74 20 69 6e 74  valid 64-bit int
9580: 65 67 65 72 22 2c 20 30 29 3b 0a 20 20 20 20 20  eger", 0);.     
9590: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
95a0: 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  R;.    }.  }.  z
95b0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
95c0: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
95d0: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
95e0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
95f0: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
9600: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9610: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
9620: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9630: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
9640: 72 69 6e 74 66 5f 6c 6f 6e 67 20 46 4f 52 4d 41  rintf_long FORMA
9650: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
9660: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
9670: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9680: 68 20 74 68 72 65 65 20 6c 6f 6e 67 20 69 6e 74  h three long int
9690: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 2e 20  eger arguments. 
96a0: 20 20 54 68 69 73 20 6d 69 67 68 74 20 62 65 20    This might be 
96b0: 74 68 65 0a 2a 2a 20 73 61 6d 65 20 61 73 20 73  the.** same as s
96c0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
96d0: 6e 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 6d 70  nt or sqlite3_mp
96e0: 72 69 6e 74 66 5f 69 6e 74 36 34 2c 20 64 65 70  rintf_int64, dep
96f0: 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a 20 70 6c 61  ending on.** pla
9700: 74 66 6f 72 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63  tform..*/.static
9710: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
9720: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
9730: 74 66 5f 6c 6f 6e 67 28 0a 20 20 76 6f 69 64 20  tf_long(.  void 
9740: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
9750: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
9760: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
9770: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
9780: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
9790: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
97a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
97b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
97c0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
97d0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
97e0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
97f0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
9800: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 6c 6f 6e  {.  int i;.  lon
9810: 67 20 69 6e 74 20 61 5b 33 5d 3b 0a 20 20 69 6e  g int a[3];.  in
9820: 74 20 62 5b 33 5d 3b 0a 20 20 63 68 61 72 20 2a  t b[3];.  char *
9830: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  z;.  if( argc!=5
9840: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
9850: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
9860: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
9870: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
9880: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
9890: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
98a0: 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  INT\"", 0);.    
98b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
98c0: 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b  ;.  }.  for(i=2;
98d0: 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<5; i++){.    
98e0: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
98f0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
9900: 26 62 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &b[i-2]) ) retur
9910: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
9920: 20 61 5b 69 2d 32 5d 20 3d 20 28 6c 6f 6e 67 20   a[i-2] = (long 
9930: 69 6e 74 29 62 5b 69 2d 32 5d 3b 0a 20 20 20 20  int)b[i-2];.    
9940: 61 5b 69 2d 32 5d 20 26 3d 20 28 28 28 75 36 34  a[i-2] &= (((u64
9950: 29 31 29 3c 3c 28 73 69 7a 65 6f 66 28 69 6e 74  )1)<<(sizeof(int
9960: 29 2a 38 29 29 2d 31 3b 0a 20 20 7d 0a 20 20 7a  )*8))-1;.  }.  z
9970: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
9980: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
9990: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20  , a[1], a[2]);. 
99a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
99b0: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
99c0: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
99d0: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
99e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
99f0: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70  age:  sqlite3_mp
9a00: 72 69 6e 74 66 5f 73 74 72 20 46 4f 52 4d 41 54  rintf_str FORMAT
9a10: 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52   INTEGER INTEGER
9a20: 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61   STRING.**.** Ca
9a30: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
9a40: 74 77 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75  two integer argu
9a50: 6d 65 6e 74 73 20 61 6e 64 20 6f 6e 65 20 73 74  ments and one st
9a60: 72 69 6e 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f  ring argument.*/
9a70: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
9a80: 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65  TE_TCLAPI sqlite
9a90: 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 28 0a 20  3_mprintf_str(. 
9aa0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
9ab0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
9ac0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
9ad0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
9ae0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
9af0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
9b00: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
9b10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9b20: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
9b30: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
9b40: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
9b50: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
9b60: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
9b70: 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  3], i;.  char *z
9b80: 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 34 20 7c  ;.  if( argc<4 |
9b90: 7c 20 61 72 67 63 3e 35 20 29 7b 0a 20 20 20 20  | argc>5 ){.    
9ba0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9bb0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
9bc0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
9bd0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
9be0: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
9bf0: 49 4e 54 20 49 4e 54 20 3f 53 54 52 49 4e 47 3f  INT INT ?STRING?
9c00: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
9c10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9c20: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
9c30: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  4; i++){.    if(
9c40: 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65   Tcl_GetInt(inte
9c50: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b  rp, argv[i], &a[
9c60: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
9c70: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9c80: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
9c90: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30  ntf(argv[1], a[0
9ca0: 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34 20  ], a[1], argc>4 
9cb0: 3f 20 61 72 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c  ? argv[4] : NULL
9cc0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
9cd0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
9ce0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
9cf0: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
9d00: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
9d10: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
9d20: 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 49  3_snprintf_str I
9d30: 4e 54 45 47 45 52 20 46 4f 52 4d 41 54 20 49 4e  NTEGER FORMAT IN
9d40: 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 53 54  TEGER INTEGER ST
9d50: 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  RING.**.** Call 
9d60: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f  mprintf with two
9d70: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
9d80: 74 73 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e  ts and one strin
9d90: 67 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74  g argument.*/.st
9da0: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
9db0: 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 73  TCLAPI sqlite3_s
9dc0: 6e 70 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76  nprintf_str(.  v
9dd0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
9de0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
9df0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
9e00: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
9e10: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
9e20: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
9e30: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
9e40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
9e50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
9e60: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
9e70: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
9e80: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
9e90: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d  */.){.  int a[3]
9ea0: 2c 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  , i;.  int n;.  
9eb0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
9ec0: 72 67 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20  rgc<5 || argc>6 
9ed0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9ee0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9ef0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
9f00: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
9f10: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
9f20: 49 4e 54 20 46 4f 52 4d 41 54 20 49 4e 54 20 49  INT FORMAT INT I
9f30: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
9f40: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
9f50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
9f60: 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
9f70: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
9f80: 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &n) ) return TCL
9f90: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c  _ERROR;.  if( n<
9fa0: 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  0 ){.    Tcl_App
9fb0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9fc0: 2c 20 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e  , "N must be non
9fd0: 2d 6e 65 67 61 74 69 76 65 22 2c 20 30 29 3b 0a  -negative", 0);.
9fe0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
9ff0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  RROR;.  }.  for(
a000: 69 3d 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a  i=3; i<5; i++){.
a010: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
a020: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
a030: 69 5d 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20 72  i], &a[i-3]) ) r
a040: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a050: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
a060: 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29  e3_malloc( n+1 )
a070: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
a080: 69 6e 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b  intf(n, z, argv[
a090: 32 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  2], a[0], a[1], 
a0a0: 61 72 67 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d  argc>4 ? argv[5]
a0b0: 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f   : NULL);.  Tcl_
a0c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
a0d0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
a0e0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
a0f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a100: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
a110: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
a120: 5f 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 49  _double FORMAT I
a130: 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20 44  NTEGER INTEGER D
a140: 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  OUBLE.**.** Call
a150: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 77   mprintf with tw
a160: 6f 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  o integer argume
a170: 6e 74 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62  nts and one doub
a180: 6c 65 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73  le argument.*/.s
a190: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
a1a0: 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f  _TCLAPI sqlite3_
a1b0: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a  mprintf_double(.
a1c0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a1d0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a1e0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a1f0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a200: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a210: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a220: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a230: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a240: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a250: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
a260: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
a270: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a280: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
a290: 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65  [3], i;.  double
a2a0: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   r;.  char *z;. 
a2b0: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
a2c0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
a2d0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
a2e0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
a2f0: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
a300: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
a310: 4d 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42  MAT INT INT DOUB
a320: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
a330: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a340: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
a350: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
a360: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
a370: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
a380: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
a390: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a3a0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
a3b0: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
a3c0: 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72  [4], &r) ) retur
a3d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
a3e0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
a3f0: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
a400: 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  , a[1], r);.  Tc
a410: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a420: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
a430: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
a440: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
a450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
a460: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
a470: 74 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54  tf_scaled FORMAT
a480: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
a490: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
a4a0: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
a4b0: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
a4c0: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
a4d0: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
a4e0: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
a4f0: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
a500: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
a510: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
a520: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
a530: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
a540: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
a550: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
a560: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
a570: 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69  LITE_TCLAPI sqli
a580: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
a590: 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ed(.  void *NotU
a5a0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
a5b0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
a5c0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
a5d0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
a5e0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
a5f0: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
a600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a610: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
a620: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
a630: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
a640: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
a650: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
a660: 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72  nt i;.  double r
a670: 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  [2];.  char *z;.
a680: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b    if( argc!=4 ){
a690: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a6a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a6b0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a6c0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a6d0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a6e0: 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42  RMAT DOUBLE DOUB
a6f0: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
a700: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
a710: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
a720: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
a730: 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65  f( Tcl_GetDouble
a740: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
a750: 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72 65 74  , &r[i-2]) ) ret
a760: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a770: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
a780: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
a790: 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20 20  , r[0]*r[1]);.  
a7a0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a7b0: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
a7c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
a7d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
a7e0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
a7f0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
a800: 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46 4f 52  intf_stronly FOR
a810: 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a  MAT STRING.**.**
a820: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
a830: 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62  th a single doub
a840: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
a850: 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74  h is the product
a860: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61   of the.** two a
a870: 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61  rguments given a
a880: 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75  bove.  This is u
a890: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
a8a0: 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64  overflow and und
a8b0: 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65  erflow.** double
a8c0: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74  s to test that t
a8d0: 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65  hey are converte
a8e0: 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73  d properly..*/.s
a8f0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
a900: 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f  _TCLAPI sqlite3_
a910: 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 28  mprintf_stronly(
a920: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
a930: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
a940: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
a950: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
a960: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
a970: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
a980: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
a990: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
a9a0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
a9b0: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
a9c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
a9d0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
a9e0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
a9f0: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21   *z;.  if( argc!
aa00: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
aa10: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
aa20: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
aa30: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
aa40: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
aa50: 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47   " FORMAT STRING
aa60: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
aa70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
aa80: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
aa90: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
aaa0: 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 54 63  , argv[2]);.  Tc
aab0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
aac0: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
aad0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
aae0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
aaf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
ab00: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
ab10: 74 66 5f 68 65 78 64 6f 75 62 6c 65 20 46 4f 52  tf_hexdouble FOR
ab20: 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a 20 43 61  MAT HEX.**.** Ca
ab30: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
ab40: 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20  a single double 
ab50: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
ab60: 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74  s derived from t
ab70: 68 65 0a 2a 2a 20 68 65 78 61 64 65 63 69 6d 61  he.** hexadecima
ab80: 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 6e  l encoding of an
ab90: 20 49 45 45 45 20 64 6f 75 62 6c 65 2e 0a 2a 2f   IEEE double..*/
aba0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
abb0: 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65  TE_TCLAPI sqlite
abc0: 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
abd0: 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ble(.  void *Not
abe0: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
abf0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
ac00: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
ac10: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
ac20: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
ac30: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
ac40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
ac50: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
ac60: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
ac70: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
ac80: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
ac90: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
aca0: 63 68 61 72 20 2a 7a 3b 0a 20 20 64 6f 75 62 6c  char *z;.  doubl
acb0: 65 20 72 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  e r;.  unsigned 
acc0: 69 6e 74 20 78 31 2c 20 78 32 3b 0a 20 20 73 71  int x1, x2;.  sq
acd0: 6c 69 74 65 5f 75 69 6e 74 36 34 20 64 3b 0a 20  lite_uint64 d;. 
ace0: 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
acf0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
ad00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
ad10: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
ad20: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
ad30: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
ad40: 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20 30  MAT STRING\"", 0
ad50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ad60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
ad70: 66 28 20 73 73 63 61 6e 66 28 61 72 67 76 5b 32  f( sscanf(argv[2
ad80: 5d 2c 20 22 25 30 38 78 25 30 38 78 22 2c 20 26  ], "%08x%08x", &
ad90: 78 32 2c 20 26 78 31 29 21 3d 32 20 29 7b 0a 20  x2, &x1)!=2 ){. 
ada0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
adb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 32 6e 64  ult(interp, "2nd
adc0: 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64   argument should
add0: 20 62 65 20 31 36 2d 63 68 61 72 61 63 74 65 72   be 16-character
ade0: 73 20 6f 66 20 68 65 78 22 2c 20 30 29 3b 0a 20  s of hex", 0);. 
adf0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ae00: 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 20 3d 20 78  ROR;.  }.  d = x
ae10: 32 3b 0a 20 20 64 20 3d 20 28 64 3c 3c 33 32 29  2;.  d = (d<<32)
ae20: 20 2b 20 78 31 3b 0a 20 20 6d 65 6d 63 70 79 28   + x1;.  memcpy(
ae30: 26 72 2c 20 26 64 2c 20 73 69 7a 65 6f 66 28 72  &r, &d, sizeof(r
ae40: 29 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  ));.  z = sqlite
ae50: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
ae60: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
ae70: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
ae80: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
ae90: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
aea0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
aeb0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
aec0: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
aed0: 65 64 5f 63 61 63 68 65 20 3f 42 4f 4f 4c 45 41  ed_cache ?BOOLEA
aee0: 4e 3f 0a 2a 2a 0a 2a 2f 0a 23 69 66 20 21 64 65  N?.**.*/.#if !de
aef0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
af00: 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45 29 0a  T_SHARED_CACHE).
af10: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
af20: 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 6e  E_TCLAPI test_en
af30: 61 62 6c 65 5f 73 68 61 72 65 64 28 0a 20 20 43  able_shared(.  C
af40: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
af50: 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
af60: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
af70: 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
af80: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
af90: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
afa0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
afb0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
afc0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
afd0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
afe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
aff0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
b000: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
b010: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
b020: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
b030: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
b040: 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a 20  .  int enable;. 
b050: 20 69 6e 74 20 72 65 74 20 3d 20 30 3b 0a 0a 20   int ret = 0;.. 
b060: 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
b070: 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
b080: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
b090: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
b0a0: 20 22 3f 42 4f 4f 4c 45 41 4e 3f 22 29 3b 0a 20   "?BOOLEAN?");. 
b0b0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b0c0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 20 3d  ROR;.  }.  ret =
b0d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
b0e0: 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
b0f0: 45 6e 61 62 6c 65 64 3b 0a 0a 20 20 69 66 28 20  Enabled;..  if( 
b100: 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69  objc==2 ){.    i
b110: 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
b120: 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
b130: 20 6f 62 6a 76 5b 31 5d 2c 20 26 65 6e 61 62 6c   objv[1], &enabl
b140: 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  e) ){.      retu
b150: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
b160: 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
b170: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68 61 72  ite3_enable_shar
b180: 65 64 5f 63 61 63 68 65 28 65 6e 61 62 6c 65 29  ed_cache(enable)
b190: 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
b1a0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b1b0: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
b1c0: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73  nterp, (char *)s
b1d0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
b1e0: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
b1f0: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
b200: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
b210: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
b220: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
b230: 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 65  NewBooleanObj(re
b240: 74 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  t));.  return TC
b250: 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
b260: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
b270: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
b280: 72 65 73 75 6c 74 5f 63 6f 64 65 73 20 20 20 44  result_codes   D
b290: 42 20 20 20 20 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a  B    BOOLEAN.**.
b2a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
b2b0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
b2c0: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
b2d0: 5f 63 6f 64 65 73 28 0a 20 20 43 6c 69 65 6e 74  _codes(.  Client
b2e0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
b2f0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
b300: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
b310: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
b320: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
b330: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
b340: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
b350: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
b360: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
b370: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
b380: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b390: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
b3a0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
b3b0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
b3c0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
b3d0: 7b 0a 20 20 69 6e 74 20 65 6e 61 62 6c 65 3b 0a  {.  int enable;.
b3e0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a    sqlite3 *db;..
b3f0: 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
b400: 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
b410: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
b420: 20 6f 62 6a 76 2c 20 22 44 42 20 42 4f 4f 4c 45   objv, "DB BOOLE
b430: 41 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  AN");.    return
b440: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
b450: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
b460: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
b470: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
b480: 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
b490: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
b4a0: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
b4b0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b4c0: 6f 62 6a 76 5b 32 5d 2c 20 26 65 6e 61 62 6c 65  objv[2], &enable
b4d0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
b4e0: 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
b4f0: 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
b500: 63 6f 64 65 73 28 64 62 2c 20 65 6e 61 62 6c 65  codes(db, enable
b510: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
b520: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
b530: 67 65 3a 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  ge: sqlite3_libv
b540: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 0a 2a 2a  ersion_number.**
b550: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
b560: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
b570: 74 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  t_libversion_num
b580: 62 65 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ber(.  ClientDat
b590: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
b5a0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
b5b0: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
b5c0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
b5d0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
b5e0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
b5f0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
b600: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
b610: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
b620: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
b630: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
b640: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
b650: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
b660: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
b670: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
b680: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b690: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
b6a0: 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
b6b0: 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65  libversion_numbe
b6c0: 72 28 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  r()));.  return 
b6d0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
b6e0: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
b6f0: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
b700: 61 64 61 74 61 20 44 42 20 64 62 6e 61 6d 65 20  adata DB dbname 
b710: 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a  tblname colname.
b720: 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
b730: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
b740: 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  est_table_column
b750: 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 43 6c 69  _metadata(.  Cli
b760: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
b770: 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
b780: 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
b790: 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
b7a0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b7b0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
b7c0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
b7d0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
b7e0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
b7f0: 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
b800: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b810: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
b820: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
b830: 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
b840: 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
b850: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
b860: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
b870: 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63   *zDb;.  const c
b880: 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 6f 6e  har *zTbl;.  con
b890: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20  st char *zCol;. 
b8a0: 20 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f 4f   int rc;.  Tcl_O
b8b0: 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e  bj *pRet;..  con
b8c0: 73 74 20 63 68 61 72 20 2a 7a 44 61 74 61 74 79  st char *zDataty
b8d0: 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  pe;.  const char
b8e0: 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20 69 6e   *zCollseq;.  in
b8f0: 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 6e 74  t notnull;.  int
b900: 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69   primarykey;.  i
b910: 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74  nt autoincrement
b920: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35  ;..  if( objc!=5
b930: 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20   && objc!=4 ){. 
b940: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
b950: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
b960: 62 6a 76 2c 20 22 44 42 20 64 62 6e 61 6d 65 20  bjv, "DB dbname 
b970: 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e 61 6d 65 22  tblname colname"
b980: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b990: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
b9a0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
b9b0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
b9c0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
b9d0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
b9e0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 20 3d  L_ERROR;.  zDb =
b9f0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
ba00: 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 54 62 6c 20  bjv[2]);.  zTbl 
ba10: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
ba20: 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 7a 43 6f 6c  objv[3]);.  zCol
ba30: 20 3d 20 6f 62 6a 63 3d 3d 35 20 3f 20 54 63 6c   = objc==5 ? Tcl
ba40: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
ba50: 34 5d 29 20 3a 20 30 3b 0a 0a 20 20 69 66 28 20  4]) : 0;..  if( 
ba60: 73 74 72 6c 65 6e 28 7a 44 62 29 3d 3d 30 20 29  strlen(zDb)==0 )
ba70: 20 7a 44 62 20 3d 20 30 3b 0a 0a 20 20 72 63 20   zDb = 0;..  rc 
ba80: 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  = sqlite3_table_
ba90: 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
baa0: 64 62 2c 20 7a 44 62 2c 20 7a 54 62 6c 2c 20 7a  db, zDb, zTbl, z
bab0: 43 6f 6c 2c 20 0a 20 20 20 20 20 20 26 7a 44 61  Col, .      &zDa
bac0: 74 61 74 79 70 65 2c 20 26 7a 43 6f 6c 6c 73 65  tatype, &zCollse
bad0: 71 2c 20 26 6e 6f 74 6e 75 6c 6c 2c 20 26 70 72  q, &notnull, &pr
bae0: 69 6d 61 72 79 6b 65 79 2c 20 26 61 75 74 6f 69  imarykey, &autoi
baf0: 6e 63 72 65 6d 65 6e 74 29 3b 0a 0a 20 20 69 66  ncrement);..  if
bb00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bb10: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
bb20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
bb30: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
bb40: 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
bb50: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
bb60: 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  }..  pRet = Tcl_
bb70: 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
bb80: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
bb90: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
bba0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
bbb0: 44 61 74 61 74 79 70 65 2c 20 2d 31 29 29 3b 0a  Datatype, -1));.
bbc0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
bbd0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
bbe0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
bbf0: 67 4f 62 6a 28 7a 43 6f 6c 6c 73 65 71 2c 20 2d  gObj(zCollseq, -
bc00: 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
bc10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
bc20: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
bc30: 49 6e 74 4f 62 6a 28 6e 6f 74 6e 75 6c 6c 29 29  IntObj(notnull))
bc40: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
bc50: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
bc60: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
bc70: 4f 62 6a 28 70 72 69 6d 61 72 79 6b 65 79 29 29  Obj(primarykey))
bc80: 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
bc90: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20  ppendElement(0, 
bca0: 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
bcb0: 4f 62 6a 28 61 75 74 6f 69 6e 63 72 65 6d 65 6e  Obj(autoincremen
bcc0: 74 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  t));.  Tcl_SetOb
bcd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
bce0: 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pRet);..  return
bcf0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e   TCL_OK;.}..#ifn
bd00: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
bd10: 49 4e 43 52 42 4c 4f 42 0a 0a 73 74 61 74 69 63  INCRBLOB..static
bd20: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
bd30: 50 49 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  PI blobHandleFro
bd40: 6d 4f 62 6a 28 0a 20 20 54 63 6c 5f 49 6e 74 65  mObj(.  Tcl_Inte
bd50: 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 54  rp *interp, .  T
bd60: 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c 0a 20 20  cl_Obj *pObj,.  
bd70: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 70  sqlite3_blob **p
bd80: 70 42 6c 6f 62 0a 29 7b 0a 20 20 63 68 61 72 20  pBlob.){.  char 
bd90: 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20  *z;.  int n;..  
bda0: 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  z = Tcl_GetStrin
bdb0: 67 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a 2c 20 26  gFromObj(pObj, &
bdc0: 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29  n);.  if( n==0 )
bdd0: 7b 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20  {.    *ppBlob = 
bde0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
bdf0: 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20  int notUsed;.   
be00: 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61   Tcl_Channel cha
be10: 6e 6e 65 6c 3b 0a 20 20 20 20 43 6c 69 65 6e 74  nnel;.    Client
be20: 44 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74  Data instanceDat
be30: 61 3b 0a 20 20 20 20 0a 20 20 20 20 63 68 61 6e  a;.    .    chan
be40: 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61  nel = Tcl_GetCha
be50: 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20 7a 2c 20  nnel(interp, z, 
be60: 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69  &notUsed);.    i
be70: 66 28 20 21 63 68 61 6e 6e 65 6c 20 29 20 72 65  f( !channel ) re
be80: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
be90: 0a 20 20 20 20 54 63 6c 5f 46 6c 75 73 68 28 63  .    Tcl_Flush(c
bea0: 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 54 63 6c  hannel);.    Tcl
beb0: 5f 53 65 65 6b 28 63 68 61 6e 6e 65 6c 2c 20 30  _Seek(channel, 0
bec0: 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 20 20  , SEEK_SET);..  
bed0: 20 20 69 6e 73 74 61 6e 63 65 44 61 74 61 20 3d    instanceData =
bee0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49   Tcl_GetChannelI
bef0: 6e 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e  nstanceData(chan
bf00: 6e 65 6c 29 3b 0a 20 20 20 20 2a 70 70 42 6c 6f  nel);.    *ppBlo
bf10: 62 20 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f 62  b = *((sqlite3_b
bf20: 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65 44  lob **)instanceD
bf30: 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ata);.  }..  ret
bf40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
bf50: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
bf60: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 6c 6f  _TCLAPI test_blo
bf70: 62 5f 72 65 6f 70 65 6e 28 0a 20 20 43 6c 69 65  b_reopen(.  Clie
bf80: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
bf90: 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a  a, /* Not used *
bfa0: 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
bfb0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
bfc0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
bfd0: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
bfe0: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
bff0: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
c000: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
c010: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
c020: 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
c030: 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
c040: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
c050: 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65  */.){.  Tcl_Wide
c060: 49 6e 74 20 69 52 6f 77 69 64 3b 0a 20 20 73 71  Int iRowid;.  sq
c070: 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f  lite3_blob *pBlo
c080: 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
c090: 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
c0a0: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
c0b0: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
c0c0: 62 6a 76 2c 20 22 43 48 41 4e 4e 45 4c 20 52 4f  bjv, "CHANNEL RO
c0d0: 57 49 44 22 29 3b 0a 20 20 20 20 72 65 74 75 72  WID");.    retur
c0e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
c0f0: 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64  ..  if( blobHand
c100: 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  leFromObj(interp
c110: 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f  , objv[1], &pBlo
c120: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
c130: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
c140: 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f  _GetWideIntFromO
c150: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
c160: 32 5d 2c 20 26 69 52 6f 77 69 64 29 20 29 20 72  2], &iRowid) ) r
c170: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
c180: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
c190: 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 70 42 6c  _blob_reopen(pBl
c1a0: 6f 62 2c 20 69 52 6f 77 69 64 29 3b 0a 20 20 69  ob, iRowid);.  i
c1b0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c1c0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
c1d0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
c1e0: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
c1f0: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f  Name(rc), TCL_VO
c200: 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 0a 20 20  LATILE);.  }..  
c210: 72 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49  return (rc==SQLI
c220: 54 45 5f 4f 4b 20 3f 20 54 43 4c 5f 4f 4b 20 3a  TE_OK ? TCL_OK :
c230: 20 54 43 4c 5f 45 52 52 4f 52 29 3b 0a 7d 0a 0a   TCL_ERROR);.}..
c240: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73  #endif../*.** Us
c250: 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 72 65  age: sqlite3_cre
c260: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c270: 20 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20   DB-HANDLE NAME 
c280: 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f  CMP-PROC DEL-PRO
c290: 43 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20 54  C.**.**   This T
c2a0: 63 6c 20 70 72 6f 63 20 69 73 20 75 73 65 64 20  cl proc is used 
c2b0: 66 6f 72 20 74 65 73 74 69 6e 67 20 74 68 65 20  for testing the 
c2c0: 65 78 70 65 72 69 6d 65 6e 74 61 6c 0a 2a 2a 20  experimental.** 
c2d0: 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
c2e0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 29 20  _collation_v2() 
c2f0: 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
c300: 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69  ruct TestCollati
c310: 6f 6e 58 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  onX {.  Tcl_Inte
c320: 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
c330: 6c 5f 4f 62 6a 20 2a 70 43 6d 70 3b 0a 20 20 54  l_Obj *pCmp;.  T
c340: 63 6c 5f 4f 62 6a 20 2a 70 44 65 6c 3b 0a 7d 3b  cl_Obj *pDel;.};
c350: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
c360: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 54  TestCollationX T
c370: 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 3b 0a 73  estCollationX;.s
c380: 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 43  tatic void testC
c390: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65  reateCollationDe
c3a0: 6c 28 76 6f 69 64 20 2a 70 43 74 78 29 7b 0a 20  l(void *pCtx){. 
c3b0: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
c3c0: 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74  *p = (TestCollat
c3d0: 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 0a 20 20  ionX *)pCtx;..  
c3e0: 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76 61  int rc = Tcl_Eva
c3f0: 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70  lObjEx(p->interp
c400: 2c 20 70 2d 3e 70 44 65 6c 2c 20 54 43 4c 5f 45  , p->pDel, TCL_E
c410: 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45  VAL_DIRECT|TCL_E
c420: 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 69  VAL_GLOBAL);.  i
c430: 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 7b  f( rc!=TCL_OK ){
c440: 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72 6f  .    Tcl_Backgro
c450: 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65  undError(p->inte
c460: 72 70 29 3b 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f  rp);.  }..  Tcl_
c470: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
c480: 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 44 65 63  pCmp);.  Tcl_Dec
c490: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65  rRefCount(p->pDe
c4a0: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  l);.  sqlite3_fr
c4b0: 65 65 28 28 76 6f 69 64 20 2a 29 70 29 3b 0a 7d  ee((void *)p);.}
c4c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
c4d0: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c4e0: 6d 70 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78  mp(.  void *pCtx
c4f0: 2c 0a 20 20 69 6e 74 20 6e 4c 65 66 74 2c 0a 20  ,.  int nLeft,. 
c500: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4c 65   const void *zLe
c510: 66 74 2c 0a 20 20 69 6e 74 20 6e 52 69 67 68 74  ft,.  int nRight
c520: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
c530: 7a 52 69 67 68 74 0a 29 7b 0a 20 20 54 65 73 74  zRight.){.  Test
c540: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20  CollationX *p = 
c550: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
c560: 2a 29 70 43 74 78 3b 0a 20 20 54 63 6c 5f 4f 62  *)pCtx;.  Tcl_Ob
c570: 6a 20 2a 70 53 63 72 69 70 74 20 3d 20 54 63 6c  j *pScript = Tcl
c580: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
c590: 3e 70 43 6d 70 29 3b 0a 20 20 69 6e 74 20 69 52  >pCmp);.  int iR
c5a0: 65 73 20 3d 20 30 3b 0a 0a 20 20 54 63 6c 5f 49  es = 0;..  Tcl_I
c5b0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63 72  ncrRefCount(pScr
c5c0: 69 70 74 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ipt);.  Tcl_List
c5d0: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
c5e0: 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c  (0, pScript, Tcl
c5f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
c600: 68 61 72 20 2a 29 7a 4c 65 66 74 2c 20 6e 4c 65  har *)zLeft, nLe
c610: 66 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ft));.  Tcl_List
c620: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
c630: 28 30 2c 20 70 53 63 72 69 70 74 2c 20 54 63 6c  (0, pScript, Tcl
c640: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
c650: 68 61 72 20 2a 29 7a 52 69 67 68 74 2c 6e 52 69  har *)zRight,nRi
c660: 67 68 74 29 29 3b 0a 0a 20 20 69 66 28 20 54 43  ght));..  if( TC
c670: 4c 5f 4f 4b 21 3d 54 63 6c 5f 45 76 61 6c 4f 62  L_OK!=Tcl_EvalOb
c680: 6a 45 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70  jEx(p->interp, p
c690: 53 63 72 69 70 74 2c 20 54 43 4c 5f 45 56 41 4c  Script, TCL_EVAL
c6a0: 5f 44 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c  _DIRECT|TCL_EVAL
c6b0: 5f 47 4c 4f 42 41 4c 29 0a 20 20 20 7c 7c 20 54  _GLOBAL).   || T
c6c0: 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
c6d0: 74 46 72 6f 6d 4f 62 6a 28 70 2d 3e 69 6e 74 65  tFromObj(p->inte
c6e0: 72 70 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  rp, Tcl_GetObjRe
c6f0: 73 75 6c 74 28 70 2d 3e 69 6e 74 65 72 70 29 2c  sult(p->interp),
c700: 20 26 69 52 65 73 29 0a 20 20 29 7b 0a 20 20 20   &iRes).  ){.   
c710: 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45   Tcl_BackgroundE
c720: 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b  rror(p->interp);
c730: 0a 20 20 7d 0a 20 20 54 63 6c 5f 44 65 63 72 52  .  }.  Tcl_DecrR
c740: 65 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29  efCount(pScript)
c750: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 69 52 65 73  ;..  return iRes
c760: 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53  ;.}.static int S
c770: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
c780: 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  t_create_collati
c790: 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44  on_v2(.  ClientD
c7a0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
c7b0: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
c7c0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
c7d0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
c7e0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
c7f0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
c800: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
c810: 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
c820: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
c830: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
c840: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
c850: 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
c860: 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
c870: 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74 69  ){.  TestCollati
c880: 6f 6e 58 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65  onX *p;.  sqlite
c890: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
c8a0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
c8b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
c8c0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
c8d0: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e  1, objv, "DB-HAN
c8e0: 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f  DLE NAME CMP-PRO
c8f0: 43 20 44 45 4c 2d 50 52 4f 43 22 29 3b 0a 20 20  C DEL-PROC");.  
c900: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
c910: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
c920: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
c930: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
c940: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
c950: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
c960: 4f 52 3b 0a 0a 20 20 70 20 3d 20 28 54 65 73 74  OR;..  p = (Test
c970: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 73 71 6c  CollationX *)sql
c980: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65  ite3_malloc(size
c990: 6f 66 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  of(TestCollation
c9a0: 58 29 29 3b 0a 20 20 70 2d 3e 70 43 6d 70 20 3d  X));.  p->pCmp =
c9b0: 20 6f 62 6a 76 5b 33 5d 3b 0a 20 20 70 2d 3e 70   objv[3];.  p->p
c9c0: 44 65 6c 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20  Del = objv[4];. 
c9d0: 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74   p->interp = int
c9e0: 65 72 70 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52  erp;.  Tcl_IncrR
c9f0: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29  efCount(p->pCmp)
ca00: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
ca10: 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 0a  ount(p->pDel);..
ca20: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
ca30: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
ca40: 76 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74  v2(db, Tcl_GetSt
ca50: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 31  ring(objv[2]), 1
ca60: 36 2c 20 0a 20 20 20 20 20 20 28 76 6f 69 64 20  6, .      (void 
ca70: 2a 29 70 2c 20 74 65 73 74 43 72 65 61 74 65 43  *)p, testCreateC
ca80: 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73  ollationCmp, tes
ca90: 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e  tCreateCollation
caa0: 44 65 6c 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  Del.  );.  if( r
cab0: 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  c!=SQLITE_MISUSE
cac0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
cad0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
cae0: 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65   "sqlite3_create
caf0: 5f 63 6f 6c 6c 61 74 65 5f 76 32 28 29 20 66 61  _collate_v2() fa
cb00: 69 6c 65 64 20 74 6f 20 64 65 74 65 63 74 20 22  iled to detect "
cb10: 0a 20 20 20 20 20 20 22 61 6e 20 69 6e 76 61 6c  .      "an inval
cb20: 69 64 20 65 6e 63 6f 64 69 6e 67 22 2c 20 28 63  id encoding", (c
cb30: 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
cb40: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cb50: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
cb60: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
cb70: 6f 6e 5f 76 32 28 64 62 2c 20 54 63 6c 5f 47 65  on_v2(db, Tcl_Ge
cb80: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
cb90: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
cba0: 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c        (void *)p,
cbb0: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
cbc0: 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65  tionCmp, testCre
cbd0: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a  ateCollationDel.
cbe0: 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43    );.  return TC
cbf0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
cc00: 53 41 47 45 3a 20 73 71 6c 69 74 65 33 5f 63 72  SAGE: sqlite3_cr
cc10: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
cc20: 20 44 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e   DB NAME NARG EN
cc30: 43 20 3f 53 57 49 54 43 48 45 53 3f 0a 2a 2a 0a  C ?SWITCHES?.**.
cc40: 2a 2a 20 41 76 61 69 6c 61 62 6c 65 20 73 77 69  ** Available swi
cc50: 74 63 68 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a  tches are:.**.**
cc60: 20 20 20 2d 66 75 6e 63 20 20 20 20 53 43 52 49     -func    SCRI
cc70: 50 54 0a 2a 2a 20 20 20 2d 73 74 65 70 20 20 20  PT.**   -step   
cc80: 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 66 69   SCRIPT.**   -fi
cc90: 6e 61 6c 20 20 20 53 43 52 49 50 54 0a 2a 2a 20  nal   SCRIPT.** 
cca0: 20 20 2d 64 65 73 74 72 6f 79 20 53 43 52 49 50    -destroy SCRIP
ccb0: 54 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  T.*/.typedef str
ccc0: 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74 69  uct CreateFuncti
ccd0: 6f 6e 56 32 20 43 72 65 61 74 65 46 75 6e 63 74  onV2 CreateFunct
cce0: 69 6f 6e 56 32 3b 0a 73 74 72 75 63 74 20 43 72  ionV2;.struct Cr
ccf0: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 7b  eateFunctionV2 {
cd00: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
cd10: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
cd20: 20 2a 70 46 75 6e 63 3b 20 20 20 20 20 20 20 20   *pFunc;        
cd30: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69           /* Scri
cd40: 70 74 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  pt for function 
cd50: 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
cd60: 54 63 6c 5f 4f 62 6a 20 2a 70 53 74 65 70 3b 20  Tcl_Obj *pStep; 
cd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd80: 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61 67  /* Script for ag
cd90: 67 2e 20 73 74 65 70 20 69 6e 76 6f 63 61 74 69  g. step invocati
cda0: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  on */.  Tcl_Obj 
cdb0: 2a 70 46 69 6e 61 6c 3b 20 20 20 20 20 20 20 20  *pFinal;        
cdc0: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70          /* Scrip
cdd0: 74 20 66 6f 72 20 61 67 67 2e 20 66 69 6e 61 6c  t for agg. final
cde0: 69 7a 61 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69  ization invocati
cdf0: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  on */.  Tcl_Obj 
ce00: 2a 70 44 65 73 74 72 6f 79 3b 20 20 20 20 20 20  *pDestroy;      
ce10: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
ce20: 75 63 74 6f 72 20 73 63 72 69 70 74 20 2a 2f 0a  uctor script */.
ce30: 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  };.static void c
ce40: 66 32 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  f2Func(sqlite3_c
ce50: 6f 6e 74 65 78 74 20 2a 63 74 78 2c 20 69 6e 74  ontext *ctx, int
ce60: 20 6e 41 72 67 2c 20 73 71 6c 69 74 65 33 5f 76   nArg, sqlite3_v
ce70: 61 6c 75 65 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a  alue **aArg){.}.
ce80: 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32 53  static void cf2S
ce90: 74 65 70 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  tep(sqlite3_cont
cea0: 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41  ext *ctx, int nA
ceb0: 72 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rg, sqlite3_valu
cec0: 65 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61  e **aArg){.}.sta
ced0: 74 69 63 20 76 6f 69 64 20 63 66 32 46 69 6e 61  tic void cf2Fina
cee0: 6c 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  l(sqlite3_contex
cef0: 74 20 2a 63 74 78 29 7b 0a 7d 0a 73 74 61 74 69  t *ctx){.}.stati
cf00: 63 20 76 6f 69 64 20 63 66 32 44 65 73 74 72 6f  c void cf2Destro
cf10: 79 28 76 6f 69 64 20 2a 70 55 73 65 72 29 7b 0a  y(void *pUser){.
cf20: 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e    CreateFunction
cf30: 56 32 20 2a 70 20 3d 20 28 43 72 65 61 74 65 46  V2 *p = (CreateF
cf40: 75 6e 63 74 69 6f 6e 56 32 20 2a 29 70 55 73 65  unctionV2 *)pUse
cf50: 72 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 69 6e 74  r;..  if( p->int
cf60: 65 72 70 20 26 26 20 70 2d 3e 70 44 65 73 74 72  erp && p->pDestr
cf70: 6f 79 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  oy ){.    int rc
cf80: 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78   = Tcl_EvalObjEx
cf90: 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70  (p->interp, p->p
cfa0: 44 65 73 74 72 6f 79 2c 20 30 29 3b 0a 20 20 20  Destroy, 0);.   
cfb0: 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20   if( rc!=TCL_OK 
cfc0: 29 20 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64  ) Tcl_Background
cfd0: 45 72 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29  Error(p->interp)
cfe0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e  ;.  }..  if( p->
cff0: 70 46 75 6e 63 20 29 20 54 63 6c 5f 44 65 63 72  pFunc ) Tcl_Decr
d000: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e  RefCount(p->pFun
d010: 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53  c); .  if( p->pS
d020: 74 65 70 20 29 20 54 63 6c 5f 44 65 63 72 52 65  tep ) Tcl_DecrRe
d030: 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70 29  fCount(p->pStep)
d040: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e  ; .  if( p->pFin
d050: 61 6c 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66  al ) Tcl_DecrRef
d060: 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29  Count(p->pFinal)
d070: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73  ; .  if( p->pDes
d080: 74 72 6f 79 20 29 20 54 63 6c 5f 44 65 63 72 52  troy ) Tcl_DecrR
d090: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74  efCount(p->pDest
d0a0: 72 6f 79 29 3b 20 0a 20 20 73 71 6c 69 74 65 33  roy); .  sqlite3
d0b0: 5f 66 72 65 65 28 70 29 3b 0a 7d 0a 73 74 61 74  _free(p);.}.stat
d0c0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
d0d0: 4c 41 50 49 20 74 65 73 74 5f 63 72 65 61 74 65  LAPI test_create
d0e0: 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20  _function_v2(.  
d0f0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
d100: 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20  tData,          
d110: 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20  /* Not used */. 
d120: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
d130: 65 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20  erp,            
d140: 20 2f 2a 20 54 68 65 20 69 6e 76 6f 6b 69 6e 67   /* The invoking
d150: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
d160: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
d170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d180: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d190: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d1a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d1b0: 20 6f 62 6a 76 5b 5d 20 20 20 20 20 20 20 20 20   objv[]         
d1c0: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
d1d0: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
d1e0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
d1f0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b  nst char *zFunc;
d200: 0a 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69  .  int nArg;.  i
d210: 6e 74 20 65 6e 63 3b 0a 20 20 43 72 65 61 74 65  nt enc;.  Create
d220: 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70 3b 0a 20  FunctionV2 *p;. 
d230: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63   int i;.  int rc
d240: 3b 0a 0a 20 20 73 74 72 75 63 74 20 45 6e 63 54  ;..  struct EncT
d250: 61 62 6c 65 20 7b 0a 20 20 20 20 63 6f 6e 73 74  able {.    const
d260: 20 63 68 61 72 20 2a 7a 45 6e 63 3b 0a 20 20 20   char *zEnc;.   
d270: 20 69 6e 74 20 65 6e 63 3b 0a 20 20 7d 20 61 45   int enc;.  } aE
d280: 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 75  nc[] = {.    {"u
d290: 74 66 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f  tf8",    SQLITE_
d2a0: 55 54 46 38 20 7d 2c 0a 20 20 20 20 7b 22 75 74  UTF8 },.    {"ut
d2b0: 66 31 36 22 2c 20 20 20 53 51 4c 49 54 45 5f 55  f16",   SQLITE_U
d2c0: 54 46 31 36 20 7d 2c 0a 20 20 20 20 7b 22 75 74  TF16 },.    {"ut
d2d0: 66 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55  f16le", SQLITE_U
d2e0: 54 46 31 36 4c 45 20 7d 2c 0a 20 20 20 20 7b 22  TF16LE },.    {"
d2f0: 75 74 66 31 36 62 65 22 2c 20 53 51 4c 49 54 45  utf16be", SQLITE
d300: 5f 55 54 46 31 36 42 45 20 7d 2c 0a 20 20 20 20  _UTF16BE },.    
d310: 7b 22 61 6e 79 22 2c 20 20 20 20 20 53 51 4c 49  {"any",     SQLI
d320: 54 45 5f 41 4e 59 20 7d 2c 0a 20 20 20 20 7b 22  TE_ANY },.    {"
d330: 30 22 2c 20 30 20 7d 0a 20 20 7d 3b 0a 0a 20 20  0", 0 }.  };..  
d340: 69 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 28 6f  if( objc<5 || (o
d350: 62 6a 63 25 32 29 3d 3d 30 20 29 7b 0a 20 20 20  bjc%2)==0 ){.   
d360: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
d370: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
d380: 76 2c 20 22 44 42 20 4e 41 4d 45 20 4e 41 52 47  v, "DB NAME NARG
d390: 20 45 4e 43 20 53 57 49 54 43 48 45 53 2e 2e 2e   ENC SWITCHES...
d3a0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
d3b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
d3c0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
d3d0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
d3e0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
d3f0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
d400: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 75  TCL_ERROR;.  zFu
d410: 6e 63 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  nc = Tcl_GetStri
d420: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
d430: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
d440: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
d450: 76 5b 33 5d 2c 20 26 6e 41 72 67 29 20 29 20 72  v[3], &nArg) ) r
d460: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
d470: 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
d480: 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74  dexFromObjStruct
d490: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
d4a0: 2c 20 61 45 6e 63 2c 20 73 69 7a 65 6f 66 28 61  , aEnc, sizeof(a
d4b0: 45 6e 63 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20  Enc[0]), .      
d4c0: 20 20 20 20 22 65 6e 63 6f 64 69 6e 67 22 2c 20      "encoding", 
d4d0: 30 2c 20 26 65 6e 63 29 0a 20 20 29 7b 0a 20 20  0, &enc).  ){.  
d4e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d4f0: 4f 52 3b 0a 20 20 7d 0a 20 20 65 6e 63 20 3d 20  OR;.  }.  enc = 
d500: 61 45 6e 63 5b 65 6e 63 5d 2e 65 6e 63 3b 0a 0a  aEnc[enc].enc;..
d510: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
d520: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 72 65 61  lloc(sizeof(Crea
d530: 74 65 46 75 6e 63 74 69 6f 6e 56 32 29 29 3b 0a  teFunctionV2));.
d540: 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20    assert( p );. 
d550: 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69   memset(p, 0, si
d560: 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74  zeof(CreateFunct
d570: 69 6f 6e 56 32 29 29 3b 0a 20 20 70 2d 3e 69 6e  ionV2));.  p->in
d580: 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a  terp = interp;..
d590: 20 20 66 6f 72 28 69 3d 35 3b 20 69 3c 6f 62 6a    for(i=5; i<obj
d5a0: 63 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 6e  c; i+=2){.    in
d5b0: 74 20 69 53 77 69 74 63 68 3b 0a 20 20 20 20 63  t iSwitch;.    c
d5c0: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 77 69  onst char *azSwi
d5d0: 74 63 68 5b 5d 20 3d 20 7b 22 2d 66 75 6e 63 22  tch[] = {"-func"
d5e0: 2c 20 22 2d 73 74 65 70 22 2c 20 22 2d 66 69 6e  , "-step", "-fin
d5f0: 61 6c 22 2c 20 22 2d 64 65 73 74 72 6f 79 22 2c  al", "-destroy",
d600: 20 30 7d 3b 0a 20 20 20 20 69 66 28 20 54 63 6c   0};.    if( Tcl
d610: 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
d620: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d  (interp, objv[i]
d630: 2c 20 61 7a 53 77 69 74 63 68 2c 20 22 73 77 69  , azSwitch, "swi
d640: 74 63 68 22 2c 20 30 2c 20 26 69 53 77 69 74 63  tch", 0, &iSwitc
d650: 68 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  h) ){.      sqli
d660: 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
d670: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d680: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
d690: 73 77 69 74 63 68 28 20 69 53 77 69 74 63 68 20  switch( iSwitch 
d6a0: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 30 3a  ){.      case 0:
d6b0: 20 70 2d 3e 70 46 75 6e 63 20 3d 20 6f 62 6a 76   p->pFunc = objv
d6c0: 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62 72 65 61  [i+1];      brea
d6d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a  k;.      case 1:
d6e0: 20 70 2d 3e 70 53 74 65 70 20 3d 20 6f 62 6a 76   p->pStep = objv
d6f0: 5b 69 2b 31 5d 3b 20 20 20 20 20 20 62 72 65 61  [i+1];      brea
d700: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a  k;.      case 2:
d710: 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20 6f 62 6a   p->pFinal = obj
d720: 76 5b 69 2b 31 5d 3b 20 20 20 20 20 62 72 65 61  v[i+1];     brea
d730: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 33 3a  k;.      case 3:
d740: 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20 6f   p->pDestroy = o
d750: 62 6a 76 5b 69 2b 31 5d 3b 20 20 20 62 72 65 61  bjv[i+1];   brea
d760: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
d770: 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 70 2d  f( p->pFunc ) p-
d780: 3e 70 46 75 6e 63 20 3d 20 54 63 6c 5f 44 75 70  >pFunc = Tcl_Dup
d790: 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 75  licateObj(p->pFu
d7a0: 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  nc); .  if( p->p
d7b0: 53 74 65 70 20 29 20 70 2d 3e 70 53 74 65 70 20  Step ) p->pStep 
d7c0: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
d7d0: 62 6a 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20  bj(p->pStep); . 
d7e0: 20 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29   if( p->pFinal )
d7f0: 20 70 2d 3e 70 46 69 6e 61 6c 20 3d 20 54 63 6c   p->pFinal = Tcl
d800: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
d810: 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28  >pFinal); .  if(
d820: 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 70   p->pDestroy ) p
d830: 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20 54 63 6c  ->pDestroy = Tcl
d840: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
d850: 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20  >pDestroy); ..  
d860: 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54  if( p->pFunc ) T
d870: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
d880: 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66  p->pFunc); .  if
d890: 28 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c  ( p->pStep ) Tcl
d8a0: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
d8b0: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
d8c0: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f  p->pFinal ) Tcl_
d8d0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
d8e0: 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20  pFinal); .  if( 
d8f0: 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63  p->pDestroy ) Tc
d900: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
d910: 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20  ->pDestroy); .. 
d920: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
d930: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32  eate_function_v2
d940: 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67  (db, zFunc, nArg
d950: 2c 20 65 6e 63 2c 20 28 76 6f 69 64 20 2a 29 70  , enc, (void *)p
d960: 2c 20 0a 20 20 20 20 20 20 28 70 2d 3e 70 46 75  , .      (p->pFu
d970: 6e 63 20 3f 20 63 66 32 46 75 6e 63 20 3a 20 30  nc ? cf2Func : 0
d980: 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e 70 53 74  ),.      (p->pSt
d990: 65 70 20 3f 20 63 66 32 53 74 65 70 20 3a 20 30  ep ? cf2Step : 0
d9a0: 29 2c 0a 20 20 20 20 20 20 28 70 2d 3e 70 46 69  ),.      (p->pFi
d9b0: 6e 61 6c 20 3f 20 63 66 32 46 69 6e 61 6c 20 3a  nal ? cf2Final :
d9c0: 20 30 29 2c 0a 20 20 20 20 20 20 63 66 32 44 65   0),.      cf2De
d9d0: 73 74 72 6f 79 0a 20 20 29 3b 0a 20 20 69 66 28  stroy.  );.  if(
d9e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d9f0: 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  {.    Tcl_ResetR
da00: 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
da10: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
da20: 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
da30: 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
da40: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
da50: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
da60: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
da70: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
da80: 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65  qlite3_load_exte
da90: 6e 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20  nsion DB-HANDLE 
daa0: 46 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73  FILE ?PROC?.*/.s
dab0: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
dac0: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 6f 61  _TCLAPI test_loa
dad0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20 43  d_extension(.  C
dae0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
daf0: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
db00: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
db10: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
db20: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
db30: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
db40: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
db50: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
db60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
db70: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
db80: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
db90: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
dba0: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
dbb0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43  ts */.){.  Tcl_C
dbc0: 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
dbd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
dbe0: 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
dbf0: 2a 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a 46  *zDb;.  char *zF
dc00: 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50 72  ile;.  char *zPr
dc10: 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  oc = 0;.  char *
dc20: 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28  zErr = 0;..  if(
dc30: 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63   objc!=4 && objc
dc40: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
dc50: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
dc60: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
dc70: 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50 52  -HANDLE FILE ?PR
dc80: 4f 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  OC?");.    retur
dc90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
dca0: 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
dcb0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
dcc0: 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47  .  zFile = Tcl_G
dcd0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
dce0: 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34  );.  if( objc==4
dcf0: 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20   ){.    zProc = 
dd00: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
dd10: 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20 2f  jv[3]);.  }..  /
dd20: 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43 20  * Extract the C 
dd30: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
dd40: 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d  from the Tcl com
dd50: 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  mand name */.  i
dd60: 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  f( !Tcl_GetComma
dd70: 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a  ndInfo(interp, z
dd80: 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  Db, &cmdInfo) ){
dd90: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
dda0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
ddb0: 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64  ommand not found
ddc0: 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a  : ", zDb, (char*
ddd0: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
dde0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
ddf0: 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20 53   db = ((struct S
de00: 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f  qliteDb*)cmdInfo
de10: 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d  .objClientData)-
de20: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62  >db;.  assert(db
de30: 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68  );..  /* Call th
de40: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20 66  e underlying C f
de50: 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20 65  unction. If an e
de60: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74  rror occurs, set
de70: 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43 4c   rc to .  ** TCL
de80: 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64 20  _ERROR and load 
de90: 61 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e 67  any error string
dea0: 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 70   into the interp
deb0: 72 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20 20  reter. If no .  
dec0: 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  ** error occurs,
ded0: 20 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f 4f   set rc to TCL_O
dee0: 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  K..  */.#ifdef S
def0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
df00: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20 3d  EXTENSION.  rc =
df10: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
df20: 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
df30: 6d 70 72 69 6e 74 66 28 22 74 68 69 73 20 62 75  mprintf("this bu
df40: 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65  ild omits sqlite
df50: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
df60: 28 29 22 29 3b 0a 20 20 28 76 6f 69 64 29 7a 50  ()");.  (void)zP
df70: 72 6f 63 3b 0a 20 20 28 76 6f 69 64 29 7a 46 69  roc;.  (void)zFi
df80: 6c 65 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d  le;.#else.  rc =
df90: 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78   sqlite3_load_ex
dfa0: 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c  tension(db, zFil
dfb0: 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 29  e, zProc, &zErr)
dfc0: 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72  ;.#endif.  if( r
dfd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
dfe0: 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
dff0: 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 20 3f  t(interp, zErr ?
e000: 20 7a 45 72 72 20 3a 20 22 22 2c 20 54 43 4c 5f   zErr : "", TCL_
e010: 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72  VOLATILE);.    r
e020: 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  c = TCL_ERROR;. 
e030: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
e040: 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73   TCL_OK;.  }.  s
e050: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
e060: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
e070: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
e080: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
e090: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44  load_extension D
e0a0: 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a  B-HANDLE ONOFF.*
e0b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
e0c0: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
e0d0: 65 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43  enable_load(.  C
e0e0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
e0f0: 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65  Data, /* Not use
e100: 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
e110: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
e120: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
e130: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
e140: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
e150: 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
e160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
e170: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
e180: 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
e190: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
e1a0: 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
e1b0: 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43  ts */.){.  Tcl_C
e1c0: 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a  mdInfo cmdInfo;.
e1d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
e1e0: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e   char *zDb;.  in
e1f0: 74 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20  t onoff;..  if( 
e200: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
e210: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
e220: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
e230: 20 22 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46   "DB-HANDLE ONOF
e240: 46 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  F");.    return 
e250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
e260: 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
e270: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a  ring(objv[1]);..
e280: 20 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65    /* Extract the
e290: 20 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   C database hand
e2a0: 6c 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20  le from the Tcl 
e2b0: 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a  command name */.
e2c0: 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f    if( !Tcl_GetCo
e2d0: 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70  mmandInfo(interp
e2e0: 2c 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29  , zDb, &cmdInfo)
e2f0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
e300: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
e310: 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
e320: 75 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68  und: ", zDb, (ch
e330: 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
e340: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
e350: 7d 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63  }.  db = ((struc
e360: 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49  t SqliteDb*)cmdI
e370: 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74  nfo.objClientDat
e380: 61 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74  a)->db;.  assert
e390: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20  (db);..  /* Get 
e3a0: 74 68 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65  the onoff parame
e3b0: 74 65 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c  ter */.  if( Tcl
e3c0: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
e3d0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
e3e0: 32 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20  2], &onoff) ){. 
e3f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
e400: 52 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66  ROR;.  }..#ifdef
e410: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
e420: 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63  D_EXTENSION.  Tc
e430: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
e440: 6e 74 65 72 70 2c 20 22 74 68 69 73 20 62 75 69  nterp, "this bui
e450: 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33  ld omits sqlite3
e460: 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28  _load_extension(
e470: 29 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )");.  return TC
e480: 4c 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20  L_ERROR;.#else. 
e490: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
e4a0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64  load_extension(d
e4b0: 62 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74  b, onoff);.  ret
e4c0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64  urn TCL_OK;.#end
e4d0: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  if.}../*.** Usag
e4e0: 65 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  e:  sqlite_abort
e4f0: 0a 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20  .**.** Shutdown 
e500: 74 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65  the process imme
e510: 64 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69  diately.  This i
e520: 73 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68  s not a clean sh
e530: 75 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20  utdown..** This 
e540: 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20  command is used 
e550: 74 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f  to test the reco
e560: 76 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20  verability of a 
e570: 64 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74  database in.** t
e580: 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72  he event of a pr
e590: 6f 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a  ogram crash..*/.
e5a0: 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
e5b0: 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65 5f  E_TCLAPI sqlite_
e5c0: 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a 4e  abort(.  void *N
e5d0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
e5e0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
e5f0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
e600: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
e610: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
e620: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
e630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e640: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
e650: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
e660: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
e670: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
e680: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
e690: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53 43  #if defined(_MSC
e6a0: 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65 20 64 6f  _VER).  /* We do
e6b0: 20 74 68 69 73 2c 20 6f 74 68 65 72 77 69 73 65   this, otherwise
e6c0: 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20 68   the test will h
e6d0: 61 6c 74 20 77 69 74 68 20 61 20 70 6f 70 75 70  alt with a popup
e6e0: 20 6d 65 73 73 61 67 65 0a 20 20 20 2a 20 74 68   message.   * th
e6f0: 61 74 20 77 65 20 68 61 76 65 20 74 6f 20 63 6c  at we have to cl
e700: 69 63 6b 20 61 77 61 79 20 62 65 66 6f 72 65 20  ick away before 
e710: 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20 63 6f  the test will co
e720: 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f 0a 20 20  ntinue..   */.  
e730: 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65 68 61 76  _set_abort_behav
e740: 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c 5f 52 45  ior( 0, _CALL_RE
e750: 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a 23 65 6e  PORTFAULT );.#en
e760: 64 69 66 0a 20 20 65 78 69 74 28 32 35 35 29 3b  dif.  exit(255);
e770: 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65 72  .  assert( inter
e780: 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68 69  p==0 );   /* Thi
e790: 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66 61  s will always fa
e7a0: 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  il */.  return T
e7b0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
e7c0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
e7d0: 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72 2d  utine is a user-
e7e0: 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e 63  defined SQL func
e7f0: 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70 6f  tion whose purpo
e800: 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73 74  se.** is to test
e810: 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74 5f   the sqlite_set_
e820: 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a 2f  result() API..*/
e830: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
e840: 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  tFunc(sqlite3_co
e850: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20  ntext *context, 
e860: 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74 65  int argc, sqlite
e870: 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29 7b  3_value **argv){
e880: 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e 3d  .  while( argc>=
e890: 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  2 ){.    const c
e8a0: 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 28 63 68  har *zArg0 = (ch
e8b0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
e8c0: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
e8d0: 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30 20 29  .    if( zArg0 )
e8e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  {.      if( 0==s
e8f0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
e900: 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a 20  rg0, "int") ){. 
e910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
e920: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
e930: 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  t, sqlite3_value
e940: 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b 0a  _int(argv[1]));.
e950: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e960: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
e970: 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d 30  Arg0,"int64")==0
e980: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e990: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36 34  te3_result_int64
e9a0: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
e9b0: 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61 72  3_value_int64(ar
e9c0: 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d  gv[1]));.      }
e9d0: 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
e9e0: 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 73  StrICmp(zArg0,"s
e9f0: 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20 20  tring")==0 ){.  
ea00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
ea10: 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65 78  sult_text(contex
ea20: 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65  t, (char*)sqlite
ea30: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
ea40: 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20 20  v[1]), -1,.     
ea50: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 52         SQLITE_TR
ea60: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
ea70: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
ea80: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
ea90: 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20  double")==0 ){. 
eaa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
eab0: 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f 6e  esult_double(con
eac0: 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61  text, sqlite3_va
ead0: 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76 5b  lue_double(argv[
eae0: 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  1]));.      }els
eaf0: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
eb00: 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c 6c  ICmp(zArg0,"null
eb10: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
eb20: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
eb30: 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a 20  null(context);. 
eb40: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
eb50: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
eb60: 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30 20  rg0,"value")==0 
eb70: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
eb80: 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65 28  e3_result_value(
eb90: 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73 71  context, argv[sq
eba0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
ebb0: 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20 20  argv[1])]);.    
ebc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ebd0: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
ebe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
ebf0: 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65  se{.      goto e
ec00: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
ec10: 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a 20      argc -= 2;. 
ec20: 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20 20     argv += 2;.  
ec30: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72 72  }.  return;..err
ec40: 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
ec50: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
ec60: 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61 72  ontext,"first ar
ec70: 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65  gument should be
ec80: 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20   one of: ".     
ec90: 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72 69   "int int64 stri
eca0: 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20 76  ng double null v
ecb0: 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f  alue", -1);.}../
ecc0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
ecd0: 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65  lite_register_te
ece0: 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42 20  st_function  DB 
ecf0: 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67 69   NAME.**.** Regi
ed00: 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53 51  ster the test SQ
ed10: 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74 68  L function on th
ed20: 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75 6e  e database DB un
ed30: 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41 4d  der the name NAM
ed40: 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  E..*/.static int
ed50: 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
ed60: 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e  est_register_fun
ed70: 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  c(.  void *NotUs
ed80: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
ed90: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
eda0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
edb0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
edc0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
edd0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
ede0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
edf0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
ee00: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
ee10: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
ee20: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
ee30: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
ee40: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
ee50: 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21   rc;.  if( argc!
ee60: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
ee70: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
ee80: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
ee90: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
eea0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
eeb0: 20 20 22 20 44 42 20 46 55 4e 43 54 49 4f 4e 2d    " DB FUNCTION-
eec0: 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  NAME", 0);.    r
eed0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
eee0: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
eef0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
ef00: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
ef10: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ef20: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
ef30: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
ef40: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 2d 31  (db, argv[2], -1
ef50: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
ef60: 2c 20 0a 20 20 20 20 20 20 74 65 73 74 46 75 6e  , .      testFun
ef70: 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  c, 0, 0);.  if( 
ef80: 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c  rc!=0 ){.    Tcl
ef90: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
efa0: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
efb0: 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  Str(rc), 0);.   
efc0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
efd0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
efe0: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
eff0: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
f000: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
f010: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
f020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
f030: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 66 69  age:  sqlite3_fi
f040: 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20 0a 2a 2a  nalize  STMT .**
f050: 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20 61 20 73  .** Finalize a s
f060: 74 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e  tatement handle.
f070: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
f080: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
f090: 74 5f 66 69 6e 61 6c 69 7a 65 28 0a 20 20 76 6f  t_finalize(.  vo
f0a0: 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
f0b0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
f0c0: 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
f0d0: 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
f0e0: 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
f0f0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
f100: 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
f110: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30   sqlite3 *db = 0
f120: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
f130: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
f140: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
f150: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
f160: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
f170: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
f180: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
f190: 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54  [0], 0), " <STMT
f1a0: 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  >", 0);.    retu
f1b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f1c0: 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
f1d0: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
f1e0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
f1f0: 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
f200: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
f210: 4f 52 3b 0a 0a 20 20 69 66 28 20 70 53 74 6d 74  OR;..  if( pStmt
f220: 20 29 7b 0a 20 20 20 20 64 62 20 3d 20 53 74 6d   ){.    db = Stm
f230: 74 54 6f 44 62 28 70 53 74 6d 74 29 3b 0a 20 20  tToDb(pStmt);.  
f240: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
f250: 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
f260: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
f270: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
f280: 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
f290: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
f2a0: 20 20 69 66 28 20 64 62 20 26 26 20 73 71 6c 69    if( db && sqli
f2b0: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
f2c0: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
f2d0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f2e0: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
f2f0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
f300: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ge:  sqlite3_stm
f310: 74 5f 73 74 61 74 75 73 20 20 53 54 4d 54 20 20  t_status  STMT  
f320: 43 4f 44 45 20 20 52 45 53 45 54 46 4c 41 47 0a  CODE  RESETFLAG.
f330: 2a 2a 0a 2a 2a 20 47 65 74 20 74 68 65 20 76 61  **.** Get the va
f340: 6c 75 65 20 6f 66 20 61 20 73 74 61 74 75 73 20  lue of a status 
f350: 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 61 20 73  counter from a s
f360: 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  tatement..*/.sta
f370: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
f380: 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f  CLAPI test_stmt_
f390: 73 74 61 74 75 73 28 0a 20 20 76 6f 69 64 20 2a  status(.  void *
f3a0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
f3b0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
f3c0: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
f3d0: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
f3e0: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
f3f0: 69 56 61 6c 75 65 3b 0a 20 20 69 6e 74 20 69 2c  iValue;.  int i,
f400: 20 6f 70 20 3d 20 30 2c 20 72 65 73 65 74 46 6c   op = 0, resetFl
f410: 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ag;.  const char
f420: 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20 73 71 6c   *zOpName;.  sql
f430: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
f440: 3b 0a 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ;..  static cons
f450: 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63  t struct {.    c
f460: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
f470: 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20  ;.    int op;.  
f480: 7d 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  } aOp[] = {.    
f490: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
f4a0: 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54  ATUS_FULLSCAN_ST
f4b0: 45 50 22 2c 20 20 20 53 51 4c 49 54 45 5f 53 54  EP",   SQLITE_ST
f4c0: 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41  MTSTATUS_FULLSCA
f4d0: 4e 5f 53 54 45 50 20 20 20 7d 2c 0a 20 20 20 20  N_STEP   },.    
f4e0: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
f4f0: 41 54 55 53 5f 53 4f 52 54 22 2c 20 20 20 20 20  ATUS_SORT",     
f500: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
f510: 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 20 20 20  MTSTATUS_SORT   
f520: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
f530: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
f540: 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 22 2c  ATUS_AUTOINDEX",
f550: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
f560: 4d 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44  MTSTATUS_AUTOIND
f570: 45 58 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  EX       },.    
f580: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
f590: 41 54 55 53 5f 56 4d 5f 53 54 45 50 22 2c 20 20  ATUS_VM_STEP",  
f5a0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
f5b0: 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50  MTSTATUS_VM_STEP
f5c0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
f5d0: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
f5e0: 41 54 55 53 5f 52 45 50 52 45 50 41 52 45 22 2c  ATUS_REPREPARE",
f5f0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
f600: 4d 54 53 54 41 54 55 53 5f 52 45 50 52 45 50 41  MTSTATUS_REPREPA
f610: 52 45 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  RE       },.    
f620: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
f630: 41 54 55 53 5f 52 55 4e 22 2c 20 20 20 20 20 20  ATUS_RUN",      
f640: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
f650: 4d 54 53 54 41 54 55 53 5f 52 55 4e 20 20 20 20  MTSTATUS_RUN    
f660: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
f670: 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  { "SQLITE_STMTST
f680: 41 54 55 53 5f 4d 45 4d 55 53 45 44 22 2c 20 20  ATUS_MEMUSED",  
f690: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 54         SQLITE_ST
f6a0: 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44  MTSTATUS_MEMUSED
f6b0: 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b           },.  };
f6c0: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
f6d0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
f6e0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
f6f0: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 50 41  , objv, "STMT PA
f700: 52 41 4d 45 54 45 52 20 52 45 53 45 54 46 4c 41  RAMETER RESETFLA
f710: 47 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  G");.    return 
f720: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
f730: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
f740: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
f750: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
f760: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
f770: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f780: 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 54 63 6c 5f    zOpName = Tcl_
f790: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
f7a0: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
f7b0: 3c 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29 3b  <ArraySize(aOp);
f7c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
f7d0: 74 72 63 6d 70 28 61 4f 70 5b 69 5d 2e 7a 4e 61  trcmp(aOp[i].zNa
f7e0: 6d 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d 3d 30 20  me, zOpName)==0 
f7f0: 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d 20 61 4f  ){.      op = aO
f800: 70 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20 20 20 62  p[i].op;.      b
f810: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
f820: 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69    if( i>=ArraySi
f830: 7a 65 28 61 4f 70 29 20 29 7b 0a 20 20 20 20 69  ze(aOp) ){.    i
f840: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
f850: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
f860: 76 5b 32 5d 2c 20 26 6f 70 29 20 29 20 72 65 74  v[2], &op) ) ret
f870: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
f880: 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
f890: 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69  BooleanFromObj(i
f8a0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
f8b0: 26 72 65 73 65 74 46 6c 61 67 29 20 29 20 72 65  &resetFlag) ) re
f8c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f8d0: 20 20 69 56 61 6c 75 65 20 3d 20 73 71 6c 69 74    iValue = sqlit
f8e0: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
f8f0: 53 74 6d 74 2c 20 6f 70 2c 20 72 65 73 65 74 46  Stmt, op, resetF
f900: 6c 61 67 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  lag);.  Tcl_SetO
f910: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
f920: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69   Tcl_NewIntObj(i
f930: 56 61 6c 75 65 29 29 3b 0a 20 20 72 65 74 75 72  Value));.  retur
f940: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
f950: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f960: 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
f970: 53 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  S./*.** Usage:  
f980: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
f990: 6e 73 74 61 74 75 73 20 53 54 4d 54 20 49 44 58  nstatus STMT IDX
f9a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
f9b0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
f9c0: 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  t_stmt_scanstatu
f9d0: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
f9e0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
f9f0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
fa00: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
fa10: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
fa20: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
fa30: 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20 20  tmt *pStmt;     
fa40: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
fa50: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 69 6e  argument */.  in
fa60: 74 20 69 64 78 3b 20 20 20 20 20 20 20 20 20 20  t idx;          
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa80: 20 53 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   Second argument
fa90: 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61   */..  const cha
faa0: 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73  r *zName;.  cons
fab0: 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e  t char *zExplain
fac0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
fad0: 34 20 6e 4c 6f 6f 70 3b 0a 20 20 73 71 6c 69 74  4 nLoop;.  sqlit
fae0: 65 33 5f 69 6e 74 36 34 20 6e 56 69 73 69 74 3b  e3_int64 nVisit;
faf0: 0a 20 20 64 6f 75 62 6c 65 20 72 45 73 74 3b 0a  .  double rEst;.
fb00: 20 20 69 6e 74 20 72 65 73 3b 0a 0a 20 20 69 66    int res;..  if
fb10: 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
fb20: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
fb30: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
fb40: 76 2c 20 22 53 54 4d 54 20 49 44 58 22 29 3b 0a  v, "STMT IDX");.
fb50: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
fb60: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
fb70: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
fb80: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
fb90: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
fba0: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
fbb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
fbc0: 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
fbd0: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
fbe0: 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
fbf0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
fc00: 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f 73   res = sqlite3_s
fc10: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
fc20: 53 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49 54  Stmt, idx, SQLIT
fc30: 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50  E_SCANSTAT_NLOOP
fc40: 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29  , (void*)&nLoop)
fc50: 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29  ;.  if( res==0 )
fc60: 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  {.    Tcl_Obj *p
fc70: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
fc80: 28 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ();.    Tcl_List
fc90: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fca0: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
fcb0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 4c 6f 6f  wStringObj("nLoo
fcc0: 70 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  p", -1));.    Tc
fcd0: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
fce0: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
fcf0: 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
fd00: 6a 28 6e 4c 6f 6f 70 29 29 3b 0a 20 20 20 20 73  j(nLoop));.    s
fd10: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
fd20: 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69 64  status(pStmt, id
fd30: 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  x, SQLITE_SCANST
fd40: 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64  AT_NVISIT, (void
fd50: 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20  *)&nVisit);.    
fd60: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
fd70: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
fd80: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fd90: 62 6a 28 22 6e 56 69 73 69 74 22 2c 20 2d 31 29  bj("nVisit", -1)
fda0: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
fdb0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
fdc0: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
fdd0: 57 69 64 65 49 6e 74 4f 62 6a 28 6e 56 69 73 69  WideIntObj(nVisi
fde0: 74 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t));.    sqlite3
fdf0: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
fe00: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c  (pStmt, idx, SQL
fe10: 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54  ITE_SCANSTAT_EST
fe20: 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b  , (void*)&rEst);
fe30: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
fe40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
fe50: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
fe60: 72 69 6e 67 4f 62 6a 28 22 6e 45 73 74 22 2c 20  ringObj("nEst", 
fe70: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  -1));.    Tcl_Li
fe80: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
fe90: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
fea0: 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72 45 73  NewDoubleObj(rEs
feb0: 74 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t));.    sqlite3
fec0: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
fed0: 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c  (pStmt, idx, SQL
fee0: 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 41 4d  ITE_SCANSTAT_NAM
fef0: 45 2c 20 28 76 6f 69 64 2a 29 26 7a 4e 61 6d 65  E, (void*)&zName
ff00: 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  );.    Tcl_ListO
ff10: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
ff20: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
ff30: 53 74 72 69 6e 67 4f 62 6a 28 22 7a 4e 61 6d 65  StringObj("zName
ff40: 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c  ", -1));.    Tcl
ff50: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ff60: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
ff70: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
ff80: 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 20  zName, -1));.   
ff90: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
ffa0: 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20  anstatus(pStmt, 
ffb0: 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  idx, SQLITE_SCAN
ffc0: 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76  STAT_EXPLAIN, (v
ffd0: 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b  oid*)&zExplain);
ffe0: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
fff0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
10000 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
10010 72 69 6e 67 4f 62 6a 28 22 7a 45 78 70 6c 61 69  ringObj("zExplai
10020 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63  n", -1));.    Tc
10030 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
10040 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
10050 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10060 28 7a 45 78 70 6c 61 69 6e 2c 20 2d 31 29 29 3b  (zExplain, -1));
10070 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
10080 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
10090 65 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  et);.  }else{.  
100a0 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
100b0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 20  t(interp);.  }. 
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 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
100f0 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74 20 20  anstatus_reset  
10100 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69  STMT.*/.static i
10110 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
10120 20 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73   test_stmt_scans
10130 74 61 74 75 73 5f 72 65 73 65 74 28 0a 20 20 76  tatus_reset(.  v
10140 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10150 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
10160 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
10170 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
10180 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
10190 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
101a0 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
101b0 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65   /* First argume
101c0 6e 74 20 2a 2f 0a 20 20 69 66 28 20 6f 62 6a 63  nt */.  if( objc
101d0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
101e0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
101f0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54  rp, 1, objv, "ST
10200 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  MT");.    return
10210 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10220 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
10230 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
10240 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10250 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
10260 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10270 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  .  sqlite3_stmt_
10280 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73 65 74  scanstatus_reset
10290 28 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72  (pStmt);.  retur
102a0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
102b0 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
102c0 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
102d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
102e0 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 73 71 6c  lite3_config_sql
102f0 6c 6f 67 0a 2a 2a 0a 2a 2a 20 5a 65 72 6f 20 74  log.**.** Zero t
10300 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  he SQLITE_CONFIG
10310 5f 53 51 4c 4c 4f 47 20 63 6f 6e 66 69 67 75 72  _SQLLOG configur
10320 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
10330 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
10340 49 20 74 65 73 74 5f 63 6f 6e 66 69 67 5f 73 71  I test_config_sq
10350 6c 6c 6f 67 28 0a 20 20 76 6f 69 64 20 2a 20 63  llog(.  void * c
10360 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10370 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10380 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10390 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
103a0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62  jv[].){.  if( ob
103b0 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
103c0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
103d0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
103e0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
103f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10400 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
10410 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c  QLITE_CONFIG_SQL
10420 4c 4f 47 2c 20 30 2c 20 30 29 3b 0a 20 20 72 65  LOG, 0, 0);.  re
10430 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
10440 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  endif../*.** Usa
10450 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  ge:  sqlite3_con
10460 66 69 67 5f 73 6f 72 74 65 72 72 65 66 0a 2a 2a  fig_sorterref.**
10470 0a 2a 2a 20 53 65 74 20 74 68 65 20 53 51 4c 49  .** Set the SQLI
10480 54 45 5f 43 4f 4e 46 49 47 5f 53 4f 52 54 45 52  TE_CONFIG_SORTER
10490 52 45 46 5f 53 49 5a 45 20 63 6f 6e 66 69 67 75  REF_SIZE configu
104a0 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 0a 2a 2f  ration option.*/
104b0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
104c0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
104d0 6f 6e 66 69 67 5f 73 6f 72 74 65 72 72 65 66 28  onfig_sorterref(
104e0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
104f0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
10500 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
10510 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
10520 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
10530 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 3b 0a 20  ){.  int iVal;. 
10540 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10550 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10560 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
10570 6f 62 6a 76 2c 20 22 4e 42 59 54 45 22 29 3b 0a  objv, "NBYTE");.
10580 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10590 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
105a0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
105b0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  j(interp, objv[1
105c0 5d 2c 20 26 69 56 61 6c 29 20 29 20 72 65 74 75  ], &iVal) ) retu
105d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
105e0 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
105f0 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 4f 52  QLITE_CONFIG_SOR
10600 54 45 52 52 45 46 5f 53 49 5a 45 2c 20 69 56 61  TERREF_SIZE, iVa
10610 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  l);.  return TCL
10620 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
10630 61 67 65 3a 20 76 66 73 5f 63 75 72 72 65 6e 74  age: vfs_current
10640 5f 74 69 6d 65 5f 69 6e 74 36 34 0a 2a 2a 0a 2a  _time_int64.**.*
10650 2a 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c  * Return the val
10660 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
10670 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 27 73  he default VFS's
10680 20 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74   xCurrentTimeInt
10690 36 34 20 6d 65 74 68 6f 64 2e 0a 2a 2f 0a 73 74  64 method..*/.st
106a0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
106b0 54 43 4c 41 50 49 20 76 66 73 43 75 72 72 65 6e  TCLAPI vfsCurren
106c0 74 54 69 6d 65 49 6e 74 36 34 28 0a 20 20 76 6f  tTimeInt64(.  vo
106d0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
106e0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
106f0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
10700 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
10710 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
10720 69 36 34 20 74 3b 0a 20 20 73 71 6c 69 74 65 33  i64 t;.  sqlite3
10730 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 73 71 6c  _vfs *pVfs = sql
10740 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
10750 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
10760 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
10770 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
10780 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20  1, objv, "");.  
10790 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
107a0 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 66 73 2d 3e  OR;.  }.  pVfs->
107b0 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
107c0 34 28 70 56 66 73 2c 20 26 74 29 3b 0a 20 20 54  4(pVfs, &t);.  T
107d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
107e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
107f0 69 64 65 49 6e 74 4f 62 6a 28 74 29 29 3b 0a 20  ideIntObj(t));. 
10800 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10810 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
10820 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
10830 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
10840 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67  lite3_snapshot_g
10850 65 74 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a  et DB DBNAME.*/.
10860 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
10870 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e  E_TCLAPI test_sn
10880 61 70 73 68 6f 74 5f 67 65 74 28 0a 20 20 76 6f  apshot_get(.  vo
10890 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
108a0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
108b0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
108c0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
108d0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
108e0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
108f0 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a  3 *db;.  char *z
10900 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Name;.  sqlite3_
10910 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70 73  snapshot *pSnaps
10920 68 6f 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  hot = 0;..  if( 
10930 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
10940 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
10950 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
10960 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20   "DB DBNAME");. 
10970 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
10980 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
10990 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
109a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
109b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
109c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
109d0 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54  ROR;.  zName = T
109e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
109f0 76 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73  v[2]);..  rc = s
10a00 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
10a10 67 65 74 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 26  get(db, zName, &
10a20 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 69 66  pSnapshot);.  if
10a30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10a40 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
10a50 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10a60 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
10a70 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  (sqlite3ErrName(
10a80 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72  rc), -1));.    r
10a90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10aa0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
10ab0 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20  ar zBuf[100];.  
10ac0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
10ad0 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
10ae0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
10af0 6e 61 70 73 68 6f 74 29 20 29 20 72 65 74 75 72  napshot) ) retur
10b00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
10b10 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10b20 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10b30 77 53 74 72 69 6e 67 4f 62 6a 28 7a 42 75 66 2c  wStringObj(zBuf,
10b40 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74   -1));.  }.  ret
10b50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
10b60 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
10b70 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
10b80 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
10b90 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
10ba0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
10bb0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72  lite3_snapshot_r
10bc0 65 63 6f 76 65 72 20 44 42 20 44 42 4e 41 4d 45  ecover DB DBNAME
10bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
10be0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
10bf0 74 5f 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76  t_snapshot_recov
10c00 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
10c10 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10c20 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10c30 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10c40 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10c50 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
10c60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
10c70 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 0a 20   char *zName;.. 
10c80 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
10c90 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
10ca0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
10cb0 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
10cc0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
10cd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10ce0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
10cf0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10d00 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10d10 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
10d20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d  CL_ERROR;.  zNam
10d30 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
10d40 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 72  g(objv[2]);..  r
10d50 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  c = sqlite3_snap
10d60 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 64 62 2c  shot_recover(db,
10d70 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 72   zName);.  if( r
10d80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
10d90 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
10da0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
10db0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
10dc0 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
10dd0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75  , -1));.    retu
10de0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10df0 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 52  }else{.    Tcl_R
10e00 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
10e10 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  p);.  }.  return
10e20 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
10e30 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42  f /* SQLITE_ENAB
10e40 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a  LE_SNAPSHOT */..
10e50 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
10e60 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a  ABLE_SNAPSHOT./*
10e70 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
10e80 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e  e3_snapshot_open
10e90 20 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53   DB DBNAME SNAPS
10ea0 48 4f 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  HOT.*/.static in
10eb0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
10ec0 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  test_snapshot_op
10ed0 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  en(.  void * cli
10ee0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
10ef0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
10f00 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
10f10 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
10f20 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
10f30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
10f40 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
10f50 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10f60 20 2a 70 53 6e 61 70 73 68 6f 74 3b 0a 0a 20 20   *pSnapshot;..  
10f70 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
10f80 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10f90 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
10fa0 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20  bjv, "DB DBNAME 
10fb0 53 4e 41 50 53 48 4f 54 22 29 3b 0a 20 20 20 20  SNAPSHOT");.    
10fc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10fd0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
10fe0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
10ff0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
11000 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
11010 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11020 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f  ;.  zName = Tcl_
11030 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
11040 5d 29 3b 0a 20 20 70 53 6e 61 70 73 68 6f 74 20  ]);.  pSnapshot 
11050 3d 20 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  = (sqlite3_snaps
11060 68 6f 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74  hot*)sqlite3Test
11070 54 65 78 74 54 6f 50 74 72 28 54 63 6c 5f 47 65  TextToPtr(Tcl_Ge
11080 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
11090 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
110a0 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e  e3_snapshot_open
110b0 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 70 53 6e 61  (db, zName, pSna
110c0 70 73 68 6f 74 29 3b 0a 20 20 69 66 28 20 72 63  pshot);.  if( rc
110d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
110e0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
110f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
11100 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
11110 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
11120 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72   -1));.    retur
11130 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
11140 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 52 65  else{.    Tcl_Re
11150 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
11160 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
11170 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
11180 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
11190 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23  E_SNAPSHOT */..#
111a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
111b0 42 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a  BLE_SNAPSHOT./*.
111c0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
111d0 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 20  3_snapshot_free 
111e0 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a 73 74 61 74  SNAPSHOT.*/.stat
111f0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
11200 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68  LAPI test_snapsh
11210 6f 74 5f 66 72 65 65 28 0a 20 20 76 6f 69 64 20  ot_free(.  void 
11220 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
11230 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11240 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11250 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11260 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
11270 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
11280 53 6e 61 70 73 68 6f 74 3b 0a 20 20 69 66 28 20  Snapshot;.  if( 
11290 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
112a0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
112b0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
112c0 20 22 53 4e 41 50 53 48 4f 54 22 29 3b 0a 20 20   "SNAPSHOT");.  
112d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
112e0 4f 52 3b 0a 20 20 7d 0a 20 20 70 53 6e 61 70 73  OR;.  }.  pSnaps
112f0 68 6f 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73  hot = (sqlite3_s
11300 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74 65 33  napshot*)sqlite3
11310 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 54 63  TestTextToPtr(Tc
11320 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11330 5b 31 5d 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  [1]));.  sqlite3
11340 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 70  _snapshot_free(p
11350 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 72 65 74  Snapshot);.  ret
11360 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
11370 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
11380 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
11390 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
113a0 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
113b0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
113c0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63  lite3_snapshot_c
113d0 6d 70 20 53 4e 41 50 53 48 4f 54 31 20 53 4e 41  mp SNAPSHOT1 SNA
113e0 50 53 48 4f 54 32 0a 2a 2f 0a 73 74 61 74 69 63  PSHOT2.*/.static
113f0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
11400 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74  PI test_snapshot
11410 5f 63 6d 70 28 0a 20 20 76 6f 69 64 20 2a 20 63  _cmp(.  void * c
11420 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
11430 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11440 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
11450 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
11460 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 65  jv[].){.  int re
11470 73 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61  s;.  sqlite3_sna
11480 70 73 68 6f 74 20 2a 70 31 3b 0a 20 20 73 71 6c  pshot *p1;.  sql
11490 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
114a0 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  2;.  if( objc!=3
114b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
114c0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
114d0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4e 41 50 53   1, objv, "SNAPS
114e0 48 4f 54 31 20 53 4e 41 50 53 48 4f 54 32 22 29  HOT1 SNAPSHOT2")
114f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
11500 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 31  _ERROR;.  }.  p1
11510 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 6e 61 70   = (sqlite3_snap
11520 73 68 6f 74 2a 29 73 71 6c 69 74 65 33 54 65 73  shot*)sqlite3Tes
11530 74 54 65 78 74 54 6f 50 74 72 28 54 63 6c 5f 47  tTextToPtr(Tcl_G
11540 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
11550 29 29 3b 0a 20 20 70 32 20 3d 20 28 73 71 6c 69  ));.  p2 = (sqli
11560 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71  te3_snapshot*)sq
11570 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50  lite3TestTextToP
11580 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  tr(Tcl_GetString
11590 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a 20 20 72 65  (objv[2]));.  re
115a0 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  s = sqlite3_snap
115b0 73 68 6f 74 5f 63 6d 70 28 70 31 2c 20 70 32 29  shot_cmp(p1, p2)
115c0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
115d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
115e0 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73 29 29  _NewIntObj(res))
115f0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
11600 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
11610 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
11620 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66  PSHOT */..#ifdef
11630 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
11640 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73  NAPSHOT./*.** Us
11650 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61  age: sqlite3_sna
11660 70 73 68 6f 74 5f 67 65 74 5f 62 6c 6f 62 20 44  pshot_get_blob D
11670 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74  B DBNAME.*/.stat
11680 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
11690 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68  LAPI test_snapsh
116a0 6f 74 5f 67 65 74 5f 62 6c 6f 62 28 0a 20 20 76  ot_get_blob(.  v
116b0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
116c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
116d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
116e0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
116f0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
11700 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
11710 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a  e3 *db;.  char *
11720 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  zName;.  sqlite3
11730 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61 70  _snapshot *pSnap
11740 73 68 6f 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28  shot = 0;..  if(
11750 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
11760 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
11770 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
11780 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a  , "DB DBNAME");.
11790 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
117a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
117b0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
117c0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
117d0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
117e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
117f0 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20  RROR;.  zName = 
11800 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11810 6a 76 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20  jv[2]);..  rc = 
11820 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11830 5f 67 65 74 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  _get(db, zName, 
11840 26 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 69  &pSnapshot);.  i
11850 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11860 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
11870 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
11880 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11890 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  j(sqlite3ErrName
118a0 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20  (rc), -1));.    
118b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
118c0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54  ;.  }else{.    T
118d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
118e0 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 20 20  interp, .       
118f0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
11900 79 4f 62 6a 28 28 75 6e 73 69 67 6e 65 64 20 63  yObj((unsigned c
11910 68 61 72 2a 29 70 53 6e 61 70 73 68 6f 74 2c 20  har*)pSnapshot, 
11920 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 73  sizeof(sqlite3_s
11930 6e 61 70 73 68 6f 74 29 29 0a 20 20 20 20 29 3b  napshot)).    );
11940 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 61  .    sqlite3_sna
11950 70 73 68 6f 74 5f 66 72 65 65 28 70 53 6e 61 70  pshot_free(pSnap
11960 73 68 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74  shot);.  }.  ret
11970 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
11980 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
11990 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
119a0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
119b0 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
119c0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55 73 61 67 65  .  /*.  ** Usage
119d0 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  : sqlite3_snapsh
119e0 6f 74 5f 6f 70 65 6e 5f 62 6c 6f 62 20 44 42 20  ot_open_blob DB 
119f0 44 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 0a  DBNAME SNAPSHOT.
11a00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
11a10 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
11a20 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 5f 62  _snapshot_open_b
11a30 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  lob(.  void * cl
11a40 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
11a50 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
11a60 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
11a70 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
11a80 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  v[].){.  int rc;
11a90 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
11aa0 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
11ab0 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
11ac0 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 42 6c  pBlob;.  int nBl
11ad0 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ob;..  if( objc!
11ae0 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
11af0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
11b00 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
11b10 44 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 22  DBNAME SNAPSHOT"
11b20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11b30 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
11b40 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
11b50 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
11b60 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
11b70 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
11b80 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d 65  L_ERROR;.  zName
11b90 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
11ba0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 70 42 6c  (objv[2]);.  pBl
11bb0 6f 62 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ob = Tcl_GetByte
11bc0 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
11bd0 76 5b 33 5d 2c 20 26 6e 42 6c 6f 62 29 3b 0a 20  v[3], &nBlob);. 
11be0 20 69 66 28 20 6e 42 6c 6f 62 21 3d 73 69 7a 65   if( nBlob!=size
11bf0 6f 66 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  of(sqlite3_snaps
11c00 68 6f 74 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  hot) ){.    Tcl_
11c10 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
11c20 65 72 70 2c 20 22 62 61 64 20 53 4e 41 50 53 48  erp, "bad SNAPSH
11c30 4f 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  OT", 0);.    ret
11c40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11c50 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
11c60 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28  3_snapshot_open(
11c70 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 73 71 6c 69  db, zName, (sqli
11c80 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 70 42  te3_snapshot*)pB
11c90 6c 6f 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  lob);.  if( rc!=
11ca0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11cb0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
11cc0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
11cd0 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
11ce0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d  e3ErrName(rc), -
11cf0 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  1));.    return 
11d00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11d10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11d20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11d30 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
11d40 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OT */..#ifdef SQ
11d50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
11d60 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  SHOT./*.** Usage
11d70 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  : sqlite3_snapsh
11d80 6f 74 5f 63 6d 70 5f 62 6c 6f 62 20 53 4e 41 50  ot_cmp_blob SNAP
11d90 53 48 4f 54 31 20 53 4e 41 50 53 48 4f 54 32 0a  SHOT1 SNAPSHOT2.
11da0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
11db0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
11dc0 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 5f 62 6c  _snapshot_cmp_bl
11dd0 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ob(.  void * cli
11de0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
11df0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
11e00 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
11e10 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
11e20 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 65 73 3b  [].){.  int res;
11e30 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
11e40 20 2a 70 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64   *p1;.  unsigned
11e50 20 63 68 61 72 20 2a 70 32 3b 0a 20 20 69 6e 74   char *p2;.  int
11e60 20 6e 31 3b 0a 20 20 69 6e 74 20 6e 32 3b 0a 0a   n1;.  int n2;..
11e70 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
11e80 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
11e90 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
11ea0 20 6f 62 6a 76 2c 20 22 53 4e 41 50 53 48 4f 54   objv, "SNAPSHOT
11eb0 31 20 53 4e 41 50 53 48 4f 54 32 22 29 3b 0a 20  1 SNAPSHOT2");. 
11ec0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11ed0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 31 20 3d  ROR;.  }..  p1 =
11ee0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
11ef0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d  yFromObj(objv[1]
11f00 2c 20 26 6e 31 29 3b 0a 20 20 70 32 20 3d 20 54  , &n1);.  p2 = T
11f10 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46  cl_GetByteArrayF
11f20 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20  romObj(objv[2], 
11f30 26 6e 32 29 3b 0a 0a 20 20 69 66 28 20 6e 31 21  &n2);..  if( n1!
11f40 3d 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f  =sizeof(sqlite3_
11f50 73 6e 61 70 73 68 6f 74 29 20 7c 7c 20 6e 31 21  snapshot) || n1!
11f60 3d 6e 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  =n2 ){.    Tcl_A
11f70 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11f80 72 70 2c 20 22 62 61 64 20 53 4e 41 50 53 48 4f  rp, "bad SNAPSHO
11f90 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
11fa0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11fb0 7d 0a 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  }..  res = sqlit
11fc0 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28  e3_snapshot_cmp(
11fd0 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  (sqlite3_snapsho
11fe0 74 2a 29 70 31 2c 20 28 73 71 6c 69 74 65 33 5f  t*)p1, (sqlite3_
11ff0 73 6e 61 70 73 68 6f 74 2a 29 70 32 29 3b 0a 20  snapshot*)p2);. 
12000 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
12010 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
12020 77 49 6e 74 4f 62 6a 28 72 65 73 29 29 3b 0a 20  wIntObj(res));. 
12030 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
12040 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12050 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
12060 4f 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OT */../*.** Usa
12070 67 65 3a 20 73 71 6c 69 74 65 33 5f 64 65 6c 65  ge: sqlite3_dele
12080 74 65 5f 64 61 74 61 62 61 73 65 20 46 49 4c 45  te_database FILE
12090 4e 41 4d 45 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  NAME.*/.int sqli
120a0 74 65 33 5f 64 65 6c 65 74 65 5f 64 61 74 61 62  te3_delete_datab
120b0 61 73 65 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  ase(const char*)
120c0 3b 20 20 20 2f 2a 20 69 6e 20 74 65 73 74 5f 64  ;   /* in test_d
120d0 65 6c 65 74 65 2e 63 20 2a 2f 0a 73 74 61 74 69  elete.c */.stati
120e0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
120f0 41 50 49 20 74 65 73 74 5f 64 65 6c 65 74 65 5f  API test_delete_
12100 64 61 74 61 62 61 73 65 28 0a 20 20 76 6f 69 64  database(.  void
12110 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
12120 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
12130 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
12140 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
12150 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
12160 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
12170 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 69 66 28  ar *zFile;.  if(
12180 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
12190 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
121a0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
121b0 2c 20 22 46 49 4c 45 22 29 3b 0a 20 20 20 20 72  , "FILE");.    r
121c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
121d0 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 20 3d 20 28  .  }.  zFile = (
121e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 54 63 6c 5f  const char*)Tcl_
121f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
12200 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ]);.  rc = sqlit
12210 65 33 5f 64 65 6c 65 74 65 5f 64 61 74 61 62 61  e3_delete_databa
12220 73 65 28 7a 46 69 6c 65 29 3b 0a 0a 20 20 54 63  se(zFile);..  Tc
12230 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
12240 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
12250 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45  ringObj(sqlite3E
12260 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29  rrName(rc), -1))
12270 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
12280 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
12290 65 3a 20 61 74 6f 6d 69 63 5f 62 61 74 63 68 5f  e: atomic_batch_
122a0 77 72 69 74 65 20 50 41 54 48 0a 2a 2f 0a 73 74  write PATH.*/.st
122b0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
122c0 54 43 4c 41 50 49 20 74 65 73 74 5f 61 74 6f 6d  TCLAPI test_atom
122d0 69 63 5f 62 61 74 63 68 5f 77 72 69 74 65 28 0a  ic_batch_write(.
122e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
122f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
12300 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
12310 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
12320 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
12330 7b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 20  {.  char *zFile 
12340 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12350 20 20 20 20 2f 2a 20 50 61 74 68 20 74 6f 20 66      /* Path to f
12360 69 6c 65 20 74 6f 20 74 65 73 74 20 2a 2f 0a 20  ile to test */. 
12370 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30   sqlite3 *db = 0
12380 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12390 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
123a0 64 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  dle */.  sqlite3
123b0 5f 66 69 6c 65 20 2a 70 46 64 20 3d 20 30 3b 20  _file *pFd = 0; 
123c0 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 69           /* SQLi
123d0 74 65 20 66 64 20 6f 70 65 6e 20 6f 6e 20 7a 46  te fd open on zF
123e0 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ile */.  int bRe
123f0 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  s = 0;          
12400 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65           /* Inte
12410 67 65 72 20 72 65 73 75 6c 74 20 6f 66 20 74 68  ger result of th
12420 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
12430 69 6e 74 20 64 63 20 3d 20 30 3b 20 20 20 20 20  int dc = 0;     
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 2f 2a 20 44 65 76 69 63 65 2d 63 68 61 72 61 63  /* Device-charac
12460 74 65 72 69 73 74 69 63 73 20 6d 61 73 6b 20 2a  teristics mask *
12470 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
12480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12490 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 6f      /* sqlite3_o
124a0 70 65 6e 28 29 20 72 65 74 75 72 6e 20 63 6f 64  pen() return cod
124b0 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  e */..  if( objc
124c0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
124d0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
124e0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41  rp, 1, objv, "PA
124f0 54 48 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TH");.    return
12500 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
12510 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f 47 65    zFile = Tcl_Ge
12520 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
12530 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
12540 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 26 64  3_open(zFile, &d
12550 62 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  b);.  if( rc!=SQ
12560 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
12570 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12580 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
12590 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a  errmsg(db), 0);.
125a0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
125b0 65 28 64 62 29 3b 0a 20 20 20 20 72 65 74 75 72  e(db);.    retur
125c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
125d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
125e0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
125f0 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
12600 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
12610 54 45 52 2c 20 28 76 6f 69 64 2a 29 26 70 46 64  TER, (void*)&pFd
12620 29 3b 0a 20 20 64 63 20 3d 20 70 46 64 2d 3e 70  );.  dc = pFd->p
12630 4d 65 74 68 6f 64 73 2d 3e 78 44 65 76 69 63 65  Methods->xDevice
12640 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
12650 70 46 64 29 3b 0a 20 20 69 66 28 20 64 63 20 26  pFd);.  if( dc &
12660 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 42 41   SQLITE_IOCAP_BA
12670 54 43 48 5f 41 54 4f 4d 49 43 20 29 7b 0a 20 20  TCH_ATOMIC ){.  
12680 20 20 62 52 65 73 20 3d 20 31 3b 0a 20 20 7d 0a    bRes = 1;.  }.
12690 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
126a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
126b0 4e 65 77 49 6e 74 4f 62 6a 28 62 52 65 73 29 29  NewIntObj(bRes))
126c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  ;.  sqlite3_clos
126d0 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(db);.  return 
126e0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
126f0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
12700 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44 42 20 20  _next_stmt  DB  
12710 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
12720 6e 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 6d  n the next statm
12730 65 6e 74 20 69 6e 20 73 65 71 75 65 6e 63 65 20  ent in sequence 
12740 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a 73  after STMT..*/.s
12750 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
12760 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6e 65 78  _TCLAPI test_nex
12770 74 5f 73 74 6d 74 28 0a 20 20 76 6f 69 64 20 2a  t_stmt(.  void *
12780 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
12790 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
127a0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
127b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
127c0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
127d0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
127e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
127f0 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
12800 35 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  50];..  if( objc
12810 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
12820 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
12830 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
12840 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
12850 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
12860 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
12870 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
12880 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
12890 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
128a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
128b0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
128c0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
128d0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
128e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
128f0 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  R;.  if( getStmt
12900 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
12910 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
12920 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[2]), &pStmt) 
12930 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
12940 4f 52 3b 0a 20 20 70 53 74 6d 74 20 3d 20 73 71  OR;.  pStmt = sq
12950 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28  lite3_next_stmt(
12960 64 62 2c 20 70 53 74 6d 74 29 3b 0a 20 20 69 66  db, pStmt);.  if
12970 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
12980 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
12990 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
129a0 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
129b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
129c0 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
129d0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
129e0 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
129f0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12a00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
12a10 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  :  sqlite3_stmt_
12a20 72 65 61 64 6f 6e 6c 79 20 20 53 54 4d 54 0a 2a  readonly  STMT.*
12a30 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
12a40 20 69 66 20 53 54 4d 54 20 69 73 20 61 20 4e 55   if STMT is a NU
12a50 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72 20 61 20  LL pointer or a 
12a60 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
12a70 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 69  tement.** that i
12a80 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
12a90 6c 65 61 76 65 20 74 68 65 20 64 61 74 61 62 61  leave the databa
12aa0 73 65 20 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a  se unmodified..*
12ab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
12ac0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
12ad0 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 0a 20  stmt_readonly(. 
12ae0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
12af0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
12b00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
12b10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
12b20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
12b30 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
12b40 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
12b50 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
12b60 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
12b70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
12b80 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
12b90 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
12ba0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
12bb0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
12bc0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22  [0], 0), " STMT"
12bd0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
12be0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
12bf0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
12c00 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
12c10 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
12c20 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
12c30 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12c40 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12c50 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70  _stmt_readonly(p
12c60 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
12c70 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
12c80 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
12c90 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75  Obj(rc));.  retu
12ca0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
12cb0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
12cc0 74 65 33 5f 73 74 6d 74 5f 69 73 65 78 70 6c 61  te3_stmt_isexpla
12cd0 69 6e 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  in  STMT.**.** R
12ce0 65 74 75 72 6e 20 31 2c 20 32 2c 20 6f 72 20 30  eturn 1, 2, or 0
12cf0 20 72 65 73 70 65 63 74 69 76 65 6c 79 20 69 66   respectively if
12d00 20 53 54 4d 54 20 69 73 20 61 6e 20 45 58 50 4c   STMT is an EXPL
12d10 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61  AIN statement, a
12d20 6e 0a 2a 2a 20 45 58 50 4c 41 49 4e 20 51 55 45  n.** EXPLAIN QUE
12d30 52 59 20 50 4c 41 4e 20 73 74 61 74 65 6d 65 6e  RY PLAN statemen
12d40 74 20 6f 72 20 61 6e 20 6f 72 64 69 6e 61 72 79  t or an ordinary
12d50 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 4e 55   statement or NU
12d60 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73  LL pointer..*/.s
12d70 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
12d80 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d  _TCLAPI test_stm
12d90 74 5f 69 73 65 78 70 6c 61 69 6e 28 0a 20 20 76  t_isexplain(.  v
12da0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
12db0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
12dc0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
12dd0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
12de0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
12df0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
12e00 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  Stmt;.  int rc;.
12e10 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
12e20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
12e30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12e40 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
12e50 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
12e60 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
12e70 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
12e80 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20  ], 0), " STMT", 
12e90 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12ea0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
12eb0 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
12ec0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
12ed0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
12ee0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
12ef0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
12f10 74 6d 74 5f 69 73 65 78 70 6c 61 69 6e 28 70 53  tmt_isexplain(pS
12f20 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
12f30 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
12f40 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
12f50 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
12f60 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
12f70 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
12f80 74 6d 74 5f 62 75 73 79 20 20 53 54 4d 54 0a 2a  tmt_busy  STMT.*
12f90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
12fa0 20 69 66 20 53 54 4d 54 20 69 73 20 61 20 6e 6f   if STMT is a no
12fb0 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 74  n-NULL pointer t
12fc0 6f 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  o a statement.**
12fd0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 73   that has been s
12fe0 74 65 70 70 65 64 20 62 75 74 20 6e 6f 74 20 74  tepped but not t
12ff0 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 0a 2a 2f  o completion..*/
13000 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
13010 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
13020 74 6d 74 5f 62 75 73 79 28 0a 20 20 76 6f 69 64  tmt_busy(.  void
13030 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
13040 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
13050 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
13060 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
13070 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
13080 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
13090 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  t;.  int rc;..  
130a0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
130b0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
130c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
130d0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
130e0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
130f0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
13100 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
13110 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30 29 3b  0), " STMT", 0);
13120 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
13130 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
13140 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
13150 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
13160 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
13170 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
13180 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
13190 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  c = sqlite3_stmt
131a0 5f 62 75 73 79 28 70 53 74 6d 74 29 3b 0a 20 20  _busy(pStmt);.  
131b0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
131c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
131d0 42 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b  BooleanObj(rc));
131e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
131f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
13200 3a 20 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  :  uses_stmt_jou
13210 72 6e 61 6c 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a  rnal  STMT.**.**
13220 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
13230 53 54 4d 54 20 75 73 65 73 20 61 20 73 74 61 74  STMT uses a stat
13240 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
13250 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
13260 49 54 45 5f 54 43 4c 41 50 49 20 75 73 65 73 5f  ITE_TCLAPI uses_
13270 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20  stmt_journal(.  
13280 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
13290 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
132a0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
132b0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
132c0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
132d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
132e0 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pStmt;..  if( ob
132f0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
13300 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
13310 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
13320 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
13330 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
13340 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
13350 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
13360 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
13370 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13380 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
13390 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
133a0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
133b0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
133c0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
133d0 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33  ERROR;.  sqlite3
133e0 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70  _stmt_readonly(p
133f0 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
13400 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
13410 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
13420 4f 62 6a 28 28 28 56 64 62 65 20 2a 29 70 53 74  Obj(((Vdbe *)pSt
13430 6d 74 29 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75  mt)->usesStmtJou
13440 72 6e 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e  rnal));.  return
13450 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
13460 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
13470 65 33 5f 72 65 73 65 74 20 20 53 54 4d 54 20 0a  e3_reset  STMT .
13480 2a 2a 0a 2a 2a 20 52 65 73 65 74 20 61 20 73 74  **.** Reset a st
13490 61 74 65 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a  atement handle..
134a0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
134b0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
134c0 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a  _reset(.  void *
134d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
134e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
134f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
13500 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
13510 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
13520 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13530 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
13540 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
13550 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
13560 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
13570 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
13580 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
13590 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
135a0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
135b0 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b  , " <STMT>", 0);
135c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
135d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
135e0 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
135f0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
13600 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
13610 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
13620 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
13630 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
13640 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
13650 20 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65   pStmt && sqlite
13660 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
13670 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
13680 74 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20  tmt), rc) ){.   
13690 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
136a0 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  R;.  }.  Tcl_Set
136b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
136c0 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
136d0 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
136e0 49 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63  IC);./*.  if( rc
136f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
13700 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f  CL_ERROR;.  }.*/
13710 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
13720 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
13730 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72  :  sqlite3_expir
13740 65 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  ed STMT .**.** R
13750 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20  eturn TRUE if a 
13760 72 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66  recompilation of
13770 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69   the statement i
13780 73 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a  s recommended..*
13790 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
137a0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
137b0 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69 64 20  expired(.  void 
137c0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
137d0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
137e0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
137f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
13800 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
13810 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
13820 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69  EPRECATED.  sqli
13830 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13840 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
13850 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
13860 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
13870 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
13880 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
13890 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
138a0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
138b0 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22  ], 0), " <STMT>"
138c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
138d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
138e0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
138f0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
13900 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13910 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
13920 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13930 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
13940 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
13950 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71  NewBooleanObj(sq
13960 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70 53  lite3_expired(pS
13970 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20  tmt)));.#endif. 
13980 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
13990 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
139a0 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65   sqlite3_transfe
139b0 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d 53  r_bindings FROMS
139c0 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a  TMT TOSTMT.**.**
139d0 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62 69   Transfer all bi
139e0 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f 4d  ndings from FROM
139f0 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f 53  STMT over to TOS
13a00 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  TMT.*/.static in
13a10 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
13a20 74 65 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69  test_transfer_bi
13a30 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  nd(.  void * cli
13a40 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
13a50 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
13a60 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
13a70 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
13a80 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
13a90 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
13aa0 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73  ATED.  sqlite3_s
13ab0 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53  tmt *pStmt1, *pS
13ac0 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63  tmt2;.  if( objc
13ad0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
13ae0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13af0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
13b00 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
13b10 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
13b20 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
13b30 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52  bjv[0], 0), " FR
13b40 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22  OM-STMT TO-STMT"
13b50 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
13b60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
13b70 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
13b80 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
13b90 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13ba0 31 5d 29 2c 20 26 70 53 74 6d 74 31 29 29 20 72  1]), &pStmt1)) r
13bb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13bc0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
13bd0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
13be0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13bf0 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32 29 29 20  [2]), &pStmt2)) 
13c00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13c10 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
13c20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
13c30 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a     Tcl_NewIntObj
13c40 28 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65  (sqlite3_transfe
13c50 72 5f 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74  r_bindings(pStmt
13c60 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a 23 65 6e  1,pStmt2)));.#en
13c70 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
13c80 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
13c90 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68  age:  sqlite3_ch
13ca0 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52  anges DB.**.** R
13cb0 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
13cc0 20 6f 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65   of changes made
13cd0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
13ce0 20 62 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c   by the last SQL
13cf0 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a  .** execution..*
13d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
13d10 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
13d20 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20  changes(.  void 
13d30 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
13d40 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13d50 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
13d60 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
13d70 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
13d80 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
13d90 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
13da0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
13db0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
13dc0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
13dd0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c   \"",.       Tcl
13de0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
13df0 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
13e00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
13e10 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
13e20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
13e30 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
13e40 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
13e50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
13e60 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
13e70 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
13e80 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
13e90 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
13ea0 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  b)));.  return T
13eb0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
13ec0 54 68 69 73 20 69 73 20 74 68 65 20 22 73 74 61  This is the "sta
13ed0 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20  tic_bind_value" 
13ee0 74 68 61 74 20 76 61 72 69 61 62 6c 65 73 20 61  that variables a
13ef0 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e  re bound to when
13f00 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74  .** the FLAG opt
13f10 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62  ion of sqlite3_b
13f20 69 6e 64 20 69 73 20 22 73 74 61 74 69 63 22 0a  ind is "static".
13f30 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
13f40 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
13f50 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74  nd_value = 0;.st
13f60 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
13f70 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
13f80 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73  e = 0;../*.** Us
13f90 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62 69  age:  sqlite3_bi
13fa0 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56 41 4c  nd  VM  IDX  VAL
13fb0 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20  UE  FLAGS.**.** 
13fc0 53 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f  Sets the value o
13fd0 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63 63  f the IDX-th occ
13fe0 75 72 72 65 6e 63 65 20 6f 66 20 22 3f 22 20 69  urrence of "?" i
13ff0 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
14000 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56  QL.** string.  V
14010 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20  ALUE is the new 
14020 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53  value.  If FLAGS
14030 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41  =="null" then VA
14040 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  LUE is.** ignore
14050 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
14060 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
14070 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74   If FLAGS=="stat
14080 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ic" then.** the 
14090 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
140a0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
140b0 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e  tatic variable n
140c0 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  amed.** "sqlite_
140d0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
140e0 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  e".  If FLAGS=="
140f0 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63  normal" then a c
14100 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41  opy.** of the VA
14110 4c 55 45 20 69 73 20 6d 61 64 65 2e 20 20 49 66  LUE is made.  If
14120 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22   FLAGS=="blob10"
14130 20 74 68 65 6e 20 61 20 56 41 4c 55 45 20 69 73   then a VALUE is
14140 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61   ignored.** an a
14150 20 31 30 2d 62 79 74 65 20 62 6c 6f 62 20 22 61   10-byte blob "a
14160 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22  bc\000xyz\000pq"
14170 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   is inserted..*/
14180 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
14190 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
141a0 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  ind(.  void *Not
141b0 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
141c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
141d0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
141e0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
141f0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
14200 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
14210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14220 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
14230 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
14240 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
14250 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
14260 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
14270 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14280 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  tmt;.  int rc;. 
14290 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66 28 20   int idx;.  if( 
142a0 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
142b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
142c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
142d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
142e0 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
142f0 20 20 20 20 20 20 20 22 20 56 4d 20 49 44 58 20         " VM IDX 
14300 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74 61 74  VALUE (null|stat
14310 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c 20 30  ic|normal)\"", 0
14320 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
14330 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
14340 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
14350 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
14360 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ], &pStmt) ) ret
14370 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14380 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
14390 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
143a0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
143b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
143c0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
143d0 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20  "null")==0 ){.  
143e0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
143f0 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
14400 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  idx);.  }else if
14410 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
14420 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20 29 7b  ,"static")==0 ){
14430 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14440 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
14450 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65 5f 73  t, idx, sqlite_s
14460 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
14470 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  , -1, 0);.  }els
14480 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
14490 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e 62 79  v[4],"static-nby
144a0 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tes")==0 ){.    
144b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
144c0 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
144d0 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
144e0 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20 20 20  _bind_value,.   
144f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14510 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61 74 69      sqlite_stati
14520 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 30 29  c_bind_nbyte, 0)
14530 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
14540 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 6f  rcmp(argv[4],"no
14550 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20  rmal")==0 ){.   
14560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
14570 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  nd_text(pStmt, i
14580 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d 31 2c  dx, argv[3], -1,
14590 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
145a0 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  T);.  }else if( 
145b0 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
145c0 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b 0a 20  blob10")==0 ){. 
145d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
145e0 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
145f0 20 69 64 78 2c 20 22 61 62 63 5c 30 30 30 78 79   idx, "abc\000xy
14600 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c 20 53 51  z\000pq", 10, SQ
14610 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
14620 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41  }else{.    Tcl_A
14630 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
14640 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d 65 6e  rp, "4th argumen
14650 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  t should be ".  
14660 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c 22 20        "\"null\" 
14670 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20 6f 72  or \"static\" or
14680 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20 30 29   \"normal\"", 0)
14690 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
146a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
146b0 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
146c0 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
146d0 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
146e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
146f0 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29  RROR;.  if( rc )
14700 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
14710 35 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  50];.    sqlite3
14720 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
14730 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28  (zBuf), zBuf, "(
14740 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
14750 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14760 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
14770 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
14780 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
14790 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
147a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
147b0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
147c0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
147d0 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
147e0 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20  est_collate <db 
147f0 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  ptr> <utf8> <utf
14800 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a  16le> <utf16be>.
14810 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
14820 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74  ion is used to t
14830 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
14840 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72  selects the corr
14850 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  ect collation.**
14860 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61   sequence callba
14870 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ck when multiple
14880 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64   versions (for d
14890 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e  ifferent text en
148a0 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20  codings).** are 
148b0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
148c0 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
148d0 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20  utine registers 
148e0 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
148f0 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c  quence "test_col
14900 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61  late".** with da
14910 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64  tabase handle <d
14920 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  b>. The second a
14930 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
14940 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a  a list of three.
14950 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  ** boolean value
14960 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
14970 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20  is true, then a 
14980 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f  version of test_
14990 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65  collate is.** re
149a0 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
149b0 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  -8, if the secon
149c0 64 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72  d is true, a ver
149d0 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  sion is register
149e0 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36  ed for.** UTF-16
149f0 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  le, if the third
14a00 20 69 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d   is true, a UTF-
14a10 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20  16be version is 
14a20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72  available..** Pr
14a30 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
14a40 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  of test_collate 
14a50 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
14a60 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** The collation
14a70 20 73 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63   sequence test_c
14a80 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d  ollate is implem
14a90 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ented by calling
14aa0 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
14ab0 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
14ac0 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c  .**   "test_coll
14ad0 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20  ate <enc> <lhs> 
14ae0 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65  <rhs>".**.** The
14af0 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e   <lhs> and <rhs>
14b00 20 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c   are the two val
14b10 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72  ues being compar
14b20 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ed, encoded in U
14b30 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e  TF-8..** The <en
14b40 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  c> parameter is 
14b50 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
14b60 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
14b70 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53  nction that.** S
14b80 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64 20 74  QLite selected t
14b90 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20  o call. The TCL 
14ba0 74 65 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c  test script impl
14bb0 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74  ements the.** "t
14bc0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f  est_collate" pro
14bd0 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  c..**.** Note th
14be0 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c  at this will onl
14bf0 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20  y work with one 
14c00 69 6e 74 65 72 70 72 65 74 65 72 20 61 74 20 61  interpreter at a
14c10 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a   time, as the.**
14c20 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65 72 20   interp pointer 
14c30 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76 61 6c  to use when eval
14c40 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c 20 73  uating the TCL s
14c50 63 72 69 70 74 20 69 73 20 73 74 6f 72 65 64 20  cript is stored 
14c60 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61  in.** pTestColla
14c70 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61  teInterp..*/.sta
14c80 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20  tic Tcl_Interp* 
14c90 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
14ca0 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74  rp;.static int t
14cb0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
14cc0 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
14cd0 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74  .  int nA, const
14ce0 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74   void *zA,.  int
14cf0 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nB, const void 
14d00 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  *zB.){.  Tcl_Int
14d10 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74 43 6f  erp *i = pTestCo
14d20 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20 20 69  llateInterp;.  i
14d30 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54  nt encin = SQLIT
14d40 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74  E_PTR_TO_INT(pCt
14d50 78 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  x);.  int res;. 
14d60 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74   int n;..  sqlit
14d70 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
14d80 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a    Tcl_Obj *pX;..
14d90 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
14da0 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f  ringObj("test_co
14db0 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54  llate", -1);.  T
14dc0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
14dd0 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  pX);..  switch( 
14de0 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63 61 73  encin ){.    cas
14df0 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20  e SQLITE_UTF8:. 
14e00 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
14e10 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
14e20 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  pX,Tcl_NewString
14e30 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29 29  Obj("UTF-8",-1))
14e40 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
14e50 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
14e60 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 54 63  TF16LE:.      Tc
14e70 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
14e80 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
14e90 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
14ea0 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20  F-16LE",-1));.  
14eb0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
14ec0 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ase SQLITE_UTF16
14ed0 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  BE:.      Tcl_Li
14ee0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
14ef0 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53  nt(i,pX,Tcl_NewS
14f00 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
14f10 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  BE",-1));.      
14f20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
14f30 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
14f40 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  (0);.  }..  sqli
14f50 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
14f60 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d  lloc();.  pVal =
14f70 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
14f80 28 30 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 20  (0);.  if( pVal 
14f90 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
14fa0 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
14fb0 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53  nA, zA, encin, S
14fc0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
14fd0 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76     n = sqlite3_v
14fe0 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29  alue_bytes(pVal)
14ff0 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
15000 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
15010 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  ,pX,.        Tcl
15020 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
15030 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
15040 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
15050 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
15060 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
15070 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53  nB, zB, encin, S
15080 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
15090 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76     n = sqlite3_v
150a0 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29  alue_bytes(pVal)
150b0 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
150c0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
150d0 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  ,pX,.        Tcl
150e0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
150f0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
15100 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
15110 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
15120 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
15130 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
15140 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
15150 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
15160 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  i, pX, 0);.  Tcl
15170 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
15180 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46  );.  Tcl_GetIntF
15190 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65  romObj(i, Tcl_Ge
151a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26  tObjResult(i), &
151b0 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  res);.  return r
151c0 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  es;.}.static int
151d0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
151e0 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76  est_collate(.  v
151f0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15200 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15210 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15220 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15230 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15240 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
15250 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c 69 74  int val;.  sqlit
15260 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
15270 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
15280 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20   objc!=5 ) goto 
15290 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54 65 73  bad_args;.  pTes
152a0 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 20 3d  tCollateInterp =
152b0 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28 20 67   interp;.  if( g
152c0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
152d0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
152e0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
152f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15300 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f  ROR;..  if( TCL_
15310 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
15320 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
15330 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
15340 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15350 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
15360 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
15370 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63  tion(db, "test_c
15380 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
15390 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20 20 20  UTF8, .         
153a0 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f   (void *)SQLITE_
153b0 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74 5f 63  UTF8, val?test_c
153c0 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
153d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
153e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  _OK ){.    const
153f0 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20   void *zUtf16;. 
15400 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54     if( TCL_OK!=T
15410 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
15420 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
15430 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[3], &val) ) re
15440 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15450 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15460 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
15470 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  n(db, "test_coll
15480 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
15490 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 20  16LE, .         
154a0 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
154b0 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c 3f 74  E_UTF16LE, val?t
154c0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
154d0 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54 43 4c  :0);.    if( TCL
154e0 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
154f0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
15500 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c  p, objv[4], &val
15510 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15520 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20 20 20  RROR;..#if 0.   
15530 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69 4d 61   if( sqlite3_iMa
15540 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a 20 20  llocFail>0 ){.  
15550 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c      sqlite3_iMal
15560 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d  locFail++;.    }
15570 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
15580 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
15590 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
155a0 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
155b0 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20  lueNew(db);.    
155c0 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
155d0 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 74 65  tr(pVal, -1, "te
155e0 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c  st_collate", SQL
155f0 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
15600 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55  _STATIC);.    zU
15610 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61  tf16 = sqlite3Va
15620 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
15630 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
15640 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
15650 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
15660 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15670 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
15680 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
15690 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
156a0 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74  lation16(db, zUt
156b0 66 31 36 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  f16, SQLITE_UTF1
156c0 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  6BE, .          
156d0 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55  (void *)SQLITE_U
156e0 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65 73 74  TF16BE, val?test
156f0 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
15700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
15710 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
15720 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
15730 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
15740 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 69 66  mutex);.  }.  if
15750 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
15760 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
15770 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
15780 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20 69 66  L_ERROR;.  .  if
15790 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
157a0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
157b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
157c0 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
157d0 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
157e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
157f0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
15800 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
15810 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15820 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
15830 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
15840 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63 6c  e \"",.      Tcl
15850 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
15860 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
15870 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74   <DB> <utf8> <ut
15880 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e  f16le> <utf16be>
15890 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ", 0);.  return 
158a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
158b0 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
158c0 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c  est_utf16bin_col
158d0 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 0a 2a 2a  late <db ptr>.**
158e0 0a 2a 2a 20 41 64 64 20 61 20 75 74 66 2d 31 36  .** Add a utf-16
158f0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
15900 6e 63 65 20 6e 61 6d 65 64 20 22 75 74 66 31 36  nce named "utf16
15910 62 69 6e 22 20 74 6f 20 74 68 65 20 64 61 74 61  bin" to the data
15920 62 61 73 65 0a 2a 2a 20 68 61 6e 64 6c 65 2e 20  base.** handle. 
15930 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  This collation s
15940 65 71 75 65 6e 63 65 20 63 6f 6d 70 61 72 65 73  equence compares
15950 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 74 68   arguments in th
15960 65 20 73 61 6d 65 20 77 61 79 20 61 73 20 74 68  e same way as th
15970 65 0a 2a 2a 20 62 75 69 6c 74 2d 69 6e 20 63 6f  e.** built-in co
15980 6c 6c 61 74 69 6f 6e 20 22 62 69 6e 61 72 79 22  llation "binary"
15990 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
159a0 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f  test_utf16bin_co
159b0 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
159c0 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
159d0 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
159e0 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
159f0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
15a00 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20 28 6e  .  int nCmp = (n
15a10 41 3e 6e 42 20 3f 20 6e 42 20 3a 20 6e 41 29 3b  A>nB ? nB : nA);
15a20 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d 65 6d  .  int res = mem
15a30 63 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e 43 6d 70  cmp(zA, zB, nCmp
15a40 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d 30 20  );.  if( res==0 
15a50 29 20 72 65 73 20 3d 20 6e 41 20 2d 20 6e 42 3b  ) res = nA - nB;
15a60 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
15a70 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
15a80 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75  TE_TCLAPI test_u
15a90 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 28  tf16bin_collate(
15aa0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
15ab0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
15ac0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
15ad0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
15ae0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
15af0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
15b00 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
15b10 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74  f( objc!=2 ) got
15b20 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
15b30 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
15b40 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
15b50 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
15b60 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
15b70 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
15b80 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
15b90 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74  ollation(db, "ut
15ba0 66 31 36 62 69 6e 22 2c 20 53 51 4c 49 54 45 5f  f16bin", SQLITE_
15bb0 55 54 46 31 36 2c 20 30 2c 20 0a 20 20 20 20 20  UTF16, 0, .     
15bc0 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63   test_utf16bin_c
15bd0 6f 6c 6c 61 74 65 5f 66 75 6e 63 0a 20 20 29 3b  ollate_func.  );
15be0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
15bf0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
15c00 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
15c10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15c20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
15c30 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
15c40 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
15c50 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
15c60 42 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  B");.  return TC
15c70 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  L_ERROR;.}../*.*
15c80 2a 20 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61  * When the colla
15c90 74 69 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c  tion needed call
15ca0 62 61 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c  back is invoked,
15cb0 20 72 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65   record the name
15cc0 20 6f 66 20 0a 2a 2a 20 74 68 65 20 72 65 71 75   of .** the requ
15cd0 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20  ested collating 
15ce0 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 20  function here.  
15cf0 54 68 65 20 72 65 63 6f 72 64 65 64 20 6e 61 6d  The recorded nam
15d00 65 20 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74  e is linked.** t
15d10 6f 20 61 20 54 43 4c 20 76 61 72 69 61 62 6c 65  o a TCL variable
15d20 20 61 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 6b   and used to mak
15d30 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20  e sure that the 
15d40 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
15d50 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63  ion.** name is c
15d60 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69  orrect..*/.stati
15d70 63 20 63 68 61 72 20 7a 4e 65 65 64 65 64 43 6f  c char zNeededCo
15d80 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74  llation[200];.st
15d90 61 74 69 63 20 63 68 61 72 20 2a 70 7a 4e 65 65  atic char *pzNee
15da0 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a  dedCollation = z
15db0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b  NeededCollation;
15dc0 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20  .../*.** Called 
15dd0 77 68 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67  when a collating
15de0 20 73 65 71 75 65 6e 63 65 20 69 73 20 6e 65 65   sequence is nee
15df0 64 65 64 2e 20 20 52 65 67 69 73 74 65 72 65 64  ded.  Registered
15e00 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65   using.** sqlite
15e10 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
15e20 65 64 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  ed16()..*/.stati
15e30 63 20 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c  c void test_coll
15e40 61 74 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20  ate_needed_cb(. 
15e50 20 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20   void *pCtx, .  
15e60 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
15e70 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63  nt eTextRep,.  c
15e80 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65  onst void *pName
15e90 0a 29 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20  .){.  int enc = 
15ea0 45 4e 43 28 64 62 29 3b 0a 20 20 69 6e 74 20 69  ENC(db);.  int i
15eb0 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66  ;.  char *z;.  f
15ec0 6f 72 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e  or(z = (char*)pN
15ed0 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20  ame, i=0; *z || 
15ee0 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20  z[1]; z++){.    
15ef0 69 66 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64  if( *z ) zNeeded
15f00 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d  Collation[i++] =
15f10 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64   *z;.  }.  zNeed
15f20 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d  edCollation[i] =
15f30 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72   0;.  sqlite3_cr
15f40 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
15f50 20 20 20 20 20 20 64 62 2c 20 22 74 65 73 74 5f        db, "test_
15f60 63 6f 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64 62  collate", ENC(db
15f70 29 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  ), SQLITE_INT_TO
15f80 5f 50 54 52 28 65 6e 63 29 2c 20 74 65 73 74 5f  _PTR(enc), test_
15f90 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d  collate_func);.}
15fa0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61  ../*.** Usage: a
15fb0 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  dd_test_collate_
15fc0 6e 65 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61  needed DB.*/.sta
15fd0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
15fe0 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 6c 61  CLAPI test_colla
15ff0 74 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69  te_needed(.  voi
16000 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
16010 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
16020 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
16030 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
16040 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
16050 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
16060 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
16070 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=2 ) goto bad_
16080 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44  args;.  if( getD
16090 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
160a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
160b0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
160c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
160d0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
160e0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
160f0 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f  d16(db, 0, test_
16100 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
16110 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c  b);.  zNeededCol
16120 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20  lation[0] = 0;. 
16130 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
16140 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
16150 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
16160 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
16170 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
16180 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72  d_args:.  Tcl_Wr
16190 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
161a0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
161b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
161c0 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
161d0 74 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c  tclcmd:   add_al
161e0 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c  ignment_test_col
161f0 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a  lations  DB.**.*
16200 2a 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f  * Add two new co
16210 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
16220 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
16230 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75  e DB.**.**     u
16240 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20  tf16_aligned.** 
16250 20 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67      utf16_unalig
16260 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63  ned.**.** Both c
16270 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
16280 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  es use the same 
16290 73 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42 49  sort order as BI
162a0 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  NARY..** The onl
162b0 79 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  y difference is 
162c0 74 68 61 74 20 74 68 65 20 75 74 66 31 36 5f 61  that the utf16_a
162d0 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  ligned collating
162e0 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20  .** sequence is 
162f0 64 65 63 6c 61 72 65 64 20 77 69 74 68 20 74 68  declared with th
16300 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  e SQLITE_UTF16_A
16310 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20  LIGNED flag..** 
16320 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66  Both collating f
16330 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65  unctions increme
16340 6e 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  nt the unaligned
16350 20 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a   utf16 counter.*
16360 2a 20 77 68 65 6e 65 76 65 72 20 74 68 65 79 20  * whenever they 
16370 73 65 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  see a string tha
16380 74 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f  t begins on an o
16390 64 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79  dd byte boundary
163a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
163b0 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
163c0 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74  _counter = 0;.st
163d0 61 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65  atic int alignme
163e0 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  ntCollFunc(.  vo
163f0 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69  id *NotUsed,.  i
16400 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
16410 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
16420 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
16430 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
16440 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
16450 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
16460 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
16470 20 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20   if( nKey1>0 && 
16480 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54  1==(1&(SQLITE_PT
16490 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29 29  R_TO_INT(pKey1))
164a0 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  ) ) unaligned_st
164b0 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ring_counter++;.
164c0 20 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26    if( nKey2>0 &&
164d0 20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50   1==(1&(SQLITE_P
164e0 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32 29  TR_TO_INT(pKey2)
164f0 29 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73  )) ) unaligned_s
16500 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b  tring_counter++;
16510 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70  .  rc = memcmp(p
16520 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b  Key1, pKey2, n);
16530 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
16540 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
16550 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65   nKey2;.  }.  re
16560 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
16570 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
16580 41 50 49 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e  API add_alignmen
16590 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e  t_test_collation
165a0 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
165b0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
165c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
165d0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
165e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
165f0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
16600 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d  db;.  if( objc>=
16610 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67 65 74  2 ){.    if( get
16620 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
16630 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
16640 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
16650 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16660 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  R;.    sqlite3_c
16670 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
16680 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61 6c 69  db, "utf16_unali
16690 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55 54  gned", SQLITE_UT
166a0 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  F16, .        0,
166b0 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
166c0 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  nc);.    sqlite3
166d0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
166e0 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61 6c 69  n(db, "utf16_ali
166f0 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f 55 54  gned", SQLITE_UT
16700 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a 20 20  F16_ALIGNED, .  
16710 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65        0, alignme
16720 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 7d  ntCollFunc);.  }
16730 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16740 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
16750 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
16760 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a 2f 0a  _OMIT_UTF16) */.
16770 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64  ./*.** Usage: ad
16780 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  d_test_function 
16790 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38 3e 20  <db ptr> <utf8> 
167a0 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36  <utf16le> <utf16
167b0 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  be>.**.** This f
167c0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
167d0 74 6f 20 74 65 73 74 20 74 68 61 74 20 53 51 4c  to test that SQL
167e0 69 74 65 20 73 65 6c 65 63 74 73 20 74 68 65 20  ite selects the 
167f0 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a 2a 20  correct user.** 
16800 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62 61 63  function callbac
16810 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20  k when multiple 
16820 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64 69  versions (for di
16830 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e 63  fferent text enc
16840 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20 61  odings).** are a
16850 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  vailable..**.** 
16860 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f 75  Calling this rou
16870 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20 75  tine registers u
16880 70 20 74 6f 20 74 68 72 65 65 20 76 65 72 73 69  p to three versi
16890 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65 72 20  ons of the user 
168a0 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74 65 73  function.** "tes
168b0 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69 74 68  t_function" with
168c0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
168d0 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65 20 73   <db>.  If the s
168e0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69  econd argument i
168f0 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  s.** true, then 
16900 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73  a version of tes
16910 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65  t_function is re
16920 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
16930 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20 74 68  -8, if the.** th
16940 69 72 64 20 69 73 20 74 72 75 65 2c 20 61 20 76  ird is true, a v
16950 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74  ersion is regist
16960 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31 36 6c  ered for UTF-16l
16970 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72 74 68  e, if the fourth
16980 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61 20 55   is.** true, a U
16990 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f 6e 20  TF-16be version 
169a0 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 50  is available.  P
169b0 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73  revious versions
169c0 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75 6e 63   of.** test_func
169d0 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74 65 64  tion are deleted
169e0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73 65 72  ..**.** The user
169f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6d 70   function is imp
16a00 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61 6c 6c  lemented by call
16a10 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ing the followin
16a20 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
16a30 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75 6e 63  .**   "test_func
16a40 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72 67 3e  tion <enc> <arg>
16a50 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20 3c 65  ".**.** Where <e
16a60 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20 55 54  nc> is one of UT
16a70 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20 6f 72  F-8, UTF-16LE or
16a80 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20 3c 61   UTF16BE, and <a
16a90 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20 73 69  rg> is the.** si
16aa0 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 70 61  ngle argument pa
16ab0 73 73 65 64 20 74 6f 20 74 68 65 20 53 51 4c 20  ssed to the SQL 
16ac0 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
16ad0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 0a  lue returned by.
16ae0 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72 69 70  ** the TCL scrip
16af0 74 20 69 73 20 75 73 65 64 20 61 73 20 74 68 65  t is used as the
16b00 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 6f 66   return value of
16b10 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
16b20 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61 73 73  n. It.** is pass
16b30 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75 73 69  ed to SQLite usi
16b40 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f 72 20  ng UTF-16BE for 
16b50 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66 75 6e  a UTF-8 test_fun
16b60 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38 0a 2a  ction(), UTF-8.*
16b70 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36 4c 45  * for a UTF-16LE
16b80 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29   test_function()
16b90 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45 20 66  , and UTF-16LE f
16ba0 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e 74 61  or an implementa
16bb0 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70 72 65  tion that.** pre
16bc0 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e 0a 2a  fers UTF-16BE..*
16bd0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
16be0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74 61 74  _OMIT_UTF16.stat
16bf0 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
16c00 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20 73 71  ction_utf8(.  sq
16c10 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
16c20 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67  Ctx, .  int nArg
16c30 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
16c40 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63  e **argv.){.  Tc
16c50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16c60 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b  ;.  Tcl_Obj *pX;
16c70 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
16c80 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70   *pVal;.  interp
16c90 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a   = (Tcl_Interp *
16ca0 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
16cb0 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d  ta(pCtx);.  pX =
16cc0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
16cd0 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  j("test_function
16ce0 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
16cf0 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
16d00 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
16d10 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
16d20 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74  p, pX, Tcl_NewSt
16d30 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38 22 2c  ringObj("UTF-8",
16d40 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
16d50 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
16d60 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20  t(interp, pX, . 
16d70 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69       Tcl_NewStri
16d80 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c  ngObj((char*)sql
16d90 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
16da0 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a  argv[0]), -1));.
16db0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
16dc0 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a  interp, pX, 0);.
16dd0 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
16de0 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69 74 65  nt(pX);.  sqlite
16df0 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
16e00 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  tx, Tcl_GetStrin
16e10 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
16e20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
16e30 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c 20 3d  SIENT);.  pVal =
16e40 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
16e50 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  (0);.  sqlite3Va
16e60 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
16e70 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  -1, Tcl_GetStrin
16e80 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c  gResult(interp),
16e90 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55   .      SQLITE_U
16ea0 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
16eb0 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  IC);.  sqlite3_r
16ec0 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65 28 70  esult_text16be(p
16ed0 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
16ee0 75 65 5f 74 65 78 74 31 36 62 65 28 70 56 61 6c  ue_text16be(pVal
16ef0 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
16f00 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
16f10 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
16f20 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74  ee(pVal);.}.stat
16f30 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e  ic void test_fun
16f40 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28 0a 20  ction_utf16le(. 
16f50 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
16f60 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e   *pCtx, .  int n
16f70 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Arg,.  sqlite3_v
16f80 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  alue **argv.){. 
16f90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
16fa0 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  erp;.  Tcl_Obj *
16fb0 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  pX;.  sqlite3_va
16fc0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
16fd0 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72  erp = (Tcl_Inter
16fe0 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  p *)sqlite3_user
16ff0 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70  _data(pCtx);.  p
17000 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  X = Tcl_NewStrin
17010 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74  gObj("test_funct
17020 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c  ion", -1);.  Tcl
17030 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _IncrRefCount(pX
17040 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
17050 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
17060 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65  terp, pX, Tcl_Ne
17070 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d  wStringObj("UTF-
17080 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54  16LE", -1));.  T
17090 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
170a0 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
170b0 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e  pX, .      Tcl_N
170c0 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61  ewStringObj((cha
170d0 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
170e0 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20  _text(argv[0]), 
170f0 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c  -1));.  Tcl_Eval
17100 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58  ObjEx(interp, pX
17110 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
17120 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
17130 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61  pVal = sqlite3Va
17140 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c  lueNew(0);.  sql
17150 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
17160 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65  pVal, -1, Tcl_Ge
17170 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e  tStringResult(in
17180 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51  terp), .      SQ
17190 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
171a0 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c  E_STATIC);.  sql
171b0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
171c0 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73 71 6c  (pCtx,(char*)sql
171d0 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
171e0 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54 45 5f  pVal),-1,SQLITE_
171f0 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71  TRANSIENT);.  sq
17200 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
17210 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  Val);.}.static v
17220 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  oid test_functio
17230 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73 71 6c  n_utf16be(.  sql
17240 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
17250 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c  tx, .  int nArg,
17260 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
17270 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c   **argv.){.  Tcl
17280 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
17290 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a  .  Tcl_Obj *pX;.
172a0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
172b0 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20  *pVal;.  interp 
172c0 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  = (Tcl_Interp *)
172d0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
172e0 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20  a(pCtx);.  pX = 
172f0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
17300 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  ("test_function"
17310 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
17320 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20  rRefCount(pX);. 
17330 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
17340 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
17350 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72  , pX, Tcl_NewStr
17360 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 42 45  ingObj("UTF-16BE
17370 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
17380 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
17390 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
173a0 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
173b0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
173c0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
173d0 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
173e0 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
173f0 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
17400 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
17410 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c  ount(pX);.  pVal
17420 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
17430 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
17440 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
17450 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
17460 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
17470 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
17480 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
17490 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
174a0 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 28 70  _result_text16(p
174b0 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  Ctx, sqlite3_val
174c0 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c  ue_text16le(pVal
174d0 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c  ),.      -1, SQL
174e0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
174f0 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
17500 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
17510 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
17520 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
17530 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
17540 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
17550 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
17560 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16le(pCtx, sqlit
17570 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
17580 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
17590 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
175a0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  ENT);.  sqlite3V
175b0 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
175c0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
175d0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
175e0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
175f0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 66  TE_TCLAPI test_f
17600 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20  unction(.  void 
17610 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
17620 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17630 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17640 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
17650 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64   objv[].){.#ifnd
17660 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
17670 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a  TF16.  sqlite3 *
17680 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 0a  db;.  int val;..
17690 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 20    if( objc!=5 ) 
176a0 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
176b0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
176c0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
176d0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
176e0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
176f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66  TCL_ERROR;..  if
17700 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
17710 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
17720 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
17730 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
17740 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
17750 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
17760 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
17770 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
17780 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
17790 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20  TE_UTF8, .      
177a0 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
177b0 75 6e 63 74 69 6f 6e 5f 75 74 66 38 2c 20 30 2c  unction_utf8, 0,
177c0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54   0);.  }.  if( T
177d0 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
177e0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
177f0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
17800 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
17810 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61  _ERROR;.  if( va
17820 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
17830 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
17840 28 64 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74  (db, "test_funct
17850 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ion", 1, SQLITE_
17860 55 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20  UTF16LE, .      
17870 20 20 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66    interp, test_f
17880 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 2c  unction_utf16le,
17890 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66   0, 0);.  }.  if
178a0 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
178b0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
178c0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
178d0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
178e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
178f0 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69   val ){.    sqli
17900 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
17910 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66 75  ion(db, "test_fu
17920 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c 49  nction", 1, SQLI
17930 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20 20 20  TE_UTF16BE, .   
17940 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65 73       interp, tes
17950 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
17960 62 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a  be, 0, 0);.  }..
17970 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
17980 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c  .bad_args:.  Tcl
17990 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
179a0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
179b0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
179c0 22 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65  "",.      Tcl_Ge
179d0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
179e0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44  bjv[0], 0), " <D
179f0 42 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36  B> <utf8> <utf16
17a00 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20  le> <utf16be>", 
17a10 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  0);.#endif /* SQ
17a20 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
17a30 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
17a40 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
17a50 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 73  Usage:         s
17a60 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73  qlite3_test_errs
17a70 74 72 20 3c 65 72 72 20 63 6f 64 65 3e 0a 2a 2a  tr <err code>.**
17a80 0a 2a 2a 20 54 65 73 74 20 74 68 61 74 20 74 68  .** Test that th
17a90 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e english langua
17aa0 67 65 20 73 74 72 69 6e 67 20 65 71 75 69 76 61  ge string equiva
17ab0 6c 65 6e 74 73 20 66 6f 72 20 73 71 6c 69 74 65  lents for sqlite
17ac0 20 65 72 72 6f 72 20 63 6f 64 65 73 0a 2a 2a 20   error codes.** 
17ad0 61 72 65 20 73 61 6e 65 2e 20 54 68 65 20 70 61  are sane. The pa
17ae0 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 69 6e  rameter is an in
17af0 74 65 67 65 72 20 72 65 70 72 65 73 65 6e 74 69  teger representi
17b00 6e 67 20 61 6e 20 73 71 6c 69 74 65 20 65 72 72  ng an sqlite err
17b10 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 54 68 65 20  or code..** The 
17b20 72 65 73 75 6c 74 20 69 73 20 61 20 6c 69 73 74  result is a list
17b30 20 6f 66 20 74 77 6f 20 65 6c 65 6d 65 6e 74 73   of two elements
17b40 2c 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  , the string rep
17b50 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
17b60 68 65 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  he.** error code
17b70 20 61 6e 64 20 74 68 65 20 65 6e 67 6c 69 73 68   and the english
17b80 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
17b90 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ation..*/.static
17ba0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
17bb0 50 49 20 74 65 73 74 5f 65 72 72 73 74 72 28 0a  PI test_errstr(.
17bc0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17bd0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17be0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17bf0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17c00 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17c10 7b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 64 65 3b  {.  char *zCode;
17c20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
17c30 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54  objc!=1 ){.    T
17c40 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
17c50 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
17c60 20 22 3c 65 72 72 6f 72 20 63 6f 64 65 3e 22 29   "<error code>")
17c70 3b 0a 20 20 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d  ;.  }..  zCode =
17c80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17c90 62 6a 76 5b 31 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[1]);.  for(i
17ca0 3d 30 3b 20 69 3c 32 30 30 3b 20 69 2b 2b 29 7b  =0; i<200; i++){
17cb0 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63  .    if( 0==strc
17cc0 6d 70 28 74 31 45 72 72 6f 72 4e 61 6d 65 28 69  mp(t1ErrorName(i
17cd0 29 2c 20 7a 43 6f 64 65 29 20 29 20 62 72 65 61  ), zCode) ) brea
17ce0 6b 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74  k;.  }.  Tcl_Set
17cf0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
17d00 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
17d10 72 53 74 72 28 69 29 2c 20 30 29 3b 0a 20 20 72  rStr(i), 0);.  r
17d20 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
17d30 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
17d40 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a   breakpoint.**.*
17d50 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
17d60 78 69 73 74 73 20 66 6f 72 20 6f 6e 65 20 70 75  xists for one pu
17d70 72 70 6f 73 65 20 2d 20 74 6f 20 70 72 6f 76 69  rpose - to provi
17d80 64 65 20 61 20 70 6c 61 63 65 20 74 6f 20 70 75  de a place to pu
17d90 74 20 61 0a 2a 2a 20 62 72 65 61 6b 70 6f 69 6e  t a.** breakpoin
17da0 74 20 77 69 74 68 20 47 44 42 20 74 68 61 74 20  t with GDB that 
17db0 63 61 6e 20 62 65 20 74 72 69 67 67 65 72 65 64  can be triggered
17dc0 20 75 73 69 6e 67 20 54 43 4c 20 63 6f 64 65 2e   using TCL code.
17dd0 20 20 54 68 65 20 75 73 65 0a 2a 2a 20 66 6f 72    The use.** for
17de0 20 74 68 69 73 20 69 73 20 77 68 65 6e 20 61 20   this is when a 
17df0 70 61 72 74 69 63 75 6c 61 72 20 74 65 73 74 20  particular test 
17e00 66 61 69 6c 73 20 6f 6e 20 28 73 61 79 29 20 74  fails on (say) t
17e10 68 65 20 31 34 38 35 74 68 20 69 74 65 72 61 74  he 1485th iterat
17e20 69 6f 6e 2e 0a 2a 2a 20 49 6e 20 74 68 65 20 54  ion..** In the T
17e30 43 4c 20 74 65 73 74 20 73 63 72 69 70 74 2c 20  CL test script, 
17e40 77 65 20 63 61 6e 20 61 64 64 20 63 6f 64 65 20  we can add code 
17e50 6c 69 6b 65 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a  like this:.**.**
17e60 20 20 20 20 20 69 66 20 7b 24 69 3d 3d 31 34 38       if {$i==148
17e70 35 7d 20 62 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a  5} breakpoint.**
17e80 0a 2a 2a 20 54 68 65 6e 20 72 75 6e 20 74 65 73  .** Then run tes
17e90 74 66 69 78 74 75 72 65 20 69 6e 20 74 68 65 20  tfixture in the 
17ea0 64 65 62 75 67 67 65 72 20 61 6e 64 20 77 61 69  debugger and wai
17eb0 74 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 70  t for the breakp
17ec0 6f 69 6e 74 20 74 6f 0a 2a 2a 20 66 69 72 65 2e  oint to.** fire.
17ed0 20 20 54 68 65 6e 20 61 64 64 69 74 69 6f 6e 61    Then additiona
17ee0 6c 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 63 61  l breakpoints ca
17ef0 6e 20 62 65 20 73 65 74 20 74 6f 20 74 72 61 63  n be set to trac
17f00 65 20 64 6f 77 6e 20 74 68 65 20 62 75 67 2e 0a  e down the bug..
17f10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
17f20 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
17f30 5f 62 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76  _breakpoint(.  v
17f40 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
17f50 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17f60 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
17f70 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
17f80 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
17f90 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
17fa0 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
17fb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17fc0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
17fd0 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
17fe0 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
17ff0 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
18000 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54  */.){.  return T
18010 43 4c 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f  CL_OK;         /
18020 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a  * Do nothing */.
18030 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
18040 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a    sqlite3_bind_z
18050 65 72 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49 44  eroblob  STMT ID
18060 58 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  X N.**.** Test t
18070 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
18080 7a 65 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61  zeroblob interfa
18090 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
180a0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
180b0 74 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65  t..** IDX is the
180c0 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
180d0 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
180e0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
180f0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
18100 20 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20   binds a N-byte 
18110 7a 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42  zero-filled BLOB
18120 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
18130 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18140 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
18150 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
18160 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
18170 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
18180 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
18190 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
181a0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
181b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
181c0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
181d0 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20   idx;.  int n;. 
181e0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
181f0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
18200 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
18210 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
18220 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a   "STMT IDX N");.
18230 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18240 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
18250 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
18260 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18270 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18280 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
18290 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
182a0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
182b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
182c0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
182d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
182e0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
182f0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
18300 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65  bjv[3], &n) ) re
18310 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18320 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
18330 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53  bind_zeroblob(pS
18340 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20  tmt, idx, n);.  
18350 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
18360 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
18370 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
18380 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
18390 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
183a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
183b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
183c0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
183d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
183e0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
183f0 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
18400 6f 62 36 34 20 20 53 54 4d 54 20 49 44 58 20 4e  ob64  STMT IDX N
18410 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
18420 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
18430 6f 62 6c 6f 62 36 34 20 69 6e 74 65 72 66 61 63  oblob64 interfac
18440 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
18450 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18460 2e 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65 20  ..** IDX is the 
18470 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63  index of a wildc
18480 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61  ard in the prepa
18490 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  red statement.  
184a0 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20  This command.** 
184b0 62 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20 7a  binds a N-byte z
184c0 65 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20  ero-filled BLOB 
184d0 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
184e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
184f0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
18500 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36  t_bind_zeroblob6
18510 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  4(.  void * clie
18520 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
18530 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18540 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18550 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18560 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
18570 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
18580 74 20 69 64 78 3b 0a 20 20 54 63 6c 5f 57 69 64  t idx;.  Tcl_Wid
18590 65 49 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63  eInt n;.  int rc
185a0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
185b0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
185c0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
185d0 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
185e0 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  IDX N");.    ret
185f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18600 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
18610 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
18620 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18630 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
18640 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18650 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
18660 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
18670 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
18680 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
18690 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
186a0 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f 6d  l_GetWideIntFrom
186b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
186c0 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72  [3], &n) ) retur
186d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
186e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
186f0 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 70 53 74  d_zeroblob64(pSt
18700 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20 69  mt, idx, n);.  i
18710 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
18720 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
18730 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
18740 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
18750 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
18760 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18770 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18780 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
18790 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
187a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
187b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
187c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
187d0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
187e0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
187f0 74 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a  t  STMT N VALUE.
18800 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73  **.** Test the s
18810 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20  qlite3_bind_int 
18820 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
18830 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
18840 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
18850 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
18860 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
18870 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
18880 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
18890 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 33 32  nd.** binds a 32
188a0 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
188b0 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
188c0 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
188d0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
188e0 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a   test_bind_int(.
188f0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18900 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18910 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18920 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18930 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18940 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
18950 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
18960 64 78 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b  dx;.  int value;
18970 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
18980 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
18990 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
189a0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
189b0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
189c0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
189d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
189e0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
189f0 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
18a00 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
18a10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18a20 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
18a30 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18a40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18a50 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
18a60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18a70 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
18a80 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
18a90 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
18aa0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18ab0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
18ac0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
18ad0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
18ae0 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20  value) ) return 
18af0 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
18b00 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
18b10 69 6e 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  int(pStmt, idx, 
18b20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71  value);.  if( sq
18b30 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
18b40 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
18b50 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
18b60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18b70 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
18b80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
18b90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18ba0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
18bb0 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
18bc0 73 61 67 65 3a 20 20 20 69 6e 74 61 72 72 61 79  sage:   intarray
18bd0 5f 61 64 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a  _addr  INT  ....
18be0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
18bf0 20 61 64 64 72 65 73 73 20 6f 66 20 61 20 43 2d   address of a C-
18c00 6c 61 6e 67 75 61 67 65 20 61 72 72 61 79 20 6f  language array o
18c10 66 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  f 32-bit integer
18c20 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
18c30 6f 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79  o hold the array
18c40 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
18c50 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c  m malloc().  Cal
18c60 6c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  l this procedure
18c70 20 6f 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f   once.** with no
18c80 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72   arguments in or
18c90 64 65 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d  der to release m
18ca0 65 6d 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c  emory.  Each cal
18cb0 6c 20 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64  l to this proced
18cc0 75 72 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  ure.** overwrite
18cd0 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 61  s the previous a
18ce0 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
18cf0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
18d00 49 20 74 65 73 74 5f 69 6e 74 61 72 72 61 79 5f  I test_intarray_
18d10 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  addr(.  void * c
18d20 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
18d30 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18d40 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18d50 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18d60 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  jv[].){.  int i;
18d70 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 2a 70  .  static int *p
18d80 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65 33   = 0;..  sqlite3
18d90 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20  _free(p);.  p = 
18da0 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20  0;.  if( objc>1 
18db0 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74  ){.    p = sqlit
18dc0 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  e3_malloc( sizeo
18dd0 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29  f(p[0])*(objc-1)
18de0 20 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30   );.    if( p==0
18df0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18e00 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ROR;.    for(i=0
18e10 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29  ; i<objc-1; i++)
18e20 7b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f  {.      if( Tcl_
18e30 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
18e40 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69 5d 2c  terp, objv[1+i],
18e50 20 26 70 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20   &p[i]) ){.     
18e60 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18e70 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  p);.        p = 
18e80 30 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  0;.        retur
18e90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
18ea0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20     }.    }.  }  
18eb0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
18ec0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
18ed0 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73  NewWideIntObj((s
18ee0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29  qlite3_int64)p))
18ef0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
18f00 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  K;.}./*.** Usage
18f10 3a 20 20 20 69 6e 74 61 72 72 61 79 5f 61 64 64  :   intarray_add
18f20 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a  r  INT  ....**.*
18f30 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64  * Return the add
18f40 72 65 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e 67  ress of a C-lang
18f50 75 61 67 65 20 61 72 72 61 79 20 6f 66 20 33 32  uage array of 32
18f60 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 0a 2a  -bit integers..*
18f70 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
18f80 6c 64 20 74 68 65 20 61 72 72 61 79 20 69 73 20  ld the array is 
18f90 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
18fa0 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74 68  lloc().  Call th
18fb0 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 63  is procedure onc
18fc0 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72 67  e.** with no arg
18fd0 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20  uments in order 
18fe0 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
18ff0 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f  y.  Each call to
19000 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
19010 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
19020 65 20 70 72 65 76 69 6f 75 73 20 61 72 72 61 79  e previous array
19030 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19040 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
19050 73 74 5f 69 6e 74 36 34 61 72 72 61 79 5f 61 64  st_int64array_ad
19060 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  dr(.  void * cli
19070 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
19080 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
19090 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
190a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
190b0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  [].){.  int i;. 
190c0 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
190d0 69 6e 74 36 34 20 2a 70 20 3d 20 30 3b 0a 0a 20  int64 *p = 0;.. 
190e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
190f0 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  p = 0;.  if(
19100 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 70   objc>1 ){.    p
19110 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
19120 63 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29 2a  c( sizeof(p[0])*
19130 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20 20  (objc-1) );.    
19140 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
19150 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
19160 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a 63   for(i=0; i<objc
19170 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  -1; i++){.      
19180 54 63 6c 5f 57 69 64 65 49 6e 74 20 76 3b 0a 20  Tcl_WideInt v;. 
19190 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
191a0 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
191b0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 2b 69 5d  nterp, objv[1+i]
191c0 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20  , &v) ){.       
191d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
191e0 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b  ;.        p = 0;
191f0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19200 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
19210 20 7d 0a 20 20 20 20 20 20 70 5b 69 5d 20 3d 20   }.      p[i] = 
19220 76 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20  v;.    }.  }  . 
19230 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
19240 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
19250 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73 71 6c  wWideIntObj((sql
19260 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29 3b 0a  ite3_int64)p));.
19270 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19280 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .}./*.** Usage: 
19290 20 20 64 6f 75 62 6c 65 61 72 72 61 79 5f 61 64    doublearray_ad
192a0 64 72 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a  dr  INT  ....**.
192b0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 64  ** Return the ad
192c0 64 72 65 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e  dress of a C-lan
192d0 67 75 61 67 65 20 61 72 72 61 79 20 6f 66 20 64  guage array of d
192e0 6f 75 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 70  oubles..**.** Sp
192f0 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
19300 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65  array is obtaine
19310 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
19320 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72 6f 63    Call this proc
19330 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77 69  edure once.** wi
19340 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  th no arguments 
19350 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 6c 65  in order to rele
19360 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61 63  ase memory.  Eac
19370 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 70  h call to this p
19380 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65 72  rocedure.** over
19390 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69  writes the previ
193a0 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  ous array..*/.st
193b0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
193c0 54 43 4c 41 50 49 20 74 65 73 74 5f 64 6f 75 62  TCLAPI test_doub
193d0 6c 65 61 72 72 61 79 5f 61 64 64 72 28 0a 20 20  learray_addr(.  
193e0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
193f0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
19400 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19410 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19420 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19430 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69    int i;.  stati
19440 63 20 64 6f 75 62 6c 65 20 2a 70 20 3d 20 30 3b  c double *p = 0;
19450 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
19460 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20  (p);.  p = 0;.  
19470 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20  if( objc>1 ){.  
19480 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
19490 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30  lloc( sizeof(p[0
194a0 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20  ])*(objc-1) );. 
194b0 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
194c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
194d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f      for(i=0; i<o
194e0 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  bjc-1; i++){.   
194f0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f     if( Tcl_GetDo
19500 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ubleFromObj(inte
19510 72 70 2c 20 6f 62 6a 76 5b 31 2b 69 5d 2c 20 26  rp, objv[1+i], &
19520 70 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  p[i]) ){.       
19530 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
19540 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 30 3b  ;.        p = 0;
19550 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
19560 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
19570 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20   }.    }.  }  . 
19580 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
19590 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
195a0 77 57 69 64 65 49 6e 74 4f 62 6a 28 28 73 71 6c  wWideIntObj((sql
195b0 69 74 65 33 5f 69 6e 74 36 34 29 70 29 29 3b 0a  ite3_int64)p));.
195c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
195d0 0a 7d 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  .}./*.** Usage: 
195e0 20 20 74 65 78 74 61 72 72 61 79 5f 61 64 64 72    textarray_addr
195f0 20 20 54 45 58 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    TEXT ....**.**
19600 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
19610 65 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e 67 75  ess of a C-langu
19620 61 67 65 20 61 72 72 61 79 20 6f 66 20 73 74 72  age array of str
19630 69 6e 67 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63  ings..**.** Spac
19640 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 61 72  e to hold the ar
19650 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ray is obtained 
19660 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20  from malloc().  
19670 43 61 6c 6c 20 74 68 69 73 20 70 72 6f 63 65 64  Call this proced
19680 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77 69 74 68  ure once.** with
19690 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 69 6e   no arguments in
196a0 20 6f 72 64 65 72 20 74 6f 20 72 65 6c 65 61 73   order to releas
196b0 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61 63 68 20  e memory.  Each 
196c0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 70 72 6f  call to this pro
196d0 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65 72 77 72  cedure.** overwr
196e0 69 74 65 73 20 74 68 65 20 70 72 65 76 69 6f 75  ites the previou
196f0 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74  s array..*/.stat
19700 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
19710 4c 41 50 49 20 74 65 73 74 5f 74 65 78 74 61 72  LAPI test_textar
19720 72 61 79 5f 61 64 64 72 28 0a 20 20 76 6f 69 64  ray_addr(.  void
19730 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19740 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19750 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19760 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19770 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
19780 74 20 69 3b 0a 20 20 73 74 61 74 69 63 20 69 6e  t i;.  static in
19790 74 20 6e 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  t n = 0;.  stati
197a0 63 20 63 68 61 72 20 2a 2a 70 20 3d 20 30 3b 0a  c char **p = 0;.
197b0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b  .  for(i=0; i<n;
197c0 20 69 2b 2b 29 20 73 71 6c 69 74 65 33 5f 66 72   i++) sqlite3_fr
197d0 65 65 28 70 5b 69 5d 29 3b 0a 20 20 73 71 6c 69  ee(p[i]);.  sqli
197e0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
197f0 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63   = 0;.  if( objc
19800 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  >1 ){.    p = sq
19810 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
19820 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63  zeof(p[0])*(objc
19830 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
19840 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
19850 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28  _ERROR;.    for(
19860 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69  i=0; i<objc-1; i
19870 2b 2b 29 7b 0a 20 20 20 20 20 20 70 5b 69 5d 20  ++){.      p[i] 
19880 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
19890 66 28 22 25 73 22 2c 20 54 63 6c 5f 47 65 74 53  f("%s", Tcl_GetS
198a0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 2b 69 5d 29  tring(objv[1+i])
198b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6e  );.    }.  }.  n
198c0 20 3d 20 6f 62 6a 63 2d 31 3b 0a 20 20 54 63 6c   = objc-1;.  Tcl
198d0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
198e0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
198f0 65 49 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33  eIntObj((sqlite3
19900 5f 69 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65  _int64)p));.  re
19910 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
19920 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
19930 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
19940 36 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  64  STMT N VALUE
19950 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
19960 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
19970 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  64 interface.  S
19980 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
19990 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
199a0 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
199b0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
199c0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
199d0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
199e0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
199f0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
19a00 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
19a10 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
19a20 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
19a30 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e  API test_bind_in
19a40 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  t64(.  void * cl
19a50 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19a60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19a70 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19a80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19a90 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
19aa0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
19ab0 69 6e 74 20 69 64 78 3b 0a 20 20 54 63 6c 5f 57  int idx;.  Tcl_W
19ac0 69 64 65 49 6e 74 20 76 61 6c 75 65 3b 0a 20 20  ideInt value;.  
19ad0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
19ae0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
19af0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
19b00 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
19b10 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
19b20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
19b30 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
19b40 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
19b50 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20   STMT N VALUE", 
19b60 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
19b70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
19b80 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
19b90 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
19ba0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
19bb0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
19bc0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19bd0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
19be0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19bf0 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
19c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19c10 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
19c20 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
19c30 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
19c40 26 76 61 6c 75 65 29 20 29 20 72 65 74 75 72 6e  &value) ) return
19c50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
19c60 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
19c70 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20 69 64  _int64(pStmt, id
19c80 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
19c90 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
19ca0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
19cb0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
19cc0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19cd0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
19ce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19cf0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19d00 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
19d10 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
19d20 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
19d30 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20 20  e3_bind_double  
19d40 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a  STMT N VALUE.**.
19d50 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
19d60 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 20  te3_bind_double 
19d70 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54  interface.  STMT
19d80 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73   is a prepared s
19d90 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69  tatement..** N i
19da0 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61  s the index of a
19db0 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65   wildcard in the
19dc0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
19dd0 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61  ent.  This comma
19de0 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34  nd.** binds a 64
19df0 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c  -bit integer VAL
19e00 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63  UE to that wildc
19e10 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ard..*/.static i
19e20 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
19e30 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c   test_bind_doubl
19e40 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
19e50 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
19e60 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
19e70 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
19e80 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
19e90 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
19ea0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
19eb0 74 20 69 64 78 3b 0a 20 20 64 6f 75 62 6c 65 20  t idx;.  double 
19ec0 76 61 6c 75 65 20 3d 20 30 3b 0a 20 20 69 6e 74  value = 0;.  int
19ed0 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
19ee0 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 69  r *zVal;.  int i
19ef0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
19f00 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
19f10 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
19f20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
19f30 74 68 65 20 73 70 65 63 69 61 6c 20 66 6c 6f 61  the special floa
19f40 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
19f50 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
19f60 20 69 6e 74 20 69 55 70 70 65 72 3b 20 20 20 2f   int iUpper;   /
19f70 2a 20 55 70 70 65 72 20 33 32 20 62 69 74 73 20  * Upper 32 bits 
19f80 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
19f90 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 2f 2a  int iLower;   /*
19fa0 20 4c 6f 77 65 72 20 33 32 20 62 69 74 73 20 2a   Lower 32 bits *
19fb0 2f 0a 20 20 7d 20 61 53 70 65 63 69 61 6c 46 70  /.  } aSpecialFp
19fc0 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 20 22 4e  [] = {.    {  "N
19fd0 61 4e 22 2c 20 20 20 20 20 20 30 78 37 66 66 66  aN",      0x7fff
19fe0 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
19ff0 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53 4e 61 4e   },.    {  "SNaN
1a000 22 2c 20 20 20 20 20 30 78 37 66 66 37 66 66 66  ",     0x7ff7fff
1a010 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
1a020 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 22 2c 20  .    {  "-NaN", 
1a030 20 20 20 20 30 78 66 66 66 66 66 66 66 66 2c 20      0xffffffff, 
1a040 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
1a050 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c 20 20 20    {  "-SNaN",   
1a060 20 30 78 66 66 66 37 66 66 66 66 2c 20 30 78 66   0xfff7ffff, 0xf
1a070 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
1a080 20 20 22 2b 49 6e 66 22 2c 20 20 20 20 20 30 78    "+Inf",     0x
1a090 37 66 66 30 30 30 30 30 2c 20 30 78 30 30 30 30  7ff00000, 0x0000
1a0a0 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0000 },.    {  "
1a0b0 2d 49 6e 66 22 2c 20 20 20 20 20 30 78 66 66 66  -Inf",     0xfff
1a0c0 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
1a0d0 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 45 70 73  0 },.    {  "Eps
1a0e0 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30 30 30 30  ilon",  0x000000
1a0f0 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d  00, 0x00000001 }
1a100 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70 73 69 6c  ,.    {  "-Epsil
1a110 6f 6e 22 2c 20 30 78 38 30 30 30 30 30 30 30 2c  on", 0x80000000,
1a120 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c 0a 20   0x00000001 },. 
1a130 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c 20 20 20     {  "NaN0",   
1a140 20 20 30 78 37 66 66 38 30 30 30 30 2c 20 30 78    0x7ff80000, 0x
1a150 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
1a160 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20 20 20 30  {  "-NaN0",    0
1a170 78 66 66 66 38 30 30 30 30 2c 20 30 78 30 30 30  xfff80000, 0x000
1a180 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 0a 20  00000 },.  };.. 
1a190 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
1a1a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1a1b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1a1c0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1a1d0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
1a1e0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1a1f0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
1a200 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
1a210 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
1a220 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a230 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1a240 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1a250 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1a260 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1a270 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a280 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1a290 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1a2a0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1a2b0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
1a2c0 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49  L_ERROR;..  /* I
1a2d0 6e 74 65 72 63 65 70 74 20 74 68 65 20 73 74 72  ntercept the str
1a2e0 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64 20 67 65  ing "NaN" and ge
1a2f0 6e 65 72 61 74 65 20 61 20 4e 61 4e 20 76 61 6c  nerate a NaN val
1a300 75 65 20 66 6f 72 20 69 74 2e 0a 20 20 2a 2a 20  ue for it..  ** 
1a310 41 6c 6c 20 6f 74 68 65 72 20 73 74 72 69 6e 67  All other string
1a320 73 20 61 72 65 20 70 61 73 73 65 64 20 74 68 72  s are passed thr
1a330 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47 65 74 44  ough to Tcl_GetD
1a340 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 2e 0a  oubleFromObj()..
1a350 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44 6f 75 62    ** Tcl_GetDoub
1a360 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73 68 6f 75  leFromObj() shou
1a370 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 20 22 4e  ld understand "N
1a380 61 4e 22 20 62 75 74 20 73 6f 6d 65 20 76 65 72  aN" but some ver
1a390 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e 74 61  sions.  ** conta
1a3a0 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a 2f 0a 20  in a bug..  */. 
1a3b0 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zVal = Tcl_GetS
1a3c0 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
1a3d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
1a3e0 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f  eof(aSpecialFp)/
1a3f0 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
1a400 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  p[0]); i++){.   
1a410 20 69 66 28 20 73 74 72 63 6d 70 28 61 53 70 65   if( strcmp(aSpe
1a420 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d 65 2c  cialFp[i].zName,
1a430 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zVal)==0 ){.   
1a440 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
1a450 34 20 78 3b 0a 20 20 20 20 20 20 78 20 3d 20 61  4 x;.      x = a
1a460 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 55 70  SpecialFp[i].iUp
1a470 70 65 72 3b 0a 20 20 20 20 20 20 78 20 3c 3c 3d  per;.      x <<=
1a480 20 33 32 3b 0a 20 20 20 20 20 20 78 20 7c 3d 20   32;.      x |= 
1a490 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 4c  aSpecialFp[i].iL
1a4a0 6f 77 65 72 3b 0a 20 20 20 20 20 20 61 73 73 65  ower;.      asse
1a4b0 72 74 28 20 73 69 7a 65 6f 66 28 76 61 6c 75 65  rt( sizeof(value
1a4c0 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 61 73  )==8 );.      as
1a4d0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
1a4e0 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =8 );.      memc
1a4f0 70 79 28 26 76 61 6c 75 65 2c 20 26 78 2c 20 38  py(&value, &x, 8
1a500 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1a510 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1a520 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70 65 63 69  i>=sizeof(aSpeci
1a530 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70  alFp)/sizeof(aSp
1a540 65 63 69 61 6c 46 70 5b 30 5d 29 20 26 26 0a 20  ecialFp[0]) &&. 
1a550 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
1a560 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
1a570 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
1a580 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 72 65 74  alue) ){.    ret
1a590 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a5a0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1a5b0 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
1a5c0 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29  tmt, idx, value)
1a5d0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1a5e0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1a5f0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
1a600 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
1a610 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a620 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a630 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1a640 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1a650 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a660 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1a670 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
1a680 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a  ll  STMT N.**.**
1a690 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
1a6a0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74 65  3_bind_null inte
1a6b0 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
1a6c0 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
1a6d0 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
1a6e0 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
1a6f0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
1a700 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
1a710 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
1a720 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c 20 74  * binds a NULL t
1a730 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a  o the wildcard..
1a740 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1a750 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1a760 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20 20 76 6f  _bind_null(.  vo
1a770 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1a780 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1a790 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1a7a0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1a7b0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1a7c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1a7d0 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
1a7e0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1a7f0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1a800 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a810 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1a820 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1a830 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
1a840 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
1a850 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
1a860 20 22 20 53 54 4d 54 20 4e 22 2c 20 30 29 3b 0a   " STMT N", 0);.
1a870 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a880 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1a890 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1a8a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1a8b0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1a8c0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1a8d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1a8e0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1a8f0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1a900 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
1a910 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1a920 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1a930 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20  ind_null(pStmt, 
1a940 69 64 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  idx);.  if( sqli
1a950 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
1a960 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
1a970 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
1a980 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1a990 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a9a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1a9b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1a9c0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
1a9d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1a9e0 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
1a9f0 64 5f 74 65 78 74 20 20 53 54 4d 54 20 4e 20 53  d_text  STMT N S
1aa00 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a  TRING BYTES.**.*
1aa10 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
1aa20 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 69 6e 74  e3_bind_text int
1aa30 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
1aa40 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
1aa50 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
1aa60 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
1aa70 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
1aa80 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1aa90 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
1aaa0 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46 2d 38  ** binds a UTF-8
1aab0 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74   string STRING t
1aac0 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20  o the wildcard. 
1aad0 20 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42   The string is B
1aae0 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f  YTES bytes.** lo
1aaf0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ng..*/.static in
1ab00 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1ab10 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 28 0a  test_bind_text(.
1ab20 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1ab30 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1ab40 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ab50 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1ab60 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ab70 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1ab80 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
1ab90 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  dx;.  int bytes;
1aba0 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a  .  char *value;.
1abb0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
1abc0 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
1abd0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1abe0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1abf0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1ac00 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
1ac10 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
1ac20 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
1ac30 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20   " STMT N VALUE 
1ac40 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20  BYTES", 0);.    
1ac50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ac60 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1ac70 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1ac80 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1ac90 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1aca0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1acb0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1acc0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1acd0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1ace0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
1acf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c  TCL_ERROR;.  val
1ad00 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f  ue = (char*)Tcl_
1ad10 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1ad20 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  Obj(objv[3], &by
1ad30 74 65 73 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  tes);.  if( Tcl_
1ad40 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1ad50 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26  terp, objv[4], &
1ad60 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
1ad70 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
1ad80 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
1ad90 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
1ada0 20 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 53   value, bytes, S
1adb0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
1adc0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1add0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1ade0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
1adf0 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
1ae00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1ae10 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ae20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1ae30 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1ae40 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72  sqlite3ErrName(r
1ae50 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
1ae60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ae70 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
1ae80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1ae90 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
1aea0 6e 64 5f 74 65 78 74 31 36 20 3f 2d 73 74 61 74  nd_text16 ?-stat
1aeb0 69 63 3f 20 53 54 4d 54 20 4e 20 53 54 52 49 4e  ic? STMT N STRIN
1aec0 47 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  G BYTES.**.** Te
1aed0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
1aee0 69 6e 64 5f 74 65 78 74 31 36 20 69 6e 74 65 72  ind_text16 inter
1aef0 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
1af00 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
1af10 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
1af20 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
1af30 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
1af40 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
1af50 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
1af60 20 62 69 6e 64 73 20 61 20 55 54 46 2d 31 36 20   binds a UTF-16 
1af70 73 74 72 69 6e 67 20 53 54 52 49 4e 47 20 74 6f  string STRING to
1af80 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20   the wildcard.  
1af90 54 68 65 20 73 74 72 69 6e 67 20 69 73 20 42 59  The string is BY
1afa0 54 45 53 20 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e  TES bytes.** lon
1afb0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
1afc0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1afd0 65 73 74 5f 62 69 6e 64 5f 74 65 78 74 31 36 28  est_bind_text16(
1afe0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1aff0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1b000 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1b010 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1b020 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1b030 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1b040 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1b050 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1b060 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
1b070 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
1b080 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
1b090 20 72 63 3b 0a 0a 20 20 76 6f 69 64 20 28 2a 78   rc;..  void (*x
1b0a0 44 65 6c 29 28 76 6f 69 64 2a 29 20 3d 20 28 6f  Del)(void*) = (o
1b0b0 62 6a 63 3d 3d 36 3f 53 51 4c 49 54 45 5f 53 54  bjc==6?SQLITE_ST
1b0c0 41 54 49 43 3a 53 51 4c 49 54 45 5f 54 52 41 4e  ATIC:SQLITE_TRAN
1b0d0 53 49 45 4e 54 29 3b 0a 20 20 54 63 6c 5f 4f 62  SIENT);.  Tcl_Ob
1b0e0 6a 20 2a 6f 53 74 6d 74 20 20 20 20 3d 20 6f 62  j *oStmt    = ob
1b0f0 6a 76 5b 6f 62 6a 63 2d 34 5d 3b 0a 20 20 54 63  jv[objc-4];.  Tc
1b100 6c 5f 4f 62 6a 20 2a 6f 4e 20 20 20 20 20 20 20  l_Obj *oN       
1b110 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a  = objv[objc-3];.
1b120 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69    Tcl_Obj *oStri
1b130 6e 67 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  ng  = objv[objc-
1b140 32 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  2];.  Tcl_Obj *o
1b150 42 79 74 65 73 20 20 20 3d 20 6f 62 6a 76 5b 6f  Bytes   = objv[o
1b160 62 6a 63 2d 31 5d 3b 0a 0a 20 20 69 66 28 20 6f  bjc-1];..  if( o
1b170 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1b180 36 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  6){.    Tcl_Appe
1b190 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b1a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1b1b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
1b1c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1b1d0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
1b1e0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
1b1f0 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c 20  N VALUE BYTES", 
1b200 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b210 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b220 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
1b230 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1b240 47 65 74 53 74 72 69 6e 67 28 6f 53 74 6d 74 29  GetString(oStmt)
1b250 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1b260 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b270 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1b280 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 4e  omObj(interp, oN
1b290 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
1b2a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61   TCL_ERROR;.  va
1b2b0 6c 75 65 20 3d 20 28 63 68 61 72 2a 29 54 63 6c  lue = (char*)Tcl
1b2c0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1b2d0 6d 4f 62 6a 28 6f 53 74 72 69 6e 67 2c 20 30 29  mObj(oString, 0)
1b2e0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1b2f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1b300 2c 20 6f 42 79 74 65 73 2c 20 26 62 79 74 65 73  , oBytes, &bytes
1b310 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b320 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
1b330 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31  lite3_bind_text1
1b340 36 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 28 76  6(pStmt, idx, (v
1b350 6f 69 64 20 2a 29 76 61 6c 75 65 2c 20 62 79 74  oid *)value, byt
1b360 65 73 2c 20 78 44 65 6c 29 3b 0a 20 20 69 66 28  es, xDel);.  if(
1b370 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1b380 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
1b390 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
1b3a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b3b0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
1b3c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b3d0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1b3e0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
1b3f0 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  ErrName(rc), 0);
1b400 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b410 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64  ERROR;.  }..#end
1b420 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1b430 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74  T_UTF16 */.  ret
1b440 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1b450 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
1b460 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20  lite3_bind_blob 
1b470 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e  ?-static? STMT N
1b480 20 44 41 54 41 20 42 59 54 45 53 0a 2a 2a 0a 2a   DATA BYTES.**.*
1b490 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
1b4a0 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 69 6e 74  e3_bind_blob int
1b4b0 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73  erface.  STMT is
1b4c0 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
1b4d0 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74  ement..** N is t
1b4e0 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69  he index of a wi
1b4f0 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72  ldcard in the pr
1b500 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
1b510 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a  .  This command.
1b520 2a 2a 20 62 69 6e 64 73 20 61 20 42 4c 4f 42 20  ** binds a BLOB 
1b530 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e  to the wildcard.
1b540 20 20 54 68 65 20 42 4c 4f 42 20 69 73 20 42 59    The BLOB is BY
1b550 54 45 53 20 62 79 74 65 73 20 69 6e 20 73 69 7a  TES bytes in siz
1b560 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b570 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1b580 65 73 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20  est_bind_blob(. 
1b590 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b5a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b5b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b5c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b5d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b5e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1b5f0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 6c 65  *pStmt;.  int le
1b600 6e 2c 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  n, idx;.  int by
1b610 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
1b620 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ue;.  int rc;.  
1b630 73 71 6c 69 74 65 33 5f 64 65 73 74 72 75 63 74  sqlite3_destruct
1b640 6f 72 5f 74 79 70 65 20 78 44 65 73 74 72 75 63  or_type xDestruc
1b650 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f 54 52 41  tor = SQLITE_TRA
1b660 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66 28 20 6f  NSIENT;..  if( o
1b670 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1b680 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  6 ){.    Tcl_App
1b690 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1b6a0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1b6b0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
1b6c0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
1b6d0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
1b6e0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
1b6f0 20 4e 20 44 41 54 41 20 42 59 54 45 53 22 2c 20   N DATA BYTES", 
1b700 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b710 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b720 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20 29 7b 0a   if( objc==6 ){.
1b730 20 20 20 20 78 44 65 73 74 72 75 63 74 6f 72 20      xDestructor 
1b740 3d 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3b  = SQLITE_STATIC;
1b750 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a 20 20 7d  .    objv++;.  }
1b760 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1b770 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1b780 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1b790 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1b7a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1b7b0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1b7c0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1b7d0 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
1b7e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1b7f0 52 52 4f 52 3b 0a 0a 20 20 76 61 6c 75 65 20 3d  RROR;..  value =
1b800 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
1b810 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
1b820 6f 62 6a 76 5b 33 5d 2c 20 26 6c 65 6e 29 3b 0a  objv[3], &len);.
1b830 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1b840 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1b850 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
1b860 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b870 52 4f 52 3b 0a 0a 20 20 69 66 28 20 62 79 74 65  ROR;..  if( byte
1b880 73 3e 6c 65 6e 20 29 7b 0a 20 20 20 20 63 68 61  s>len ){.    cha
1b890 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20  r zBuf[200];.   
1b8a0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1b8b0 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
1b8c0 7a 42 75 66 2c 0a 20 20 20 20 20 20 20 20 20 20  zBuf,.          
1b8d0 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
1b8e0 6f 74 20 75 73 65 20 25 64 20 62 6c 6f 62 20 62  ot use %d blob b
1b8f0 79 74 65 73 2c 20 68 61 76 65 20 25 64 22 2c 20  ytes, have %d", 
1b900 62 79 74 65 73 2c 20 6c 65 6e 29 3b 0a 20 20 20  bytes, len);.   
1b910 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1b920 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1b930 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  -1);.    return 
1b940 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1b950 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1b960 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  ind_blob(pStmt, 
1b970 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65  idx, value, byte
1b980 73 2c 20 78 44 65 73 74 72 75 63 74 6f 72 29 3b  s, xDestructor);
1b990 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1b9a0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1b9b0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
1b9c0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
1b9d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1b9e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1b9f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1ba00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
1ba10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1ba20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1ba30 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
1ba40 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20 53 54  ameter_count  ST
1ba50 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
1ba60 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77 69  the number of wi
1ba70 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65 20 67  ldcards in the g
1ba80 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e 0a  iven statement..
1ba90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1baa0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1bab0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1bac0 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  count(.  void * 
1bad0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1bae0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1baf0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1bb00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1bb10 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1bb20 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1bb30 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1bb40 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1bb50 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1bb60 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
1bb70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1bb80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1bb90 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1bba0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1bbb0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1bbc0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1bbd0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1bbe0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1bbf0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1bc00 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e  tObj(sqlite3_bin
1bc10 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
1bc20 74 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  t(pStmt)));.  re
1bc30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1bc40 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1bc50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
1bc60 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53 54 4d 54  meter_name  STMT
1bc70 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e    N.**.** Return
1bc80 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
1bc90 20 4e 74 68 20 77 69 6c 64 63 61 72 64 2e 20 20   Nth wildcard.  
1bca0 54 68 65 20 66 69 72 73 74 20 77 69 6c 64 63 61  The first wildca
1bcb0 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41 6e 20 65  rd is 1..** An e
1bcc0 6d 70 74 79 20 73 74 72 69 6e 67 20 69 73 20 72  mpty string is r
1bcd0 65 74 75 72 6e 65 64 20 69 66 20 4e 20 69 73 20  eturned if N is 
1bce0 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 6f 72 20  out of range or 
1bcf0 69 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 0a  if the wildcard.
1bd00 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73 73 2e 0a  ** is nameless..
1bd10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1bd20 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1bd30 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1bd40 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  name(.  void * c
1bd50 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1bd60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1bd70 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1bd80 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1bd90 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1bda0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1bdb0 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 6f   int i;..  if( o
1bdc0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1bdd0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1bde0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1bdf0 22 53 54 4d 54 20 4e 22 29 3b 0a 20 20 20 20 72  "STMT N");.    r
1be00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1be10 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
1be20 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1be30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1be40 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1be50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1be60 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1be70 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1be80 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1be90 69 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  i) ) return TCL_
1bea0 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
1beb0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1bec0 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 53  , .     Tcl_NewS
1bed0 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
1bee0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1bef0 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 2c 2d 31  name(pStmt,i),-1
1bf00 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ).  );.  return 
1bf10 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1bf20 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
1bf30 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
1bf40 5f 69 6e 64 65 78 20 20 53 54 4d 54 20 20 4e 41  _index  STMT  NA
1bf50 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ME.**.** Return 
1bf60 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
1bf70 20 77 69 6c 64 63 61 72 64 20 63 61 6c 6c 65 64   wildcard called
1bf80 20 4e 41 4d 45 2e 20 20 52 65 74 75 72 6e 20 30   NAME.  Return 0
1bf90 20 69 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   if there is.** 
1bfa0 6e 6f 20 73 75 63 68 20 77 69 6c 64 63 61 72 64  no such wildcard
1bfb0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bfc0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1bfd0 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
1bfe0 72 5f 69 6e 64 65 78 28 0a 20 20 76 6f 69 64 20  r_index(.  void 
1bff0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1c000 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1c010 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1c020 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1c030 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1c040 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1c050 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1c060 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1c070 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1c080 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
1c090 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
1c0a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c0b0 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
1c0c0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1c0d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c0e0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1c0f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1c100 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  R;.  Tcl_SetObjR
1c110 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20  esult(interp, . 
1c120 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62      Tcl_NewIntOb
1c130 6a 28 0a 20 20 20 20 20 20 20 73 71 6c 69 74 65  j(.       sqlite
1c140 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
1c150 5f 69 6e 64 65 78 28 70 53 74 6d 74 2c 54 63 6c  _index(pStmt,Tcl
1c160 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c170 32 5d 29 29 0a 20 20 20 20 20 29 0a 20 20 29 3b  2])).     ).  );
1c180 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1c190 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1c1a0 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 65 61  :   sqlite3_clea
1c1b0 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a  r_bindings STMT.
1c1c0 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  **.*/.static int
1c1d0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1c1e0 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e  est_clear_bindin
1c1f0 67 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  gs(.  void * cli
1c200 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1c210 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1c220 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1c230 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1c240 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1c250 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
1c260 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1c270 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1c280 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1c290 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
1c2a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1c2b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1c2c0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1c2d0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1c2e0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1c2f0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1c300 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53  L_ERROR;.  Tcl_S
1c310 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1c320 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1c330 6a 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f  j(sqlite3_clear_
1c340 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29 29  bindings(pStmt))
1c350 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1c360 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 55 73  OK;.}../*. ** Us
1c370 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 63  age:   sqlite3_c
1c380 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 53 54  lear_bindings ST
1c390 4d 54 0a 20 2a 2a 0a 20 2a 2f 0a 73 74 61 74 69  MT. **. */.stati
1c3a0 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65 61 72  c int test_clear
1c3b0 5f 62 69 6e 64 69 6e 67 73 5f 6e 75 6c 6c 28 0a  _bindings_null(.
1c3c0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1c3d0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1c3e0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1c3f0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1c400 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1c410 7b 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  {  .  if( objc!=
1c420 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
1c430 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1c440 20 2f 2a 20 74 65 73 74 20 66 6f 72 20 68 61 6e   /* test for han
1c450 64 6c 69 6e 67 20 4e 55 4c 4c 20 3c 72 64 61 72  dling NULL <rdar
1c460 3a 2f 2f 70 72 6f 62 6c 65 6d 2f 36 36 34 36 33  ://problem/66463
1c470 33 31 3e 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74  31> */.  Tcl_Set
1c480 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1c490 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1c4a0 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69  sqlite3_clear_bi
1c4b0 6e 64 69 6e 67 73 28 30 29 29 29 3b 0a 20 20 72  ndings(0)));.  r
1c4c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1c4d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
1c4e0 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49  sqlite3_sleep MI
1c4f0 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74  LLISECONDS.*/.st
1c500 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1c510 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6c 65 65  TCLAPI test_slee
1c520 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  p(.  void * clie
1c530 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1c540 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1c550 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1c560 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1c570 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a  ].){.  int ms;..
1c580 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1c590 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1c5a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1c5b0 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43   objv, "MILLISEC
1c5c0 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74 75  ONDS");.    retu
1c5d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c5e0 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
1c5f0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1c600 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29 20  , objv[1], &ms) 
1c610 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
1c620 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
1c630 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1c640 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
1c650 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73 6c  ntObj(sqlite3_sl
1c660 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65 74  eep(ms)));.  ret
1c670 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1c680 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1c690 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
1c6a0 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  code DB.**.** Re
1c6b0 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20  turn the string 
1c6c0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
1c6d0 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
1c6e0 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a  t sqlite3_* API.
1c6f0 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65  ** error code. e
1c700 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  .g. "SQLITE_ERRO
1c710 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  R"..*/.static in
1c720 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1c730 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 28  test_ex_errcode(
1c740 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1c750 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1c760 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1c770 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1c780 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1c790 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1c7a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1c7b0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1c7c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1c7d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1c7e0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1c7f0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1c800 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c810 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
1c820 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1c830 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1c840 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1c850 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1c860 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1c870 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1c880 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1c890 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1c8a0 64 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  d_errcode(db);. 
1c8b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c8c0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
1c8d0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
1c8e0 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
1c8f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
1c900 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1c910 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a  _errcode DB.**.*
1c920 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72  * Return the str
1c930 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
1c940 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
1c950 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20  ecent sqlite3_* 
1c960 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64  API.** error cod
1c970 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f  e. e.g. "SQLITE_
1c980 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69  ERROR"..*/.stati
1c990 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1c9a0 41 50 49 20 74 65 73 74 5f 65 72 72 63 6f 64 65  API test_errcode
1c9b0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1c9c0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1c9d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1c9e0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1c9f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1ca00 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1ca10 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
1ca20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1ca30 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ca40 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1ca50 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ca60 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1ca70 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1ca80 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
1ca90 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1caa0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1cab0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1cac0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1cad0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1cae0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1caf0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1cb00 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
1cb10 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70  e(db);.  Tcl_App
1cb20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1cb30 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
1cb40 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
1cb50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1cb60 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1cb70 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
1cb80 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
1cb90 73 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72  s the UTF-8 repr
1cba0 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68  esentation of th
1cbb0 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
1cbc0 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a  string for the.*
1cbd0 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71  * most recent sq
1cbe0 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c  lite3_* API call
1cbf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1cc00 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1cc10 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69  st_errmsg(.  voi
1cc20 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1cc30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1cc40 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1cc50 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1cc60 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1cc70 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1cc80 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a  nst char *zErr;.
1cc90 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1cca0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1ccb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1ccc0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1ccd0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1cce0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1ccf0 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1cd00 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1cd10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1cd20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1cd30 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1cd40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1cd50 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
1cd60 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1cd70 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f   zErr = sqlite3_
1cd80 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63  errmsg(db);.  Tc
1cd90 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1cda0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
1cdb0 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31  ringObj(zErr, -1
1cdc0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1cdd0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1cde0 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d  age:   test_errm
1cdf0 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  sg16 DB.**.** Re
1ce00 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36  turns the UTF-16
1ce10 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1ce20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
1ce30 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
1ce40 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
1ce50 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
1ce60 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61   call. This is a
1ce70 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65   byte array obje
1ce80 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a  ct at the TCL .*
1ce90 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20  * level, and it 
1cea0 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30  includes the 0x0
1ceb0 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f  0 0x00 terminato
1cec0 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65  r bytes at the e
1ced0 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46  nd of the.** UTF
1cee0 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  -16 string..*/.s
1cef0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1cf00 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 72 72  _TCLAPI test_err
1cf10 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  msg16(.  void * 
1cf20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1cf30 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1cf40 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1cf50 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1cf60 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1cf70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1cf80 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  16.  sqlite3 *db
1cf90 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1cfa0 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zErr;.  const ch
1cfb0 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79 74  ar *z;.  int byt
1cfc0 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  es = 0;..  if( o
1cfd0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1cfe0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1cff0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1d000 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d010 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1d020 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d030 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
1d040 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1d050 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1d060 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1d070 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1d080 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1d090 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d0a0 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20  RROR;..  zErr = 
1d0b0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
1d0c0 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  (db);.  if( zErr
1d0d0 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72 72   ){.    z = zErr
1d0e0 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65 73 3d  ;.    for(bytes=
1d0f0 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20 7a  0; z[bytes] || z
1d100 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74 65 73  [bytes+1]; bytes
1d110 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c  +=2){}.  }.  Tcl
1d120 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1d130 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74  terp, Tcl_NewByt
1d140 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20  eArrayObj(zErr, 
1d150 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66 20  bytes));.#endif 
1d160 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1d170 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1d180 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d190 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d1a0 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c 20  _prepare DB sql 
1d1b0 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a  bytes ?tailvar?.
1d1c0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
1d1d0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
1d1e0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
1d1f0 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
1d200 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
1d210 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
1d220 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
1d230 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
1d240 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
1d250 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
1d260 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
1d270 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
1d280 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
1d290 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
1d2a0 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
1d2b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1d2c0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1d2d0 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69  t_prepare(.  voi
1d2e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1d2f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1d300 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1d310 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1d320 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1d330 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1d340 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  nst char *zSql;.
1d350 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63    int bytes;.  c
1d360 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
1d370 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1d380 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1d390 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1d3a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1d3b0 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1d3c0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
1d3d0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d3e0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1d3f0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1d400 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1d410 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1d420 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
1d430 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30  es ?tailvar?", 0
1d440 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1d450 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1d460 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1d470 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1d480 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1d490 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1d4a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
1d4b0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
1d4c0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
1d4d0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1d4e0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
1d4f0 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
1d500 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1d510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1d520 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c  repare(db, zSql,
1d530 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
1d540 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c  objc>=5 ? &zTail
1d550 20 3a 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73   : 0);.  Tcl_Res
1d560 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
1d570 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
1d580 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
1d590 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
1d5a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d5b0 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62   if( zTail && ob
1d5c0 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28  jc>=5 ){.    if(
1d5d0 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20   bytes>=0 ){.   
1d5e0 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73     bytes = bytes
1d5f0 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a   - (int)(zTail-z
1d600 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
1d610 69 66 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  if( (int)strlen(
1d620 7a 54 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a  zTail)<bytes ){.
1d630 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 28 69        bytes = (i
1d640 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29  nt)strlen(zTail)
1d650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f  ;.    }.    Tcl_
1d660 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
1d670 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54  p, objv[4], 0, T
1d680 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
1d690 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30  zTail, bytes), 0
1d6a0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
1d6b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1d6c0 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d    assert( pStmt=
1d6d0 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1d6e0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1d6f0 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22  f(zBuf), zBuf, "
1d700 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20  (%d) ", rc);.   
1d710 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1d720 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1d730 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
1d740 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
1d750 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d760 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
1d770 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
1d780 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
1d790 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
1d7a0 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
1d7b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
1d7c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1d7d0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
1d7e0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1d7f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d800 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d810 5f 70 72 65 70 61 72 65 5f 76 32 20 44 42 20 73  _prepare_v2 DB s
1d820 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1d830 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  r?.**.** Compile
1d840 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
1d850 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
1d860 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
1d870 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
1d880 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
1d890 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
1d8a0 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
1d8b0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
1d8c0 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
1d8d0 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
1d8e0 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
1d8f0 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
1d900 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
1d910 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
1d920 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1d930 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1d940 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28  test_prepare_v2(
1d950 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1d960 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1d970 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1d980 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1d990 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1d9a0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1d9b0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1d9c0 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43  zSql;.  char *zC
1d9d0 6f 70 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20  opy = 0;        
1d9e0 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f          /* mallo
1d9f0 63 28 29 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c  c() copy of zSql
1da00 20 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65 73 3b   */.  int bytes;
1da10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1da20 54 61 69 6c 20 3d 20 30 3b 0a 20 20 63 6f 6e 73  Tail = 0;.  cons
1da30 74 20 63 68 61 72 20 2a 2a 70 7a 54 61 69 6c 3b  t char **pzTail;
1da40 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1da50 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1da60 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
1da70 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
1da80 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
1da90 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1daa0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1dab0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1dac0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1dad0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1dae0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1daf0 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74 61   DB sql bytes ta
1db00 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20 20  ilvar", 0);.    
1db10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1db20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1db30 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1db40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1db50 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1db60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1db70 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
1db80 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
1db90 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  );.  if( Tcl_Get
1dba0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1dbb0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74  p, objv[3], &byt
1dbc0 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  es) ) return TCL
1dbd0 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e  _ERROR;..  /* In
1dbe0 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 7a  stead of using z
1dbf0 53 71 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d 61  Sql directly, ma
1dc00 6b 65 20 61 20 63 6f 70 79 20 69 6e 74 6f 20 61  ke a copy into a
1dc10 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65 64   buffer obtained
1dc20 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 66  .  ** directly f
1dc30 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54 68  rom malloc(). Th
1dc40 65 20 69 64 65 61 20 69 73 20 74 6f 20 6d 61 6b  e idea is to mak
1dc50 65 20 69 74 20 65 61 73 69 65 72 20 66 6f 72 20  e it easier for 
1dc60 76 61 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74 6f  valgrind.  ** to
1dc70 20 73 70 6f 74 20 62 75 66 66 65 72 20 6f 76 65   spot buffer ove
1dc80 72 72 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69 66  rreads.  */.  if
1dc90 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
1dca0 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63    zCopy = malloc
1dcb0 28 62 79 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d  (bytes);.    mem
1dcc0 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c  cpy(zCopy, zSql,
1dcd0 20 62 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65   bytes);.  }else
1dce0 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69  {.    int n = (i
1dcf0 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29 20  nt)strlen(zSql) 
1dd00 2b 20 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20 3d  + 1;.    zCopy =
1dd10 20 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20   malloc(n);.    
1dd20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53  memcpy(zCopy, zS
1dd30 71 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 70 7a  ql, n);.  }.  pz
1dd40 54 61 69 6c 20 3d 20 6f 62 6a 63 3e 3d 35 20 3f  Tail = objc>=5 ?
1dd50 20 26 7a 54 61 69 6c 20 3a 20 30 3b 0a 20 20 72   &zTail : 0;.  r
1dd60 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1dd70 61 72 65 5f 76 32 28 64 62 2c 20 7a 43 6f 70 79  are_v2(db, zCopy
1dd80 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1dd90 20 70 7a 54 61 69 6c 29 3b 0a 20 20 69 66 28 20   pzTail);.  if( 
1dda0 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 7a  objc>=5 ){.    z
1ddb0 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a 54  Tail = &zSql[(zT
1ddc0 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a 20  ail - zCopy)];. 
1ddd0 20 7d 0a 20 20 66 72 65 65 28 7a 43 6f 70 79 29   }.  free(zCopy)
1dde0 3b 0a 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d  ;..  assert(rc==
1ddf0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
1de00 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65  mt==0);.  Tcl_Re
1de10 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
1de20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1de30 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
1de40 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
1de50 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1de60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1de70 5f 4f 4b 20 26 26 20 6f 62 6a 63 3e 3d 35 20 26  _OK && objc>=5 &
1de80 26 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 69  & zTail ){.    i
1de90 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20  f( bytes>=0 ){. 
1dea0 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74       bytes = byt
1deb0 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c  es - (int)(zTail
1dec0 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  -zSql);.    }.  
1ded0 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
1dee0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1def0 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  , 0, Tcl_NewStri
1df00 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74  ngObj(zTail, byt
1df10 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  es), 0);.  }.  i
1df20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1df30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1df40 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1df50 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1df60 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
1df70 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
1df80 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
1df90 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1dfa0 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
1dfb0 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
1dfc0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1dfd0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
1dfe0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1dff0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1e000 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1e010 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1e020 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e030 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
1e040 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1e050 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
1e060 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1e070 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1e080 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1e090 33 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 66  3 DB sql bytes f
1e0a0 6c 61 67 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a  lags ?tailvar?.*
1e0b0 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
1e0c0 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
1e0d0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
1e0e0 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
1e0f0 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
1e100 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 20  ase handle <DB> 
1e110 61 6e 64 20 66 6c 61 67 73 20 3c 66 6c 61 67 73  and flags <flags
1e120 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
1e130 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 0a 2a 2a   <tailval> is.**
1e140 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
1e150 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 74  lobal variable t
1e160 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
1e170 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
1e180 20 6f 66 0a 2a 2a 20 3c 73 71 6c 3e 20 28 69 66   of.** <sql> (if
1e190 20 61 6e 79 29 2e 20 41 20 53 54 4d 54 20 68 61   any). A STMT ha
1e1a0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
1e1b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e1c0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1e1d0 73 74 5f 70 72 65 70 61 72 65 5f 76 33 28 0a 20  st_prepare_v3(. 
1e1e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1e1f0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1e200 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1e210 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1e220 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1e230 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1e240 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
1e250 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f 70  ql;.  char *zCop
1e260 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
1e270 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28        /* malloc(
1e280 29 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c 20 2a  ) copy of zSql *
1e290 2f 0a 20 20 69 6e 74 20 62 79 74 65 73 2c 20 66  /.  int bytes, f
1e2a0 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  lags;.  const ch
1e2b0 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20  ar *zTail = 0;. 
1e2c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
1e2d0 54 61 69 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Tail;.  sqlite3_
1e2e0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1e2f0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1e300 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1e310 66 28 20 6f 62 6a 63 21 3d 36 20 26 26 20 6f 62  f( objc!=6 && ob
1e320 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=5 ){.    Tcl
1e330 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1e340 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1e350 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1e360 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1e370 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1e380 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
1e390 65 73 20 66 6c 61 67 73 20 74 61 69 6c 76 61 72  es flags tailvar
1e3a0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1e3b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1e3c0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1e3d0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1e3e0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1e3f0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
1e400 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
1e410 53 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Sql = Tcl_GetStr
1e420 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
1e430 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1e440 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1e450 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
1e460 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e470 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1e480 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1e490 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 66 6c 61  p, objv[4], &fla
1e4a0 67 73 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  gs) ) return TCL
1e4b0 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e  _ERROR;..  /* In
1e4c0 73 74 65 61 64 20 6f 66 20 75 73 69 6e 67 20 7a  stead of using z
1e4d0 53 71 6c 20 64 69 72 65 63 74 6c 79 2c 20 6d 61  Sql directly, ma
1e4e0 6b 65 20 61 20 63 6f 70 79 20 69 6e 74 6f 20 61  ke a copy into a
1e4f0 20 62 75 66 66 65 72 20 6f 62 74 61 69 6e 65 64   buffer obtained
1e500 0a 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20 66  .  ** directly f
1e510 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 54 68  rom malloc(). Th
1e520 65 20 69 64 65 61 20 69 73 20 74 6f 20 6d 61 6b  e idea is to mak
1e530 65 20 69 74 20 65 61 73 69 65 72 20 66 6f 72 20  e it easier for 
1e540 76 61 6c 67 72 69 6e 64 0a 20 20 2a 2a 20 74 6f  valgrind.  ** to
1e550 20 73 70 6f 74 20 62 75 66 66 65 72 20 6f 76 65   spot buffer ove
1e560 72 72 65 61 64 73 2e 20 20 2a 2f 0a 20 20 69 66  rreads.  */.  if
1e570 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
1e580 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63    zCopy = malloc
1e590 28 62 79 74 65 73 29 3b 0a 20 20 20 20 6d 65 6d  (bytes);.    mem
1e5a0 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c  cpy(zCopy, zSql,
1e5b0 20 62 79 74 65 73 29 3b 0a 20 20 7d 65 6c 73 65   bytes);.  }else
1e5c0 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 28 69  {.    int n = (i
1e5d0 6e 74 29 73 74 72 6c 65 6e 28 7a 53 71 6c 29 20  nt)strlen(zSql) 
1e5e0 2b 20 31 3b 0a 20 20 20 20 7a 43 6f 70 79 20 3d  + 1;.    zCopy =
1e5f0 20 6d 61 6c 6c 6f 63 28 6e 29 3b 0a 20 20 20 20   malloc(n);.    
1e600 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a 53  memcpy(zCopy, zS
1e610 71 6c 2c 20 6e 29 3b 0a 20 20 7d 0a 20 20 70 7a  ql, n);.  }.  pz
1e620 54 61 69 6c 20 3d 20 6f 62 6a 63 3e 3d 36 20 3f  Tail = objc>=6 ?
1e630 20 26 7a 54 61 69 6c 20 3a 20 30 3b 0a 20 20 72   &zTail : 0;.  r
1e640 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1e650 61 72 65 5f 76 33 28 64 62 2c 20 7a 43 6f 70 79  are_v3(db, zCopy
1e660 2c 20 62 79 74 65 73 2c 20 28 75 6e 73 69 67 6e  , bytes, (unsign
1e670 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 26 70 53  ed int)flags,&pS
1e680 74 6d 74 2c 70 7a 54 61 69 6c 29 3b 0a 20 20 66  tmt,pzTail);.  f
1e690 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20 20 7a 54  ree(zCopy);.  zT
1e6a0 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a 54 61  ail = &zSql[(zTa
1e6b0 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a 0a 20  il - zCopy)];.. 
1e6c0 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49   assert(rc==SQLI
1e6d0 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d  TE_OK || pStmt==
1e6e0 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52  0);.  Tcl_ResetR
1e6f0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
1e700 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1e710 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1e720 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
1e730 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1e740 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1e750 26 26 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63  && zTail && objc
1e760 3e 3d 36 20 29 7b 0a 20 20 20 20 69 66 28 20 62  >=6 ){.    if( b
1e770 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20  ytes>=0 ){.     
1e780 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20 2d   bytes = bytes -
1e790 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71   (int)(zTail-zSq
1e7a0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  l);.    }.    Tc
1e7b0 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
1e7c0 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 30 2c  erp, objv[5], 0,
1e7d0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1e7e0 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c  j(zTail, bytes),
1e7f0 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72   0);.  }.  if( r
1e800 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e810 20 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d      assert( pStm
1e820 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  t==0 );.    sqli
1e830 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
1e840 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
1e850 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20   "(%d) ", rc);. 
1e860 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1e870 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1e880 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1e890 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (db), 0);.    re
1e8a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e8b0 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74    }..  if( pStmt
1e8c0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
1e8d0 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1e8e0 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1e8f0 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74  uf, pStmt) ) ret
1e900 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e910 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1e920 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1e930 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 0);.  }.  retu
1e940 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1e950 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1e960 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  e3_prepare_tkt31
1e970 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65  34 DB.**.** Gene
1e980 72 61 74 65 20 61 20 70 72 65 70 61 72 65 64 20  rate a prepared 
1e990 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 20  statement for a 
1e9a0 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69 6e 67  zero-byte string
1e9b0 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20 66 6f   as a test.** fo
1e9c0 72 20 74 69 63 6b 65 74 20 23 33 31 33 34 2e 20  r ticket #3134. 
1e9d0 20 54 68 65 20 73 74 72 69 6e 67 20 73 68 6f 75   The string shou
1e9e0 6c 64 20 62 65 20 70 72 65 63 65 64 65 64 20 62  ld be preceded b
1e9f0 79 20 61 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a  y a zero byte..*
1ea00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1ea10 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1ea20 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 28  prepare_tkt3134(
1ea30 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ea40 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ea50 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ea60 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1ea70 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1ea80 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1ea90 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1eaa0 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22   char zSql[] = "
1eab0 5c 30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a 20  \000SELECT 1";. 
1eac0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1ead0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1eae0 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74   zBuf[50];.  int
1eaf0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
1eb00 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1eb10 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1eb20 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1eb30 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1eb40 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1eb50 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1eb60 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
1eb70 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20   tailvar", 0);. 
1eb80 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1eb90 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1eba0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1ebb0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1ebc0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1ebd0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1ebe0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1ebf0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
1ec00 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20  b, &zSql[1], 0, 
1ec10 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73  &pStmt, 0);.  as
1ec20 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
1ec30 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b  OK || pStmt==0);
1ec40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1ec50 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1ec60 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1ec70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ec80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ec90 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1eca0 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20   pStmt==0 );.   
1ecb0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
1ecc0 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
1ecd0 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72  zBuf, "(%d) ", r
1ece0 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  c);.    Tcl_Appe
1ecf0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1ed00 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65   zBuf, sqlite3_e
1ed10 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20  rrmsg(db), 0);. 
1ed20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1ed30 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1ed40 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28  pStmt ){.    if(
1ed50 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1ed60 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1ed70 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20  p, zBuf, pStmt) 
1ed80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1ed90 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  OR;.    Tcl_Appe
1eda0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1edb0 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20   zBuf, 0);.  }. 
1edc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1edd0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1ede0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
1edf0 36 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  6 DB sql bytes t
1ee00 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ailvar.**.** Com
1ee10 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
1ee20 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
1ee30 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
1ee40 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
1ee50 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
1ee60 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
1ee70 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
1ee80 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1ee90 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
1eea0 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
1eeb0 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
1eec0 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
1eed0 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
1eee0 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
1eef0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1ef00 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1ef10 41 50 49 20 74 65 73 74 5f 70 72 65 70 61 72 65  API test_prepare
1ef20 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
1ef30 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1ef40 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1ef50 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1ef60 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1ef70 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1ef80 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1ef90 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1efa0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71   const void *zSq
1efb0 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  l;.  const void 
1efc0 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63  *zTail = 0;.  Tc
1efd0 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30  l_Obj *pTail = 0
1efe0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
1eff0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
1f000 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20  har zBuf[50]; . 
1f010 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62   int rc;.  int b
1f020 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20  ytes;           
1f030 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65       /* The inte
1f040 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73  ger specified as
1f050 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20   arg 3 */.  int 
1f060 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20  objlen;         
1f070 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74        /* The byt
1f080 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f  e-array length o
1f090 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66  f arg 2 */..  if
1f0a0 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
1f0b0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1f0c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1f0d0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1f0e0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1f0f0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1f100 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1f110 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
1f120 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29  s ?tailvar?", 0)
1f130 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1f140 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1f150 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1f160 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1f170 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1f180 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1f190 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
1f1a0 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61   Tcl_GetByteArra
1f1b0 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  yFromObj(objv[2]
1f1c0 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66  , &objlen);.  if
1f1d0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1f1e0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1f1f0 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72  [3], &bytes) ) r
1f200 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f210 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
1f220 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c 20 7a  _prepare16(db, z
1f230 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
1f240 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
1f250 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28  Tail : 0);.  if(
1f260 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1f270 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
1f280 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
1f290 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
1f2a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1f2b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1f2c0 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a   if( objc>=5 ){.
1f2d0 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b      if( zTail ){
1f2e0 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1f2f0 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28  objlen - (int)((
1f300 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a  u8 *)zTail-(u8 *
1f310 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  )zSql);.    }els
1f320 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20  e{.      objlen 
1f330 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
1f340 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  Tail = Tcl_NewBy
1f350 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a  teArrayObj((u8 *
1f360 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b  )zTail, objlen);
1f370 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1f380 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1f390 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
1f3a0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1f3b0 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a  , 0, pTail, 0);.
1f3c0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1f3d0 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d  ount(pTail);.  }
1f3e0 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
1f3f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1f400 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1f410 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1f420 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
1f430 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1f440 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1f450 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1f460 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
1f470 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1f480 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1f490 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1f4a0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65  age: sqlite3_pre
1f4b0 70 61 72 65 31 36 5f 76 32 20 44 42 20 73 71 6c  pare16_v2 DB sql
1f4c0 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
1f4d0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
1f4e0 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
1f4f0 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
1f500 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
1f510 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
1f520 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
1f530 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
1f540 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
1f550 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
1f560 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
1f570 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
1f580 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
1f590 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
1f5a0 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
1f5b0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
1f5c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f5d0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1f5e0 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28  st_prepare16_v2(
1f5f0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1f600 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1f610 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1f620 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1f630 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1f640 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1f650 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73  E_OMIT_UTF16.  s
1f660 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
1f670 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a  nst void *zSql;.
1f680 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54    const void *zT
1f690 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f  ail = 0;.  Tcl_O
1f6a0 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20  bj *pTail = 0;. 
1f6b0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1f6c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1f6d0 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e   zBuf[50]; .  in
1f6e0 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65  t rc;.  int byte
1f6f0 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
1f700 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72    /* The integer
1f710 20 73 70 65 63 69 66 69 65 64 20 61 73 20 61 72   specified as ar
1f720 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  g 3 */.  int obj
1f730 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  len;            
1f740 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61     /* The byte-a
1f750 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61  rray length of a
1f760 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f  rg 2 */..  if( o
1f770 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
1f780 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
1f790 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1f7a0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1f7b0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1f7c0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1f7d0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1f7e0 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  " DB sql bytes ?
1f7f0 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20  tailvar?", 0);. 
1f800 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1f810 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1f820 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1f830 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1f840 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1f850 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1f860 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63  ROR;.  zSql = Tc
1f870 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1f880 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26  omObj(objv[2], &
1f890 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54  objlen);.  if( T
1f8a0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1f8b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
1f8c0 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1f8d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1f8e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1f8f0 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c 20 7a  epare16_v2(db, z
1f900 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70 53 74  Sql, bytes, &pSt
1f910 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a  mt, objc>=5 ? &z
1f920 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28  Tail : 0);.  if(
1f930 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1f940 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
1f950 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
1f960 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
1f970 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1f980 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1f990 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a   if( objc>=5 ){.
1f9a0 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20 29 7b      if( zTail ){
1f9b0 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20  .      objlen = 
1f9c0 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28  objlen - (int)((
1f9d0 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a  u8 *)zTail-(u8 *
1f9e0 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  )zSql);.    }els
1f9f0 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20  e{.      objlen 
1fa00 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
1fa10 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79  Tail = Tcl_NewBy
1fa20 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38 20 2a  teArrayObj((u8 *
1fa30 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b  )zTail, objlen);
1fa40 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
1fa50 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20  Count(pTail);.  
1fa60 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
1fa70 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1fa80 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a  , 0, pTail, 0);.
1fa90 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
1faa0 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d  ount(pTail);.  }
1fab0 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
1fac0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1fad0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1fae0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1faf0 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
1fb00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1fb10 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1fb20 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1fb30 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53   0);.#endif /* S
1fb40 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1fb50 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1fb60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1fb70 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65  age: sqlite3_ope
1fb80 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69  n filename ?opti
1fb90 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61  ons-list?.*/.sta
1fba0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1fbb0 43 4c 41 50 49 20 74 65 73 74 5f 6f 70 65 6e 28  CLAPI test_open(
1fbc0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1fbd0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1fbe0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1fbf0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1fc00 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1fc10 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1fc20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71  *zFilename;.  sq
1fc30 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61  lite3 *db;.  cha
1fc40 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20  r zBuf[100];..  
1fc50 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
1fc60 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
1fc70 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  1 ){.    Tcl_App
1fc80 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1fc90 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1fca0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1fcb0 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1fcc0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1fcd0 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f  " filename optio
1fce0 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20  ns-list", 0);.  
1fcf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1fd00 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65  OR;.  }..  zFile
1fd10 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f 20  name = objc>1 ? 
1fd20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1fd30 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 73 71  jv[1]) : 0;.  sq
1fd40 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65  lite3_open(zFile
1fd50 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20  name, &db);.  . 
1fd60 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1fd70 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1fd80 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29  nterp, zBuf, db)
1fd90 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1fda0 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ROR;.  Tcl_Appen
1fdb0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1fdc0 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
1fdd0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1fde0 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1fdf0 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c 45 4e  e3_open_v2 FILEN
1fe00 41 4d 45 20 46 4c 41 47 53 20 56 46 53 0a 2a 2f  AME FLAGS VFS.*/
1fe10 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1fe20 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6f  TE_TCLAPI test_o
1fe30 70 65 6e 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a  pen_v2(.  void *
1fe40 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1fe50 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1fe60 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1fe70 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1fe80 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73  objv[].){.  cons
1fe90 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1fea0 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
1feb0 2a 7a 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61  *zVfs;.  int fla
1fec0 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  gs = 0;.  sqlite
1fed0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
1fee0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1fef0 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c 61 67 3b  ];..  int nFlag;
1ff00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46  .  Tcl_Obj **apF
1ff10 6c 61 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  lag;.  int i;.. 
1ff20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
1ff30 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1ff40 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1ff50 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20  objv, "FILENAME 
1ff60 46 4c 41 47 53 20 56 46 53 22 29 3b 0a 20 20 20  FLAGS VFS");.   
1ff70 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ff80 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  R;.  }.  zFilena
1ff90 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
1ffa0 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a  ng(objv[1]);.  z
1ffb0 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Vfs = Tcl_GetStr
1ffc0 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
1ffd0 69 66 28 20 7a 56 66 73 5b 30 5d 3d 3d 30 78 30  if( zVfs[0]==0x0
1ffe0 30 20 29 20 7a 56 66 73 20 3d 20 30 3b 0a 0a 20  0 ) zVfs = 0;.. 
1fff0 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62   rc = Tcl_ListOb
20000 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74  jGetElements(int
20010 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e  erp, objv[2], &n
20020 46 6c 61 67 2c 20 26 61 70 46 6c 61 67 29 3b 0a  Flag, &apFlag);.
20030 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
20040 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
20050 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 6c 61 67  for(i=0; i<nFlag
20060 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
20070 69 46 6c 61 67 3b 0a 20 20 20 20 73 74 72 75 63  iFlag;.    struc
20080 74 20 4f 70 65 6e 46 6c 61 67 20 7b 0a 20 20 20  t OpenFlag {.   
20090 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
200a0 46 6c 61 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  Flag;.      int 
200b0 66 6c 61 67 3b 0a 20 20 20 20 7d 20 61 46 6c 61  flag;.    } aFla
200c0 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  g[] = {.      { 
200d0 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  "SQLITE_OPEN_REA
200e0 44 4f 4e 4c 59 22 2c 20 53 51 4c 49 54 45 5f 4f  DONLY", SQLITE_O
200f0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a  PEN_READONLY },.
20100 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
20110 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 22 2c  OPEN_READWRITE",
20120 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
20130 44 57 52 49 54 45 20 7d 2c 0a 20 20 20 20 20 20  DWRITE },.      
20140 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  { "SQLITE_OPEN_C
20150 52 45 41 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f  REATE", SQLITE_O
20160 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
20170 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
20180 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
20190 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ", SQLITE_OPEN_D
201a0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a  ELETEONCLOSE },.
201b0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
201c0 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 22 2c  OPEN_EXCLUSIVE",
201d0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
201e0 4c 55 53 49 56 45 20 7d 2c 0a 20 20 20 20 20 20  LUSIVE },.      
201f0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41  { "SQLITE_OPEN_A
20200 55 54 4f 50 52 4f 58 59 22 2c 20 53 51 4c 49 54  UTOPROXY", SQLIT
20210 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
20220 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
20230 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
20240 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
20250 41 49 4e 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20  AIN_DB },.      
20260 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  { "SQLITE_OPEN_T
20270 45 4d 50 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f  EMP_DB", SQLITE_
20280 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a  OPEN_TEMP_DB },.
20290 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
202a0 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
202b0 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  B", SQLITE_OPEN_
202c0 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7d 2c 0a  TRANSIENT_DB },.
202d0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
202e0 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
202f0 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L", SQLITE_OPEN_
20300 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a  MAIN_JOURNAL },.
20310 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
20320 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
20330 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L", SQLITE_OPEN_
20340 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a  TEMP_JOURNAL },.
20350 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
20360 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 22  OPEN_SUBJOURNAL"
20370 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
20380 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  BJOURNAL },.    
20390 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
203a0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 22  _MASTER_JOURNAL"
203b0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  , SQLITE_OPEN_MA
203c0 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a  STER_JOURNAL },.
203d0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
203e0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20 53  OPEN_NOMUTEX", S
203f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
20400 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  EX },.      { "S
20410 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
20420 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50  UTEX", SQLITE_OP
20430 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a  EN_FULLMUTEX },.
20440 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
20450 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
20460 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ", SQLITE_OPEN_S
20470 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20  HAREDCACHE },.  
20480 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
20490 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 22  EN_PRIVATECACHE"
204a0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  , SQLITE_OPEN_PR
204b0 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20  IVATECACHE },.  
204c0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
204d0 45 4e 5f 57 41 4c 22 2c 20 53 51 4c 49 54 45 5f  EN_WAL", SQLITE_
204e0 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20 20  OPEN_WAL },.    
204f0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
20500 5f 55 52 49 22 2c 20 53 51 4c 49 54 45 5f 4f 50  _URI", SQLITE_OP
20510 45 4e 5f 55 52 49 20 7d 2c 0a 20 20 20 20 20 20  EN_URI },.      
20520 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a  { 0, 0 }.    };.
20530 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74      rc = Tcl_Get
20540 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75  IndexFromObjStru
20550 63 74 28 69 6e 74 65 72 70 2c 20 61 70 46 6c 61  ct(interp, apFla
20560 67 5b 69 5d 2c 20 61 46 6c 61 67 2c 20 73 69 7a  g[i], aFlag, siz
20570 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29 2c 20 0a  eof(aFlag[0]), .
20580 20 20 20 20 20 20 20 20 22 66 6c 61 67 22 2c 20          "flag", 
20590 30 2c 20 26 69 46 6c 61 67 0a 20 20 20 20 29 3b  0, &iFlag.    );
205a0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c  .    if( rc!=TCL
205b0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
205c0 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 61 46  .    flags |= aF
205d0 6c 61 67 5b 69 46 6c 61 67 5d 2e 66 6c 61 67 3b  lag[iFlag].flag;
205e0 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
205f0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69  ite3_open_v2(zFi
20600 6c 65 6e 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61  lename, &db, fla
20610 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 69 66 28  gs, zVfs);.  if(
20620 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
20630 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
20640 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
20650 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20660 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
20670 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
20680 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
20690 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
206a0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
206b0 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f  pen16 filename o
206c0 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63  ptions.*/.static
206d0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
206e0 50 49 20 74 65 73 74 5f 6f 70 65 6e 31 36 28 0a  PI test_open16(.
206f0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
20700 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
20710 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
20720 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
20730 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20740 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
20750 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 63 6f  _OMIT_UTF16.  co
20760 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
20770 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ame;.  sqlite3 *
20780 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  db;.  char zBuf[
20790 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
207a0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
207b0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
207c0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
207d0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
207e0 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
207f0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
20800 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70  ), " filename op
20810 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b  tions-list", 0);
20820 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
20830 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46  ERROR;.  }..  zF
20840 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
20850 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
20860 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b 0a 20  j(objv[1], 0);. 
20870 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
20880 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b  zFilename, &db);
20890 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65  .  .  if( sqlite
208a0 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
208b0 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
208c0 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54  , db) ) return T
208d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
208e0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
208f0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23  erp, zBuf, 0);.#
20900 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
20910 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
20920 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
20930 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
20940 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31  qlite3_complete1
20950 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69 6e 67  6 <UTF-16 string
20960 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  >.**.** Return 1
20970 20 69 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   if the supplied
20980 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 63   argument is a c
20990 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74  omplete SQL stat
209a0 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f 0a 2a  ement, or zero.*
209b0 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  * otherwise..*/.
209c0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
209d0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f  E_TCLAPI test_co
209e0 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f 69 64  mplete16(.  void
209f0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
20a00 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
20a10 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
20a20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
20a30 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20  T objv[].){.#if 
20a40 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
20a50 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29 20 26  OMIT_COMPLETE) &
20a60 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
20a70 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a 20 20  E_OMIT_UTF16).  
20a80 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20 20 69  char *zBuf;..  i
20a90 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
20aa0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
20ab0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
20ac0 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73 71 6c  jv, "<utf-16 sql
20ad0 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  >");.    return 
20ae0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
20af0 20 20 7a 42 75 66 20 3d 20 28 63 68 61 72 2a 29    zBuf = (char*)
20b00 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
20b10 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c  FromObj(objv[1],
20b20 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62   0);.  Tcl_SetOb
20b30 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
20b40 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
20b50 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36  lite3_complete16
20b60 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64 69 66  (zBuf)));.#endif
20b70 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
20b80 43 4f 4d 50 4c 45 54 45 20 26 26 20 53 51 4c 49  COMPLETE && SQLI
20b90 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
20ba0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
20bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
20bc0 3a 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d 61 6c  : sqlite3_normal
20bd0 69 7a 65 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 52 65  ize SQL.**.** Re
20be0 74 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61 6c 69  turn the normali
20bf0 7a 65 64 20 76 61 6c 75 65 20 66 6f 72 20 61 6e  zed value for an
20c00 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
20c10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
20c20 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
20c30 5f 6e 6f 72 6d 61 6c 69 7a 65 28 0a 20 20 76 6f  _normalize(.  vo
20c40 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
20c50 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
20c60 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
20c70 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
20c80 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
20c90 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68  char *zSql;.  ch
20ca0 61 72 20 2a 7a 4e 6f 72 6d 3b 0a 20 20 65 78 74  ar *zNorm;.  ext
20cb0 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ern char *sqlite
20cc0 33 5f 6e 6f 72 6d 61 6c 69 7a 65 28 63 6f 6e 73  3_normalize(cons
20cd0 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69 66 28  t char*);..  if(
20ce0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
20cf0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
20d00 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
20d10 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20 72 65  , "SQL");.    re
20d20 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20d30 20 20 7d 0a 0a 20 20 7a 53 71 6c 20 3d 20 28 63    }..  zSql = (c
20d40 68 61 72 2a 29 54 63 6c 5f 47 65 74 53 74 72 69  har*)Tcl_GetStri
20d50 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a  ng(objv[1]);.  z
20d60 4e 6f 72 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6e  Norm = sqlite3_n
20d70 6f 72 6d 61 6c 69 7a 65 28 7a 53 71 6c 29 3b 0a  ormalize(zSql);.
20d80 20 20 69 66 28 20 7a 4e 6f 72 6d 20 29 7b 0a 20    if( zNorm ){. 
20d90 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
20da0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
20db0 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 6f  NewStringObj(zNo
20dc0 72 6d 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71  rm, -1));.    sq
20dd0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 6f 72 6d  lite3_free(zNorm
20de0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
20df0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
20e00 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
20e10 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  step STMT.**.** 
20e20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74 61 74  Advance the stat
20e30 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78  ement to the nex
20e40 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63  t row..*/.static
20e50 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
20e60 50 49 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20  PI test_step(.  
20e70 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20e80 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20e90 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
20ea0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
20eb0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
20ec0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20ed0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
20ee0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
20ef0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
20f00 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
20f10 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
20f20 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
20f30 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
20f40 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
20f50 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
20f60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20f70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
20f80 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
20f90 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
20fa0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
20fb0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
20fc0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
20fd0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
20fe0 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21  );..  /* if( rc!
20ff0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20  =SQLITE_DONE && 
21000 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
21010 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21020 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52  R; */.  Tcl_SetR
21030 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
21040 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
21050 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
21060 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
21070 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
21080 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c  _TCLAPI test_sql
21090 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
210a0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
210b0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
210c0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
210d0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
210e0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
210f0 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
21100 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
21110 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
21120 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
21130 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
21140 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21150 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
21160 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
21170 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
21180 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
21190 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
211a0 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
211b0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
211c0 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f  (char *)sqlite3_
211d0 73 71 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f  sql(pStmt), TCL_
211e0 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74  VOLATILE);.  ret
211f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74  urn TCL_OK;.}.st
21200 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
21210 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78 5f 73  TCLAPI test_ex_s
21220 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ql(.  void * cli
21230 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
21240 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
21250 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
21260 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
21270 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
21280 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63  stmt *pStmt;.  c
21290 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 6f  har *z;..  if( o
212a0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
212b0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
212c0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
212d0 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
212e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
212f0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
21300 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
21310 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
21320 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
21330 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21340 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  ROR;.  z = sqlit
21350 65 33 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28  e3_expanded_sql(
21360 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65  pStmt);.  Tcl_Se
21370 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
21380 7a 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29  z, TCL_VOLATILE)
21390 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
213a0 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
213b0 4c 5f 4f 4b 3b 0a 7d 0a 23 69 66 64 65 66 20 53  L_OK;.}.#ifdef S
213c0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52  QLITE_ENABLE_NOR
213d0 4d 41 4c 49 5a 45 0a 73 74 61 74 69 63 20 69 6e  MALIZE.static in
213e0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
213f0 74 65 73 74 5f 6e 6f 72 6d 5f 73 71 6c 28 0a 20  test_norm_sql(. 
21400 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
21410 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
21420 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
21430 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
21440 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
21450 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
21460 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
21470 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
21480 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
21490 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
214a0 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
214b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
214c0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
214d0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
214e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
214f0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
21500 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21510 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
21520 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
21530 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6e 6f 72  ar *)sqlite3_nor
21540 6d 61 6c 69 7a 65 64 5f 73 71 6c 28 70 53 74 6d  malized_sql(pStm
21550 74 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45  t), TCL_VOLATILE
21560 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
21570 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
21580 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f  SQLITE_ENABLE_NO
21590 52 4d 41 4c 49 5a 45 20 2a 2f 0a 0a 2f 2a 0a 2a  RMALIZE */../*.*
215a0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
215b0 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54  _column_count ST
215c0 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
215d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
215e0 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20  olumns returned 
215f0 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65  by the sql state
21600 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74  ment STMT..*/.st
21610 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
21620 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 75  TCLAPI test_colu
21630 6d 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  mn_count(.  void
21640 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
21650 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
21660 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
21670 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21680 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
21690 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
216a0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
216b0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    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 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
217a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
217b0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
217c0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
217d0 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
217e0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
217f0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
21800 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54  3_column_type ST
21810 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
21820 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
21830 6f 66 20 74 68 65 20 64 61 74 61 20 69 6e 20 63  of the data in c
21840 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f  olumn 'column' o
21850 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f  f the current ro
21860 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  w..*/.static int
21870 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
21880 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  est_column_type(
21890 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
218a0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
218b0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
218c0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
218d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
218e0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
218f0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
21900 63 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a  col;.  int tp;..
21910 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
21920 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
21930 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
21940 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
21950 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
21960 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
21970 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
21980 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
21990 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
219a0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
219b0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
219c0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
219d0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
219e0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
219f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
21a00 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
21a10 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
21a20 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
21a30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
21a40 20 20 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63    tp = sqlite3_c
21a50 6f 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74  olumn_type(pStmt
21a60 2c 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68  , col);.  switch
21a70 28 20 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( tp ){.    case
21a80 20 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a   SQLITE_INTEGER:
21a90 20 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52   .      Tcl_SetR
21aa0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49  esult(interp, "I
21ab0 4e 54 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41  NTEGER", TCL_STA
21ac0 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
21ad0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
21ae0 49 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20  ITE_NULL:.      
21af0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
21b00 74 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43  terp, "NULL", TC
21b10 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
21b20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
21b30 65 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a  e SQLITE_FLOAT:.
21b40 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
21b50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f  ult(interp, "FLO
21b60 41 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  AT", TCL_STATIC)
21b70 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
21b80 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
21b90 54 45 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f  TEXT:.      Tcl_
21ba0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
21bb0 2c 20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54  , "TEXT", TCL_ST
21bc0 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
21bd0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
21be0 4c 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20  LITE_BLOB:.     
21bf0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
21c00 6e 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54  nterp, "BLOB", T
21c10 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
21c20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65     break;.    de
21c30 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73  fault:.      ass
21c40 65 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72  ert(0);.  }..  r
21c50 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
21c60 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
21c70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
21c80 36 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  64 STMT column.*
21c90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
21ca0 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27  data in column '
21cb0 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63  column' of the c
21cc0 75 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20  urrent row cast 
21cd0 61 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36  as an.** wide (6
21ce0 34 2d 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a  4-bit) integer..
21cf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
21d00 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
21d10 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20  _column_int64(. 
21d20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
21d30 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
21d40 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
21d50 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
21d60 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
21d70 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
21d80 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
21d90 6c 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a  l;.  i64 iVal;..
21da0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
21db0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
21dc0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
21dd0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
21de0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
21df0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
21e00 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
21e10 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
21e20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
21e30 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
21e40 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
21e50 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
21e60 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
21e70 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
21e80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
21e90 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
21ea0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
21eb0 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
21ec0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
21ed0 20 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    iVal = sqlite3
21ee0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53  _column_int64(pS
21ef0 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c  tmt, col);.  Tcl
21f00 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
21f10 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
21f20 65 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a  eIntObj(iVal));.
21f30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
21f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
21f50 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
21f60 62 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  blob STMT column
21f70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
21f80 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
21f90 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20  t_column_blob(. 
21fa0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
21fb0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
21fc0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
21fd0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
21fe0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
21ff0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
22000 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
22010 6c 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20  l;..  int len;. 
22020 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c   const void *pBl
22030 6f 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ob;..  if( objc!
22040 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
22050 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
22060 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
22070 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
22080 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
22090 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
220a0 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
220b0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
220c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
220d0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
220e0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
220f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
22100 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
22110 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22120 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
22130 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
22140 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
22150 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
22160 4f 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c  OR;..  len = sql
22170 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
22180 73 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20  s(pStmt, col);. 
22190 20 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   pBlob = sqlite3
221a0 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
221b0 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f  mt, col);.  Tcl_
221c0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
221d0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
221e0 41 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20  ArrayObj(pBlob, 
221f0 6c 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  len));.  return 
22200 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
22210 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
22220 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54  column_double ST
22230 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
22240 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20  Return the data 
22250 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
22260 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
22270 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 20  t row cast as a 
22280 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  double..*/.stati
22290 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
222a0 41 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  API test_column_
222b0 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
222c0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
222d0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
222e0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
222f0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
22300 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
22310 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
22320 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f  .  int col;.  do
22330 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66  uble rVal;..  if
22340 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
22350 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
22360 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
22370 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
22380 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
22390 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
223a0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
223b0 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
223c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
223d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
223e0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
223f0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
22400 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
22410 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
22420 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
22430 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
22440 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
22450 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
22460 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56  TCL_ERROR;..  rV
22470 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
22480 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
22490 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
224a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
224b0 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65  p, Tcl_NewDouble
224c0 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65  Obj(rVal));.  re
224d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
224e0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
224f0 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20  ite3_data_count 
22500 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
22510 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
22520 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
22530 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
22540 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
22550 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
22560 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 61  E_TCLAPI test_da
22570 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  ta_count(.  void
22580 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
22590 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
225a0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
225b0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
225c0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
225d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
225e0 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
225f0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
22600 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
22610 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
22620 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
22630 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
22640 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
22650 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
22660 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
22670 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
22680 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
22690 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
226a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
226b0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
226c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
226d0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
226e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
226f0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
22700 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74  3_data_count(pSt
22710 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
22720 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
22730 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
22740 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54  column_text STMT
22750 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
22760 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
22770 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d  umn_decltype STM
22780 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
22790 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
227a0 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63  lumn_name STMT c
227b0 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  olumn.*/.static 
227c0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
227d0 49 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38  I test_stmt_utf8
227e0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
227f0 74 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a  tData,        /*
22800 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
22810 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
22820 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a  to be invoke */.
22830 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
22840 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
22850 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
22860 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
22870 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
22880 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
22890 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78   const char *(*x
228a0 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
228b0 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e  mt*, int);.  con
228c0 73 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a  st char *zRet;..
228d0 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74    xFunc = (const
228e0 20 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74   char *(*)(sqlit
228f0 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63  e3_stmt*, int))c
22900 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28  lientData;.  if(
22910 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
22920 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
22930 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
22940 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
22950 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
22960 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
22970 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
22980 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
22990 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
229a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
229b0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
229c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
229d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
229e0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
229f0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
22a00 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
22a10 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
22a20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
22a30 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74  CL_ERROR;.  zRet
22a40 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20   = xFunc(pStmt, 
22a50 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74  col);.  if( zRet
22a60 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
22a70 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
22a80 68 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a  har *)zRet, 0);.
22a90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
22aa0 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  _OK;.}..static i
22ab0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
22ac0 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
22ad0 6f 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  over(.  void * c
22ae0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
22af0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22b00 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
22b10 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
22b20 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
22b30 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52  SQLITE_OMIT_DEPR
22b40 45 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b  ECATED.  int rc;
22b50 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
22b60 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
22b70 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
22b80 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
22b90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22ba0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
22bb0 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
22bc0 6f 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65  over();.  Tcl_Se
22bd0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
22be0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
22bf0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
22c00 54 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  TIC);.#endif.  r
22c10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
22c20 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
22c30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
22c40 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  t STMT column.**
22c50 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
22c60 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
22c70 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  pe STMT column.*
22c80 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
22c90 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  te3_column_name 
22ca0 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
22cb0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
22cc0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d  _TCLAPI test_stm
22cd0 74 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20  t_utf16(.  void 
22ce0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  * clientData,   
22cf0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
22d00 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
22d10 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
22d20 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
22d30 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
22d40 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
22d50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
22d60 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
22d70 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
22d80 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
22d90 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
22da0 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20  Tcl_Obj *pRet;. 
22db0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
22dc0 6d 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  me16;.  const vo
22dd0 69 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c  id *(*xFunc)(sql
22de0 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
22df0 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f  ;..  xFunc = (co
22e00 6e 73 74 20 76 6f 69 64 20 2a 28 2a 29 28 73 71  nst void *(*)(sq
22e10 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
22e20 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ))clientData;.  
22e30 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
22e40 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
22e50 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
22e60 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
22e70 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
22e80 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
22e90 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
22ea0 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
22eb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22ec0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
22ed0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
22ee0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
22ef0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
22f00 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
22f10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
22f20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
22f30 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
22f40 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
22f50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
22f60 7a 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28  zName16 = xFunc(
22f70 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69  pStmt, col);.  i
22f80 66 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20  f( zName16 ){.  
22f90 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e    int n;.    con
22fa0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e 61  st char *z = zNa
22fb0 6d 65 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e 3d  me16;.    for(n=
22fc0 30 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31  0; z[n] || z[n+1
22fd0 5d 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20 70  ]; n+=2){}.    p
22fe0 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74  Ret = Tcl_NewByt
22ff0 65 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31  eArrayObj(zName1
23000 36 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63 6c  6, n+2);.    Tcl
23010 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
23020 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d  terp, pRet);.  }
23030 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
23040 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
23050 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
23060 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
23070 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
23080 5f 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  _int STMT column
23090 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  .**.** Usage: sq
230a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
230b0 65 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  es STMT column.*
230c0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
230d0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
230e0 31 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a  16 STMT column.*
230f0 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
23100 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
23110 73 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76  st_stmt_int(.  v
23120 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
23130 2c 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ,    /* Pointer 
23140 74 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75  to SQLite API fu
23150 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76  nction to be inv
23160 6f 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  oked */.  Tcl_In
23170 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
23180 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
23190 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
231a0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
231b0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
231c0 74 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78  t col;.  int (*x
231d0 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74  Func)(sqlite3_st
231e0 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46  mt*, int);..  xF
231f0 75 6e 63 20 3d 20 28 69 6e 74 20 28 2a 29 28 73  unc = (int (*)(s
23200 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
23210 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
23220 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
23230 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
23240 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
23250 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
23260 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
23270 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
23280 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
23290 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
232a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
232b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
232c0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
232d0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
232e0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
232f0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
23300 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
23310 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
23320 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
23330 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
23340 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
23350 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
23360 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
23370 77 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53  wIntObj(xFunc(pS
23380 74 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72  tmt, col)));.  r
23390 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
233a0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
233b0 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20  qlite_set_magic 
233c0 20 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45   DB  MAGIC-NUMBE
233d0 52 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  R.**.** Set the 
233e0 64 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e  db->magic value.
233f0 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
23400 6f 20 74 65 73 74 20 65 72 72 6f 72 20 72 65 63  o test error rec
23410 6f 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a  overy logic..*/.
23420 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
23430 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65 5f  E_TCLAPI sqlite_
23440 73 65 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69  set_magic(.  voi
23450 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
23460 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
23470 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
23480 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
23490 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
234a0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
234b0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
234c0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
234d0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
234e0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
234f0 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20  gv[0],.         
23500 22 20 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b  " DB MAGIC", 0);
23510 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23520 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
23530 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
23540 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
23550 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
23560 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74  _ERROR;.  if( st
23570 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53  rcmp(argv[2], "S
23580 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
23590 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d  ")==0 ){.    db-
235a0 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
235b0 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65  MAGIC_OPEN;.  }e
235c0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
235d0 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f  rgv[2], "SQLITE_
235e0 4d 41 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d  MAGIC_CLOSED")==
235f0 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
23600 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
23610 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73  C_CLOSED;.  }els
23620 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67  e if( strcmp(arg
23630 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41  v[2], "SQLITE_MA
23640 47 49 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b  GIC_BUSY")==0 ){
23650 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
23660 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
23670 53 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  SY;.  }else if( 
23680 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20  strcmp(argv[2], 
23690 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52  "SQLITE_MAGIC_ER
236a0 52 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ROR")==0 ){.    
236b0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
236c0 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a  TE_MAGIC_ERROR;.
236d0 20 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f    }else if( Tcl_
236e0 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
236f0 72 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64  rgv[2], (int*)&d
23700 62 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20  b->magic) ){.   
23710 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23720 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
23730 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
23740 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
23750 5f 69 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a  _interrupt  DB .
23760 2a 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e  **.** Trigger an
23770 20 69 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42   interrupt on DB
23780 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
23790 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
237a0 74 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76  t_interrupt(.  v
237b0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
237c0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
237d0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
237e0 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
237f0 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  v.){.  sqlite3 *
23800 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
23810 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
23820 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
23830 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
23840 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
23850 61 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20  argv[0], " DB", 
23860 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
23870 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23880 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
23890 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
238a0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
238b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
238c0 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64  ite3_interrupt(d
238d0 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  b);.  return TCL
238e0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
238f0 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
23900 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 66  te_function DB f
23910 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a  unction-name.**.
23920 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75 73  ** Delete the us
23930 65 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e  er function 'fun
23940 63 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d  ction-name' from
23950 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
23960 20 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73   DB. It.** is as
23970 73 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 75  sumed that the u
23980 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61 73  ser function was
23990 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38   created as UTF8
239a0 2c 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a  , any number of.
239b0 2a 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74 68  ** arguments (th
239c0 65 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e  e way the TCL in
239d0 74 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29  terface does it)
239e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
239f0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 65  SQLITE_TCLAPI de
23a00 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  lete_function(. 
23a10 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
23a20 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
23a30 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
23a40 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
23a50 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rgv.){.  int rc;
23a60 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
23a70 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
23a80 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
23a90 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
23aa0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
23ab0 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
23ac0 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
23ad0 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
23ae0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
23af0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23b00 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
23b10 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
23b20 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
23b30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23b40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
23b50 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
23b60 20 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51   argv[2], -1, SQ
23b70 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
23b80 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
23b90 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
23ba0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
23bb0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
23bc0 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
23bd0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
23be0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65  Usage: sqlite_de
23bf0 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44  lete_collation D
23c00 42 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65  B collation-name
23c10 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68  .**.** Delete th
23c20 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
23c30 65 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d  ence 'collation-
23c40 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62  name' from datab
23c50 61 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44  ase handle .** D
23c60 42 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64  B. It is assumed
23c70 20 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74   that the collat
23c80 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73  ion sequence was
23c90 20 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38   created as UTF8
23ca0 20 28 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68   (the .** way th
23cb0 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20  e TCL interface 
23cc0 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61  does it)..*/.sta
23cd0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
23ce0 43 4c 41 50 49 20 64 65 6c 65 74 65 5f 63 6f 6c  CLAPI delete_col
23cf0 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  lation(.  void *
23d00 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
23d10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
23d20 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
23d30 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
23d40 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
23d50 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
23d60 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
23d70 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23d80 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23d90 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23da0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
23db0 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
23dc0 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
23dd0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23de0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
23df0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
23e00 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
23e10 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
23e20 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
23e30 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
23e40 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  lation(db, argv[
23e50 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  2], SQLITE_UTF8,
23e60 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
23e70 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
23e80 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
23e90 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
23ea0 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
23eb0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
23ec0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67  Usage: sqlite3_g
23ed0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42  et_autocommit DB
23ee0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
23ef0 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
23f00 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74  se DB is current
23f10 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  ly in auto-commi
23f20 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72  t mode..** Retur
23f30 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  n false if not..
23f40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
23f50 4c 49 54 45 5f 54 43 4c 41 50 49 20 67 65 74 5f  LITE_TCLAPI get_
23f60 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f  autocommit(.  vo
23f70 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
23f80 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
23f90 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
23fa0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
23fb0 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b  .){.  char zBuf[
23fc0 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  30];.  sqlite3 *
23fd0 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
23fe0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
23ff0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24000 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
24010 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
24020 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
24030 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
24040 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24050 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
24060 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
24070 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
24080 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
24090 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  OR;.  sqlite3_sn
240a0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
240b0 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
240c0 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74   sqlite3_get_aut
240d0 6f 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20  ocommit(db));.  
240e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
240f0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
24100 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
24110 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
24120 67 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79  ge: sqlite3_busy
24130 5f 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a  _timeout DB MS.*
24140 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
24150 79 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73  y timeout.  This
24160 20 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20   is more easily 
24170 64 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74  done using the t
24180 69 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64  imeout.** method
24190 20 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65   of the TCL inte
241a0 72 66 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e  rface.  But we n
241b0 65 65 64 20 61 20 77 61 79 20 74 6f 20 74 65 73  eed a way to tes
241c0 74 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68  t the case.** wh
241d0 65 72 65 20 69 74 20 72 65 74 75 72 6e 73 20 53  ere it returns S
241e0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f  QLITE_MISUSE..*/
241f0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
24200 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
24210 75 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76  usy_timeout(.  v
24220 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
24230 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
24240 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
24250 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
24260 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d  v.){.  int rc, m
24270 73 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  s;.  sqlite3 *db
24280 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
24290 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
242a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
242b0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
242c0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
242d0 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
242e0 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
242f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
24300 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
24310 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
24320 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
24330 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24340 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
24350 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
24360 32 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72  2], &ms) ) retur
24370 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
24380 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79  c = sqlite3_busy
24390 5f 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29  _timeout(db, ms)
243a0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
243b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c  sult(interp, sql
243c0 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
243d0 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43   0);.  return TC
243e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
243f0 73 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61  sage:  tcl_varia
24400 62 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c  ble_type VARIABL
24410 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ENAME.**.** Retu
24420 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  rn the name of t
24430 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72  he internal repr
24440 65 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74  esentation for t
24450 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74  he.** value of t
24460 68 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c  he given variabl
24470 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
24480 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
24490 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
244a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
244b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
244c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
244d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
244e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
244f0 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  .){.  Tcl_Obj *p
24500 56 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  Var;.  if( objc!
24510 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
24520 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
24530 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52  p, 1, objv, "VAR
24540 49 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74  IABLE");.    ret
24550 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24560 20 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f   }.  pVar = Tcl_
24570 47 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70  GetVar2Ex(interp
24580 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
24590 6f 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c  objv[1]), 0, TCL
245a0 5f 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b  _LEAVE_ERR_MSG);
245b0 0a 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29  .  if( pVar==0 )
245c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
245d0 52 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74  R;.  if( pVar->t
245e0 79 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63  ypePtr ){.    Tc
245f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
24600 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
24610 72 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79  ringObj(pVar->ty
24620 70 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29  pePtr->name, -1)
24630 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24640 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
24650 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
24660 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20  _release_memory 
24670 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70  ?N?.**.** Attemp
24680 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  t to release mem
24690 6f 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65  ory currently he
246a0 6c 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61  ld but not actua
246b0 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a  lly required..**
246c0 20 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69   The integer N i
246d0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
246e0 62 79 74 65 73 20 77 65 20 61 72 65 20 74 72 79  bytes we are try
246f0 69 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20  ing to release. 
24700 20 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20   The .** return 
24710 76 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f  value is the amo
24720 75 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63  unt of memory ac
24730 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e  tually released.
24740 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
24750 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
24760 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  t_release_memory
24770 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
24780 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
24790 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
247a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
247b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
247c0 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .){.#if defined(
247d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
247e0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29  MORY_MANAGEMENT)
247f0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
24800 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
24810 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20  .  int N;.  int 
24820 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  amt;.  if( objc!
24830 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =1 && objc!=2 ){
24840 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
24850 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
24860 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20   objv, "?N?");. 
24870 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24880 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
24890 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  bjc==2 ){.    if
248a0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
248b0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
248c0 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72  [1], &N) ) retur
248d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
248e0 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31  else{.    N = -1
248f0 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71  ;.  }.  amt = sq
24900 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
24910 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53  mory(N);.  Tcl_S
24920 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
24930 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
24940 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a  j(amt));.#endif.
24950 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
24960 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
24970 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  :  sqlite3_db_re
24980 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42 0a  lease_memory DB.
24990 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  **.** Attempt to
249a0 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   release memory 
249b0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62  currently held b
249c0 79 20 64 61 74 61 62 61 73 65 20 44 42 2e 20 20  y database DB.  
249d0 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72 65  Return the.** re
249e0 73 75 6c 74 20 63 6f 64 65 20 28 77 68 69 63 68  sult code (which
249f0 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
24a00 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
24a10 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e 0a  s always zero)..
24a20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
24a30 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
24a40 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
24a50 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ry(.  void * cli
24a60 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
24a70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
24a80 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
24a90 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
24aa0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
24ab0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
24ac0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
24ad0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
24ae0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
24af0 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
24b00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24b10 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
24b20 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
24b30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
24b40 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
24b50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24b60 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
24b70 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
24b80 6f 72 79 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53  ory(db);.  Tcl_S
24b90 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
24ba0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
24bb0 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  j(rc));.  return
24bc0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
24bd0 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
24be0 33 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 20  3_db_cacheflush 
24bf0 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  DB.**.** Attempt
24c00 20 74 6f 20 66 6c 75 73 68 20 61 6e 79 20 64 69   to flush any di
24c10 72 74 79 20 70 61 67 65 73 20 74 6f 20 64 69 73  rty pages to dis
24c20 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  k..*/.static int
24c30 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
24c40 65 73 74 5f 64 62 5f 63 61 63 68 65 66 6c 75 73  est_db_cacheflus
24c50 68 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  h(.  void * clie
24c60 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
24c70 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
24c80 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
24c90 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24ca0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
24cb0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
24cc0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
24cd0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
24ce0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
24cf0 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
24d00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24d10 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
24d20 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
24d30 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
24d40 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
24d50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24d60 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
24d70 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 64  _db_cacheflush(d
24d80 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  b);.  if( rc ){.
24d90 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
24da0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
24db0 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  *)sqlite3ErrStr(
24dc0 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
24dd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
24de0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 54  _ERROR;.  }..  T
24df0 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
24e00 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
24e10 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
24e20 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
24e30 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 20 44  3_system_errno D
24e40 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
24e50 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 73 79 73  he low-level sys
24e60 74 65 6d 20 65 72 72 6e 6f 20 76 61 6c 75 65 2e  tem errno value.
24e70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
24e80 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
24e90 74 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 0a  t_system_errno(.
24ea0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
24eb0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
24ec0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
24ed0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
24ee0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
24ef0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
24f00 0a 20 20 69 6e 74 20 69 45 72 72 6e 6f 3b 0a 20  .  int iErrno;. 
24f10 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
24f20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
24f30 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
24f40 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
24f50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24f60 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
24f70 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
24f80 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
24f90 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
24fa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24fb0 52 3b 0a 20 20 69 45 72 72 6e 6f 20 3d 20 73 71  R;.  iErrno = sq
24fc0 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72  lite3_system_err
24fd0 6e 6f 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  no(db);.  Tcl_Se
24fe0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
24ff0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
25000 28 69 45 72 72 6e 6f 29 29 3b 0a 20 20 72 65 74  (iErrno));.  ret
25010 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
25020 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
25030 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
25040 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a   DB DBNAME.**.**
25050 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
25060 20 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63   of a file assoc
25070 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
25080 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
25090 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
250a0 50 49 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e  PI test_db_filen
250b0 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ame(.  void * cl
250c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
250d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
250e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
250f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
25100 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
25110 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
25120 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69  ar *zDbName;.  i
25130 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
25140 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
25150 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
25160 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29  jv, "DB DBNAME")
25170 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
25180 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
25190 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
251a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
251b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
251c0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
251d0 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d  _ERROR;.  zDbNam
251e0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
251f0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63  g(objv[2]);.  Tc
25200 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
25210 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 64  nterp, sqlite3_d
25220 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c 20 7a  b_filename(db, z
25230 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64 2a 29  DbName), (void*)
25240 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
25250 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
25260 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62  age:  sqlite3_db
25270 5f 72 65 61 64 6f 6e 6c 79 20 44 42 20 44 42 4e  _readonly DB DBN
25280 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  AME.**.** Return
25290 20 31 20 6f 72 20 30 20 69 66 20 44 42 4e 41 4d   1 or 0 if DBNAM
252a0 45 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 6f 72  E is readonly or
252b0 20 6e 6f 74 2e 20 20 52 65 74 75 72 6e 20 2d 31   not.  Return -1
252c0 20 69 66 20 44 42 4e 41 4d 45 20 64 6f 65 73 0a   if DBNAME does.
252d0 2a 2a 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f  ** not exist..*/
252e0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
252f0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64  TE_TCLAPI test_d
25300 62 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f  b_readonly(.  vo
25310 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
25320 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
25330 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
25340 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
25350 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
25360 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
25370 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
25380 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  me;.  if( objc!=
25390 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
253a0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
253b0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
253c0 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  BNAME");.    ret
253d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
253e0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
253f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
25400 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
25410 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
25420 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25430 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
25440 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
25450 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
25460 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
25470 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
25480 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
25490 64 62 2c 20 7a 44 62 4e 61 6d 65 29 29 29 3b 0a  db, zDbName)));.
254a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
254b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
254c0 20 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68    sqlite3_soft_h
254d0 65 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a  eap_limit ?N?.**
254e0 0a 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74  .** Query or set
254f0 20 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c   the soft heap l
25500 69 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72  imit for the cur
25510 72 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68  rent thread.  Th
25520 65 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e  e.** limit is on
25530 6c 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68  ly changed if th
25540 65 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20  e N is present. 
25550 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69   The previous li
25560 6d 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  mit.** is return
25570 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
25580 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
25590 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  test_soft_heap_l
255a0 69 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  imit(.  void * c
255b0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
255c0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
255d0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
255e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
255f0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
25600 33 5f 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54  3_int64 amt;.  T
25610 63 6c 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d  cl_WideInt N = -
25620 31 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  1;.  if( objc!=1
25630 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20   && objc!=2 ){. 
25640 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
25650 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
25660 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20  bjv, "?N?");.   
25670 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
25680 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
25690 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20  c==2 ){.    if( 
256a0 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
256b0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
256c0 6a 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74  jv[1], &N) ) ret
256d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
256e0 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74   }.  amt = sqlit
256f0 65 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d  e3_soft_heap_lim
25700 69 74 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53  it64(N);.  Tcl_S
25710 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
25720 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  rp, Tcl_NewWideI
25730 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72  ntObj(amt));.  r
25740 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
25750 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
25760 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63  sqlite3_thread_c
25770 6c 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c  leanup.**.** Cal
25780 6c 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68  l the sqlite3_th
25790 72 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49  read_cleanup API
257a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
257b0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
257c0 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  st_thread_cleanu
257d0 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  p(.  void * clie
257e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
257f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
25800 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
25810 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
25820 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
25830 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
25840 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68  TED.  sqlite3_th
25850 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a  read_cleanup();.
25860 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
25870 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
25880 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
25890 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  3_pager_refcount
258a0 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75  s  DB.**.** Retu
258b0 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d  rn a list of num
258c0 62 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74  bers which are t
258d0 68 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74  he PagerRefcount
258e0 20 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65   for all.** page
258f0 72 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62  rs on each datab
25900 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
25910 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
25920 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
25930 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
25940 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
25950 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
25960 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
25970 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
25980 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
25990 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
259a0 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  b;.  int i;.  in
259b0 74 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f  t v, *a;.  Tcl_O
259c0 62 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20  bj *pResult;..  
259d0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
259e0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
259f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
25a00 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
25a10 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
25a20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
25a30 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
25a40 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
25a50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
25a60 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
25a70 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
25a80 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
25a90 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
25aa0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
25ab0 52 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d  ROR;.  pResult =
25ac0 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
25ad0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
25ae0 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  nDb; i++){.    i
25af0 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  f( db->aDb[i].pB
25b00 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  t==0 ){.      v 
25b10 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  = -1;.    }else{
25b20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
25b30 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
25b40 75 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d  utex);.      a =
25b50 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61   sqlite3PagerSta
25b60 74 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50  ts(sqlite3BtreeP
25b70 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  ager(db->aDb[i].
25b80 70 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d  pBt));.      v =
25b90 20 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c   a[0];.      sql
25ba0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
25bb0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
25bc0 20 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f   }.    Tcl_ListO
25bd0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
25be0 30 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f  0, pResult, Tcl_
25bf0 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20  NewIntObj(v));. 
25c00 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
25c10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
25c20 65 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  esult);.  return
25c30 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
25c40 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72  ** tclcmd:   wor
25c50 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a  king_64bit_int.*
25c60 2a 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75  *.** Some TCL bu
25c70 69 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e  ilds (ex: cygwin
25c80 29 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74  ) do not support
25c90 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73   64-bit integers
25ca0 2e 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73  .  This.** leads
25cb0 20 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   to a number of 
25cc0 74 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20  test failures.  
25cd0 54 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d  The present comm
25ce0 61 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a  and checks the.*
25cf0 2a 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73  * TCL build to s
25d00 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
25d10 74 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34  t it supports 64
25d20 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20  -bit integers.  
25d30 49 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52  It.** returns TR
25d40 55 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e  UE if it does an
25d50 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a  d FALSE if not..
25d60 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  **.** This comma
25d70 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61  nd is used to wa
25d80 72 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68  rn users that th
25d90 65 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73  eir TCL build is
25da0 20 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e   defective.** an
25db0 64 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72  d that the error
25dc0 73 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e  s they are seein
25dd0 67 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63  g in the test sc
25de0 72 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a  ripts might be.*
25df0 2a 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68  * a result of th
25e00 65 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43  eir defective TC
25e10 4c 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72  L rather than pr
25e20 6f 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65  oblems in SQLite
25e30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25e40 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 6f  SQLITE_TCLAPI wo
25e50 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28  rking_64bit_int(
25e60 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
25e70 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
25e80 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
25e90 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
25ea0 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
25eb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
25ec0 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
25ed0 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
25ee0 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
25ef0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25f10 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
25f20 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
25f30 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
25f40 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
25f50 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
25f60 5f 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a  _Obj *pTestObj;.
25f70 20 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20    int working = 
25f80 30 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d  0;..  pTestObj =
25f90 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
25fa0 62 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34 29  bj(1000000*(i64)
25fb0 31 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77  1234567890);.  w
25fc0 6f 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28  orking = strcmp(
25fd0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54  Tcl_GetString(pT
25fe0 65 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36  estObj), "123456
25ff0 37 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b  7890000000")==0;
26000 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
26010 75 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20  unt(pTestObj);. 
26020 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
26030 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
26040 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b  wBooleanObj(work
26050 69 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ing));.  return 
26060 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
26070 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
26080 75 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a  unlink_test.**.*
26090 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
260a0 6e 64 20 75 6e 72 65 67 69 73 74 65 72 73 20 74  nd unregisters t
260b0 68 65 20 70 72 69 6d 61 72 79 20 56 46 53 20 61  he primary VFS a
260c0 6e 64 20 74 68 65 6e 20 72 65 67 69 73 74 65 72  nd then register
260d0 73 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61  s.** it back aga
260e0 69 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  in.  This is use
260f0 64 20 74 6f 20 74 65 73 74 20 74 68 65 20 61 62  d to test the ab
26100 69 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74 65  ility to registe
26110 72 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20  r a.** VFS when 
26120 6e 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75  none are previou
26130 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c 20  sly registered, 
26140 61 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79 20  and the ability 
26150 74 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65  to .** unregiste
26160 72 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c  r the only avail
26170 61 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65  able VFS.  Ticke
26180 74 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69  t #2738.*/.stati
26190 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
261a0 41 50 49 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74  API vfs_unlink_t
261b0 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
261c0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
261d0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
261e0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
261f0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
26200 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
26210 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
26220 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
26230 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
26240 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
26250 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
26260 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26270 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
26280 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
26290 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
262a0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
262b0 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
262c0 33 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20  3_vfs *pMain;.  
262d0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56  sqlite3_vfs *apV
262e0 66 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65  fs[20];.  sqlite
262f0 33 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a  3_vfs one, two;.
26300 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
26310 6e 72 65 67 69 73 74 65 72 28 30 29 3b 20 20 20  nregister(0);   
26320 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66  /* Unregister of
26330 20 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73   NULL is harmles
26340 73 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65  s */.  one.zName
26350 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77   = "__one";.  tw
26360 6f 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f  o.zName = "__two
26370 22 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67  ";..  /* Calling
26380 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
26390 69 73 74 65 72 20 77 69 74 68 20 32 6e 64 20 61  ister with 2nd a
263a0 72 67 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65  rgument of 0 doe
263b0 73 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67  s not.  ** chang
263c0 65 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  e the default VF
263d0 53 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d  S.  */.  pMain =
263e0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
263f0 64 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  d(0);.  sqlite3_
26400 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
26410 65 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  e, 0);.  assert(
26420 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61   pMain==0 || pMa
26430 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f  in==sqlite3_vfs_
26440 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c  find(0) );.  sql
26450 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
26460 72 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73  r(&two, 0);.  as
26470 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c  sert( pMain==0 |
26480 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33  | pMain==sqlite3
26490 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a  _vfs_find(0) );.
264a0 0a 20 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e  .  /* We can fin
264b0 64 20 61 20 56 46 53 20 62 79 20 69 74 73 20 6e  d a VFS by its n
264c0 61 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ame */.  assert(
264d0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
264e0 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
264f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
26500 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
26510 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
26520 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73  ..  /* Calling s
26530 71 6c 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74  qlite_vfs_regist
26540 65 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f  er with non-zero
26550 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
26560 72 20 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20  r changes the.  
26570 2a 2a 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20  ** default VFS, 
26580 65 76 65 6e 20 69 66 20 74 68 65 20 31 73 74 20  even if the 1st 
26590 70 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20  parameter is an 
265a0 65 78 69 73 74 69 67 20 56 46 53 20 74 68 61 74  existig VFS that
265b0 20 69 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75   is.  ** previou
265c0 73 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61  sly registered a
265d0 73 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c  s the non-defaul
265e0 74 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  t..  */.  sqlite
265f0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
26600 6f 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  one, 1);.  asser
26610 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
26620 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
26630 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
26640 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
26650 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
26660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
26670 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
26680 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69  ==&one );.  sqli
26690 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
266a0 28 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73  (&two, 1);.  ass
266b0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
266c0 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d  _find("__one")==
266d0 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74  &one );.  assert
266e0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
266f0 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77  nd("__two")==&tw
26700 6f 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  o );.  assert( s
26710 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
26720 30 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66  0)==&two );.  if
26730 28 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73  ( pMain ){.    s
26740 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
26750 74 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20  ter(pMain, 1);. 
26760 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
26770 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
26780 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20  ne")==&one );.  
26790 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
267a0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77  3_vfs_find("__tw
267b0 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20  o")==&two );.   
267c0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
267d0 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
267e0 61 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20  ain );.  }.  .  
267f0 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65  /* Unlink the de
26800 66 61 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65  fault VFS.  Repe
26810 61 74 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61  at until there a
26820 72 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73  re no more VFSes
26830 0a 20 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64  .  ** registered
26840 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
26850 3b 20 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73  ; i<sizeof(apVfs
26860 29 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30  )/sizeof(apVfs[0
26870 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70  ]); i++){.    ap
26880 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Vfs[i] = sqlite3
26890 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
268a0 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29    if( apVfs[i] )
268b0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
268c0 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
268d0 33 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73  3_vfs_find(apVfs
268e0 5b 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20  [i]->zName) );. 
268f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
26900 5f 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66  _unregister(apVf
26910 73 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73  s[i]);.      ass
26920 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f  ert( 0==sqlite3_
26930 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69  vfs_find(apVfs[i
26940 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20  ]->zName) );.   
26950 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
26960 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f   0==sqlite3_vfs_
26970 66 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20  find(0) );.  .  
26980 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  /* Register the 
26990 6d 61 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d  main VFS as non-
269a0 64 65 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65  default (will be
269b0 20 6d 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73   made default, s
269c0 69 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20  ince.  ** it'll 
269d0 62 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20  be the only one 
269e0 69 6e 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20  in existence).. 
269f0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
26a00 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  s_register(pMain
26a10 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
26a20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
26a30 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20  (0)==pMain );.  
26a40 0a 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65  .  /* Un-registe
26a50 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61  r the main VFS a
26a60 67 61 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20  gain to restore 
26a70 61 6e 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73  an empty VFS lis
26a80 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  t */.  sqlite3_v
26a90 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d  fs_unregister(pM
26aa0 61 69 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ain);.  assert( 
26ab0 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  0==sqlite3_vfs_f
26ac0 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20  ind(0) );..  /* 
26ad0 52 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73  Relink all VFSes
26ae0 20 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65   in reverse orde
26af0 72 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d  r. */  .  for(i=
26b00 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69  sizeof(apVfs)/si
26b10 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31  zeof(apVfs[0])-1
26b20 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20  ; i>=0; i--){.  
26b30 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29    if( apVfs[i] )
26b40 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
26b50 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56  vfs_register(apV
26b60 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20  fs[i], 1);.     
26b70 20 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69   assert( apVfs[i
26b80 5d 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  ]==sqlite3_vfs_f
26b90 69 6e 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20  ind(0) );.      
26ba0 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d  assert( apVfs[i]
26bb0 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
26bc0 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61  nd(apVfs[i]->zNa
26bd0 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  me) );.    }.  }
26be0 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65  ..  /* Unregiste
26bf0 72 20 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53  r out sample VFS
26c00 65 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  es. */.  sqlite3
26c10 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
26c20 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  &one);.  sqlite3
26c30 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
26c40 26 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72  &two);..  /* Unr
26c50 65 67 69 73 74 65 72 69 6e 67 20 61 20 56 46 53  egistering a VFS
26c60 20 74 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72   that is not cur
26c70 72 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65  rently registere
26c80 64 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f  d is harmless */
26c90 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
26ca0 6e 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b  nregister(&one);
26cb0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75  .  sqlite3_vfs_u
26cc0 6e 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b  nregister(&two);
26cd0 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
26ce0 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f  e3_vfs_find("__o
26cf0 6e 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73  ne")==0 );.  ass
26d00 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
26d10 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
26d20 30 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68  0 );..  /* We sh
26d30 6f 75 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74  ould be left wit
26d40 68 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  h the original d
26d50 65 66 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20  efault VFS back 
26d60 61 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67  as the.  ** orig
26d70 69 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74  inal */.  assert
26d80 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
26d90 6e 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a  nd(0)==pMain );.
26da0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
26db0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
26dc0 64 3a 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69  d:   vfs_initfai
26dd0 6c 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69  l_test.**.** Thi
26de0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74  s TCL command at
26df0 74 65 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69  tempts to vfs_fi
26e00 6e 64 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73  nd and vfs_regis
26e10 74 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20  ter when the.** 
26e20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
26e30 7a 65 28 29 20 69 6e 74 65 72 66 61 63 65 20 69  ze() interface i
26e40 73 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20  s failing.  All 
26e50 63 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69  calls should fai
26e60 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
26e70 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76   SQLITE_TCLAPI v
26e80 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
26e90 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
26ea0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
26eb0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
26ec0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
26ed0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
26ee0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
26ef0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
26f00 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
26f10 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
26f20 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
26f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
26f40 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
26f50 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
26f60 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
26f70 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
26f80 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
26f90 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20  lite3_vfs one;. 
26fa0 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f   one.zName = "__
26fb0 6f 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c  one";..  if( sql
26fc0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
26fd0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
26fe0 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ROR;.  sqlite3_v
26ff0 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65  fs_register(&one
27000 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 0);.  if( sqli
27010 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
27020 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
27030 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  OR;.  sqlite3_vf
27040 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
27050 20 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   1);.  if( sqlit
27060 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
27070 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27080 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
27090 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  OK;.}../*.** Sav
270a0 65 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74  ed VFSes.*/.stat
270b0 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ic sqlite3_vfs *
270c0 61 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69  apVfs[20];.stati
270d0 63 20 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a  c int nVfs = 0;.
270e0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
270f0 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
27100 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69  all.**.** Unregi
27110 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a  ster all VFSes..
27120 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
27130 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f  LITE_TCLAPI vfs_
27140 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a  unregister_all(.
27150 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
27160 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
27170 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
27180 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
27190 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
271a0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
271b0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
271c0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
271d0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
271e0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
271f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
27200 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
27210 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
27220 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
27230 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
27240 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
27250 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
27260 41 72 72 61 79 53 69 7a 65 28 61 70 56 66 73 29  ArraySize(apVfs)
27270 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66  ; i++){.    apVf
27280 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  s[i] = sqlite3_v
27290 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20  fs_find(0);.    
272a0 69 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20  if( apVfs[i]==0 
272b0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
272c0 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73  ite3_vfs_unregis
272d0 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20  ter(apVfs[i]);. 
272e0 20 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20   }.  nVfs = i;. 
272f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
27300 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  }./*.** tclcmd: 
27310 20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72    vfs_reregister
27320 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f  _all.**.** Resto
27330 72 65 20 61 6c 6c 20 56 46 53 65 73 20 74 68 61  re all VFSes tha
27340 74 20 77 65 72 65 20 72 65 6d 6f 76 65 64 20 75  t were removed u
27350 73 69 6e 67 20 76 66 73 5f 75 6e 72 65 67 69 73  sing vfs_unregis
27360 74 65 72 5f 61 6c 6c 2e 20 54 61 6b 69 6e 67 0a  ter_all. Taking.
27370 2a 2a 20 63 61 72 65 20 74 6f 20 70 75 74 20 74  ** care to put t
27380 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 62  he linked list b
27390 61 63 6b 20 74 6f 67 65 74 68 65 72 20 69 6e 20  ack together in 
273a0 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61  the same order a
273b0 73 20 69 74 20 77 61 73 0a 2a 2a 20 69 6e 20 62  s it was.** in b
273c0 65 66 6f 72 65 20 76 66 73 5f 75 6e 72 65 67 69  efore vfs_unregi
273d0 73 74 65 72 5f 61 6c 6c 20 77 61 73 20 69 6e 76  ster_all was inv
273e0 6f 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oked..*/.static 
273f0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
27400 49 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72  I vfs_reregister
27410 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61  _all(.  ClientDa
27420 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
27430 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
27440 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
27450 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
27460 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
27470 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
27480 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
27490 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
274a0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
274b0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
274c0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
274d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
274e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
274f0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27500 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27510 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
27520 3d 6e 56 66 73 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nVfs-1; i>=0; i
27530 2d 2d 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  --){.    sqlite3
27540 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70  _vfs_register(ap
27550 56 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a  Vfs[i], 1);.  }.
27560 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
27570 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  .}.../*.** tclcm
27580 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
27590 6c 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20  l_test DB.**.** 
275a0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
275b0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
275c0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
275d0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
275e0 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
275f0 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
27600 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e same..*/.stati
27610 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
27620 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  API file_control
27630 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
27640 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
27650 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
27660 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
27670 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
27680 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
27690 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
276a0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
276b0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
276c0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
276d0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
276e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
276f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
27700 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
27710 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
27720 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
27730 0a 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b  .  int iArg = 0;
27740 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
27750 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
27760 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
27770 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
27780 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
27790 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
277a0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
277b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
277c0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
277d0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
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 20  bjv[1]), &db) ) 
27830 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27840 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
27850 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
27860 2c 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a  , 0, 0, &iArg);.
27870 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
27880 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b  LITE_NOTFOUND );
27890 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
278a0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
278b0 20 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c   "notadatabase",
278c0 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f   SQLITE_FCNTL_LO
278d0 43 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b  CKSTATE, &iArg);
278e0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
278f0 51 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20  QLITE_ERROR );. 
27900 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
27910 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22  le_control(db, "
27920 6d 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67  main", -1, &iArg
27930 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d  );.  assert( rc=
27940 3d 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  =SQLITE_NOTFOUND
27950 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
27960 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
27970 64 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20  db, "temp", -1, 
27980 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
27990 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
279a0 46 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c  FOUND || rc==SQL
279b0 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20  ITE_ERROR );..  
279c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
279d0 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
279e0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
279f0 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20 44  lasterrno_test D
27a00 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c  B.**.** This TCL
27a10 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68   command runs th
27a20 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  e sqlite3_file_c
27a30 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65  ontrol interface
27a40 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73   and.** verifies
27a50 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69   correct operati
27a60 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45  on of the SQLITE
27a70 5f 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72 62  _LAST_ERRNO verb
27a80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
27a90 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69  SQLITE_TCLAPI fi
27aa0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65  le_control_laste
27ab0 72 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69  rrno_test(.  Cli
27ac0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
27ad0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
27ae0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
27af0 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
27b00 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
27b10 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
27b20 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
27b30 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
27b40 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
27b50 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
27b60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27b70 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
27b80 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
27b90 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
27ba0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
27bb0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20  /.){.  int iArg 
27bc0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
27bd0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
27be0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
27bf0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
27c00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
27c10 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
27c20 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
27c30 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
27c40 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
27c50 20 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a   0), " DB", 0);.
27c60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27c70 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
27c80 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
27c90 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
27ca0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
27cb0 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
27cc0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
27cd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
27ce0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
27cf0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54  ULL, SQLITE_LAST
27d00 5f 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a  _ERRNO, &iArg);.
27d10 20 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20    if( rc ){ .   
27d20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
27d30 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
27d40 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20  wIntObj(rc)); . 
27d50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27d60 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20  ROR; .  }.  if( 
27d70 69 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20  iArg!=0 ) {.    
27d80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
27d90 28 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65  (interp, "Unexpe
27da0 63 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72  cted non-zero er
27db0 72 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  rno: ",.        
27dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
27dd0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
27de0 6a 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  j(Tcl_NewIntObj(
27df0 69 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20  iArg), 0), " ", 
27e00 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
27e10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
27e20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
27e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
27e40 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
27e50 5f 64 61 74 61 5f 76 65 72 73 69 6f 6e 20 44 42  _data_version DB
27e60 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 68   DBNAME.**.** Th
27e70 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
27e80 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
27e90 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 77 69 74  file_control wit
27ea0 68 20 74 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f  h the.** SQLITE_
27eb0 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45 52 53 49  FCNTL_DATA_VERSI
27ec0 4f 4e 20 6f 70 63 6f 64 65 2c 20 72 65 74 75 72  ON opcode, retur
27ed0 6e 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 2e  ning the result.
27ee0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
27ef0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c  QLITE_TCLAPI fil
27f00 65 5f 63 6f 6e 74 72 6f 6c 5f 64 61 74 61 5f 76  e_control_data_v
27f10 65 72 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ersion(.  Client
27f20 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
27f30 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
27f40 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
27f50 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
27f60 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
27f70 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
27f80 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
27f90 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
27fa0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
27fb0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
27fc0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
27fd0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
27fe0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
27ff0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
28000 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
28010 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  {.  unsigned int
28020 20 69 56 65 72 73 3b 20 20 20 20 20 20 20 20 20   iVers;         
28030 20 20 20 20 2f 2a 20 64 61 74 61 20 76 65 72 73      /* data vers
28040 69 6f 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ion */.  char *z
28050 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
28060 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e           /* Db n
28070 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65  ame ("main", "te
28080 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73  mp" etc.) */.  s
28090 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
280a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
280b0 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
280c0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  e */.  int rc;  
280d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
280e0 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63         /* file_c
280f0 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20  ontrol() return 
28100 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 7a  code */.  char z
28110 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
28120 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63   objc!=3 && objc
28130 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
28140 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
28150 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
28160 20 5b 44 42 4e 41 4d 45 5d 22 29 3b 0a 20 20 20   [DBNAME]");.   
28170 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28180 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
28190 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
281a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
281b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
281c0 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
281d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
281e0 20 3d 20 6f 62 6a 63 3d 3d 33 20 3f 20 54 63 6c   = objc==3 ? Tcl
281f0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
28200 32 5d 29 20 3a 20 4e 55 4c 4c 3b 0a 0a 20 20 72  2]) : NULL;..  r
28210 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
28220 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
28230 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44  , SQLITE_FCNTL_D
28240 41 54 41 5f 56 45 52 53 49 4f 4e 2c 20 28 76 6f  ATA_VERSION, (vo
28250 69 64 20 2a 29 26 69 56 65 72 73 29 3b 0a 20 20  id *)&iVers);.  
28260 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63  if( rc ){.    Tc
28270 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
28280 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69  rp, (char *)sqli
28290 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
282a0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  TCL_STATIC);.   
282b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
282c0 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
282d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
282e0 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42  (sizeof(zBuf),zB
282f0 75 66 2c 22 25 75 22 2c 69 56 65 72 73 29 3b 0a  uf,"%u",iVers);.
28300 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
28310 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
28320 2a 29 7a 42 75 66 2c 20 54 43 4c 5f 56 4f 4c 41  *)zBuf, TCL_VOLA
28330 54 49 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72  TILE);.    retur
28340 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a  n TCL_OK;.  }.}.
28350 0a 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f  .#ifdef __APPLE_
28360 5f 0a 2f 2a 20 46 72 6f 6d 20 73 71 6c 69 74 65  _./* From sqlite
28370 33 5f 70 72 69 76 61 74 65 2e 68 20 2a 2f 0a 23  3_private.h */.#
28380 20 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 54   ifndef SQLITE_T
28390 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45  RUNCATE_DATABASE
283a0 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45  .# define SQLITE
283b0 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41  _TRUNCATE_DATABA
283c0 53 45 20 20 20 20 20 20 31 30 31 0a 23 20 64 65  SE      101.# de
283d0 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e  fine SQLITE_TRUN
283e0 43 41 54 45 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  CATE_JOURNALMODE
283f0 5f 57 41 4c 20 20 20 20 20 20 20 20 20 20 20 28  _WAL           (
28400 30 78 31 3c 3c 30 29 0a 23 20 64 65 66 69 6e 65  0x1<<0).# define
28410 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
28420 5f 41 55 54 4f 56 41 43 55 55 4d 5f 4d 41 53 4b  _AUTOVACUUM_MASK
28430 20 20 20 20 20 20 20 20 20 20 20 28 30 78 33 3c             (0x3<
28440 3c 32 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  <2).# define SQL
28450 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41 55 54  ITE_TRUNCATE_AUT
28460 4f 56 41 43 55 55 4d 5f 4f 46 46 20 20 20 20 20  OVACUUM_OFF     
28470 20 20 20 20 20 20 20 28 30 78 31 3c 3c 32 29 0a         (0x1<<2).
28480 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
28490 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43  TRUNCATE_AUTOVAC
284a0 55 55 4d 5f 46 55 4c 4c 20 20 20 20 20 20 20 20  UUM_FULL        
284b0 20 20 20 28 30 78 32 3c 3c 32 29 0a 23 20 64 65     (0x2<<2).# de
284c0 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e  fine SQLITE_TRUN
284d0 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  CATE_AUTOVACUUM_
284e0 49 4e 43 52 45 4d 45 4e 54 41 4c 20 20 20 20 28  INCREMENTAL    (
284f0 30 78 33 3c 3c 32 29 0a 23 20 64 65 66 69 6e 65  0x3<<2).# define
28500 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
28510 5f 50 41 47 45 53 49 5a 45 5f 4d 41 53 4b 20 20  _PAGESIZE_MASK  
28520 20 20 20 20 20 20 20 20 20 20 20 28 30 78 37 3c             (0x7<
28530 3c 34 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  <4).# define SQL
28540 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41 47  ITE_TRUNCATE_PAG
28550 45 53 49 5a 45 5f 31 30 32 34 20 20 20 20 20 20  ESIZE_1024      
28560 20 20 20 20 20 20 20 28 30 78 31 3c 3c 34 29 0a         (0x1<<4).
28570 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
28580 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49 5a  TRUNCATE_PAGESIZ
28590 45 5f 32 30 34 38 20 20 20 20 20 20 20 20 20 20  E_2048          
285a0 20 20 20 28 30 78 32 3c 3c 34 29 0a 23 20 64 65     (0x2<<4).# de
285b0 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e  fine SQLITE_TRUN
285c0 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 34 30  CATE_PAGESIZE_40
285d0 39 36 20 20 20 20 20 20 20 20 20 20 20 20 20 28  96             (
285e0 30 78 33 3c 3c 34 29 0a 23 20 64 65 66 69 6e 65  0x3<<4).# define
285f0 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
28600 5f 50 41 47 45 53 49 5a 45 5f 38 31 39 32 20 20  _PAGESIZE_8192  
28610 20 20 20 20 20 20 20 20 20 20 20 28 30 78 34 3c             (0x4<
28620 3c 34 29 0a 23 20 65 6e 64 69 66 0a 23 20 69 66  <4).# endif.# if
28630 6e 64 65 66 20 53 51 4c 49 54 45 5f 52 45 50 4c  ndef SQLITE_REPL
28640 41 43 45 5f 44 41 54 41 42 41 53 45 0a 23 20 64  ACE_DATABASE.# d
28650 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 52 45 50  efine SQLITE_REP
28660 4c 41 43 45 5f 44 41 54 41 42 41 53 45 20 20 20  LACE_DATABASE   
28670 20 20 20 20 31 30 32 0a 23 20 65 6e 64 69 66 0a      102.# endif.
28680 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
28690 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 72   file_control_tr
286a0 75 6e 63 61 74 65 5f 74 65 73 74 20 44 42 0a 2a  uncate_test DB.*
286b0 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
286c0 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
286d0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
286e0 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
286f0 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
28700 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
28710 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f 54 52  of the SQLITE_TR
28720 55 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 20  UNCATE_DATABASE 
28730 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  verb..*/.static 
28740 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
28750 5f 74 72 75 6e 63 61 74 65 5f 74 65 73 74 28 0a  _truncate_test(.
28760 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
28770 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
28780 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
28790 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
287a0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
287b0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
287c0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
287d0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
287e0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
287f0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
28800 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28810 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
28820 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
28830 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
28840 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
28850 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
28860 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 66  te3 *db;.  int f
28870 6c 61 67 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  lags;.  int rc;.
28880 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33    .  if( objc!=3
28890 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
288a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
288b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
288c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
288f0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
28900 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 53  , 0), " DB FLAGS
28910 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
28920 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28930 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
28940 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
28950 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
28960 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
28970 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28980 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
28990 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
289a0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
289b0 66 6c 61 67 73 29 20 29 7b 0a 20 20 20 20 72 65  flags) ){.    re
289c0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
289d0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
289e0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
289f0 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
28a00 5f 54 52 55 4e 43 41 54 45 5f 44 41 54 41 42 41  _TRUNCATE_DATABA
28a10 53 45 2c 20 26 66 6c 61 67 73 29 3b 0a 20 20 69  SE, &flags);.  i
28a20 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20 54 63  f( rc ){ .    Tc
28a30 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
28a40 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
28a50 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20  tObj(rc)); .    
28a60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28a70 3b 20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  ; .  }.  return 
28a80 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
28a90 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
28aa0 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63  e_control_replac
28ab0 65 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20  e_test DB.**.** 
28ac0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
28ad0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
28ae0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
28af0 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
28b00 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
28b10 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
28b20 65 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45  e SQLITE_REPLACE
28b30 5f 44 41 54 41 42 41 53 45 20 76 65 72 62 2e 0a  _DATABASE verb..
28b40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
28b50 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61  le_control_repla
28b60 63 65 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  ce_test(.  Clien
28b70 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
28b80 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
28b90 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
28ba0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
28bb0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28bc0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
28bd0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
28be0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
28bf0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
28c00 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
28c10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28c20 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
28c30 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
28c40 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
28c50 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
28c60 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 73 72  ){.  sqlite3 *sr
28c70 63 5f 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 20  c_db;.  sqlite3 
28c80 2a 64 73 74 5f 64 62 3b 0a 20 20 69 6e 74 20 72  *dst_db;.  int r
28c90 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63  c;.  .  if( objc
28ca0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
28cb0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
28cc0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
28cd0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
28ce0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
28cf0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
28d00 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
28d10 5b 30 5d 2c 20 30 29 2c 20 22 20 44 53 54 5f 44  [0], 0), " DST_D
28d20 42 20 53 52 43 5f 44 42 22 2c 20 30 29 3b 0a 20  B SRC_DB", 0);. 
28d30 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
28d40 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
28d50 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
28d60 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
28d70 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 73 74  g(objv[1]), &dst
28d80 5f 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  _db) ){.    retu
28d90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
28da0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
28db0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
28dc0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
28dd0 32 5d 29 2c 20 26 73 72 63 5f 64 62 29 20 29 7b  2]), &src_db) ){
28de0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28df0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
28e00 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
28e10 6f 6e 74 72 6f 6c 28 64 73 74 5f 64 62 2c 20 4e  ontrol(dst_db, N
28e20 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 52 45 50 4c  ULL, SQLITE_REPL
28e30 41 43 45 5f 44 41 54 41 42 41 53 45 2c 20 73 72  ACE_DATABASE, sr
28e40 63 5f 64 62 29 3b 0a 20 20 69 66 28 20 72 63 20  c_db);.  if( rc 
28e50 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  ){ .    Tcl_SetO
28e60 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
28e70 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
28e80 63 29 29 3b 20 0a 20 20 20 20 72 65 74 75 72 6e  c)); .    return
28e90 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d   TCL_ERROR; .  }
28ea0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
28eb0 3b 20 20 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ;  .}.#endif /* 
28ec0 5f 5f 41 50 50 4c 45 5f 5f 20 2a 2f 0a 0a 2f 2a  __APPLE__ */../*
28ed0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
28ee0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
28ef0 73 69 7a 65 5f 74 65 73 74 20 44 42 20 44 42 4e  size_test DB DBN
28f00 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54  AME SIZE.**.** T
28f10 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
28f20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
28f30 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
28f40 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
28f50 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
28f60 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
28f70 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
28f80 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a  PROXYFILE and.**
28f90 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
28fa0 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e  PROXYFILE verbs.
28fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
28fc0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c  QLITE_TCLAPI fil
28fd0 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73  e_control_chunks
28fe0 69 7a 65 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  ize_test(.  Clie
28ff0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
29000 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
29010 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
29020 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
29030 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29040 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
29050 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
29060 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
29070 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
29080 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
29090 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
290a0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
290b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
290c0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
290d0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
290e0 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b  .){.  int nSize;
290f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29100 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63 68 75        /* New chu
29110 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61  nk size */.  cha
29120 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
29130 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29140 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c  Db name ("main",
29150 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f   "temp" etc.) */
29160 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
29170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29180 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
29190 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  andle */.  int r
291a0 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
291b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
291c0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74  le_control() ret
291d0 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn code */..  i
291e0 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
291f0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
29200 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
29210 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53  jv, "DB DBNAME S
29220 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  IZE");.    retur
29230 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29240 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
29250 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
29260 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
29270 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c 20  ]), &db) .   || 
29280 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
29290 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
292a0 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a  ], &nSize).  ){.
292b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
292c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d  ROR;.  }.  zDb =
292d0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
292e0 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a  bjv[2]);.  if( z
292f0 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44  Db[0]=='\0' ) zD
29300 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20  b = NULL;..  rc 
29310 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
29320 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20  ontrol(db, zDb, 
29330 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55  SQLITE_FCNTL_CHU
29340 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f 69 64 20 2a  NK_SIZE, (void *
29350 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  )&nSize);.  if( 
29360 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  rc ){.    Tcl_Se
29370 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
29380 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45  (char *)sqlite3E
29390 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  rrName(rc), TCL_
293a0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
293b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
293c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
293d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  OK;.}../*.** tcl
293e0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
293f0 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
29400 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45  t DB DBNAME SIZE
29410 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
29420 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
29430 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
29440 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
29450 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f  .** with SQLITE_
29460 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 0a  FCNTL_SIZE_HINT.
29470 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
29480 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
29490 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e  _control_sizehin
294a0 74 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  t_test(.  Client
294b0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
294c0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
294d0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
294e0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
294f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
29500 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
29510 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
29520 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
29530 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
29540 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
29550 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29560 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
29570 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
29580 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
29590 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
295a0 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20  {.  Tcl_WideInt 
295b0 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
295c0 20 20 20 20 2f 2a 20 48 69 6e 74 65 64 20 73 69      /* Hinted si
295d0 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  ze */.  char *zD
295e0 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
295f0 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61          /* Db na
29600 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  me ("main", "tem
29610 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71  p" etc.) */.  sq
29620 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
29630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29640 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
29650 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29670 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f        /* file_co
29680 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63  ntrol() return c
29690 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ode */..  if( ob
296a0 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
296b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
296c0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
296d0 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29  DB DBNAME SIZE")
296e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
296f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
29700 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
29710 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
29720 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
29730 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47  db) .   || Tcl_G
29740 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
29750 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
29760 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20  , &nSize).  ){. 
29770 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
29780 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20  OR;.  }.  zDb = 
29790 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
297a0 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44  jv[2]);.  if( zD
297b0 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62  b[0]=='\0' ) zDb
297c0 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d   = NULL;..  rc =
297d0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
297e0 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53  ntrol(db, zDb, S
297f0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
29800 5f 48 49 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26  _HINT, (void *)&
29810 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  nSize);.  if( rc
29820 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
29830 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
29840 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
29850 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
29860 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72  ATIC);.    retur
29870 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29880 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
29890 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
298a0 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
298b0 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74  l_lockproxy_test
298c0 20 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68   DB PWD.**.** Th
298d0 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
298e0 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
298f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
29900 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65  erface and.** ve
29910 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f  rifies correct o
29920 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
29930 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
29940 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20  ROXYFILE and.** 
29950 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
29960 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e 0a  ROXYFILE verbs..
29970 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
29980 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65  LITE_TCLAPI file
29990 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f  _control_lockpro
299a0 78 79 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  xy_test(.  Clien
299b0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
299c0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
299d0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
299e0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
299f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
29a00 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
29a10 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
29a20 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
29a30 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
29a40 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
29a50 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29a60 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
29a70 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
29a80 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
29a90 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
29aa0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
29ab0 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
29ac0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
29ad0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29ae0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
29af0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
29b00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29b10 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
29b20 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
29b30 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 50 57 44  0], 0), " DB PWD
29b40 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
29b50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29b60 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
29b70 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
29b80 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
29b90 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 72  ]), &db) ){.   r
29ba0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29bb0 0a 20 20 7d 0a 20 20 0a 23 69 66 20 21 64 65 66  .  }.  .#if !def
29bc0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
29bd0 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
29be0 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65 64 28  ).#  if defined(
29bf0 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20  __APPLE__).#    
29c00 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e  define SQLITE_EN
29c10 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
29c20 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23 20 20  LE 1.#  else.#  
29c30 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
29c40 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
29c50 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69 66 0a  TYLE 0.#  endif.
29c60 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
29c70 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
29c80 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69 6e 65  _STYLE && define
29c90 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b  d(__APPLE__).  {
29ca0 0a 20 20 20 20 63 68 61 72 20 2a 74 65 73 74 50  .    char *testP
29cb0 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b  ath;.    int rc;
29cc0 0a 20 20 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20  .    int nPwd;. 
29cd0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
29ce0 50 77 64 3b 0a 20 20 20 20 63 68 61 72 20 70 72  Pwd;.    char pr
29cf0 6f 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20  oxyPath[400];.  
29d00 20 20 0a 20 20 20 20 7a 50 77 64 20 3d 20 54 63    .    zPwd = Tc
29d10 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
29d20 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50 77  bj(objv[2], &nPw
29d30 64 29 3b 0a 20 20 20 20 69 66 28 20 73 69 7a 65  d);.    if( size
29d40 6f 66 28 70 72 6f 78 79 50 61 74 68 29 3c 6e 50  of(proxyPath)<nP
29d50 77 64 2b 32 30 20 29 7b 0a 20 20 20 20 20 20 54  wd+20 ){.      T
29d60 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
29d70 69 6e 74 65 72 70 2c 20 22 50 57 44 20 74 6f 6f  interp, "PWD too
29d80 20 62 69 67 22 2c 20 28 76 6f 69 64 2a 29 30 29   big", (void*)0)
29d90 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
29da0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
29db0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
29dc0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 72 6f 78  intf(sizeof(prox
29dd0 79 50 61 74 68 29 2c 20 70 72 6f 78 79 50 61 74  yPath), proxyPat
29de0 68 2c 20 22 25 73 2f 74 65 73 74 2e 70 72 6f 78  h, "%s/test.prox
29df0 79 22 2c 20 7a 50 77 64 29 3b 0a 20 20 20 20 72  y", zPwd);.    r
29e00 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
29e10 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
29e20 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f  L, SQLITE_SET_LO
29e30 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f  CKPROXYFILE, pro
29e40 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28  xyPath);.    if(
29e50 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
29e60 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
29e70 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
29e80 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 20  Obj(rc)); .     
29e90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29ea0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  R;.    }.    rc 
29eb0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
29ec0 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c  ontrol(db, NULL,
29ed0 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
29ee0 50 52 4f 58 59 46 49 4c 45 2c 20 26 74 65 73 74  PROXYFILE, &test
29ef0 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 73  Path);.    if( s
29f00 74 72 6e 63 6d 70 28 70 72 6f 78 79 50 61 74 68  trncmp(proxyPath
29f10 2c 74 65 73 74 50 61 74 68 2c 31 31 29 20 29 7b  ,testPath,11) ){
29f20 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
29f30 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
29f40 22 4c 6f 63 6b 20 70 72 6f 78 79 20 66 69 6c 65  "Lock proxy file
29f50 20 64 69 64 20 6e 6f 74 20 6d 61 74 63 68 20 74   did not match t
29f60 68 65 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  he ".           
29f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f80 20 20 20 20 22 70 72 65 76 69 6f 75 73 6c 79 20      "previously 
29f90 61 73 73 69 67 6e 65 64 20 76 61 6c 75 65 22 2c  assigned value",
29fa0 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72   0);.      retur
29fb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
29fc0 20 7d 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b   }.    if( rc ){
29fd0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
29fe0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
29ff0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
2a000 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ));.      return
2a010 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2a020 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
2a030 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
2a040 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
2a050 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49  _SET_LOCKPROXYFI
2a060 4c 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a  LE, proxyPath);.
2a070 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2a080 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2a090 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
2a0a0 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
2a0b0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
2a0c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
2a0d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
2a0e0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
2a0f0 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
2a100 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 70  .#include <sys/p
2a110 61 72 61 6d 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  aram.h>.#include
2a120 20 3c 73 79 73 2f 6d 6f 75 6e 74 2e 68 3e 0a 23   <sys/mount.h>.#
2a130 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 65 72 72  include <sys/err
2a140 6e 6f 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no.h>.#endif../*
2a150 0a 20 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 70  . ** tclcmd:   p
2a160 61 74 68 5f 69 73 5f 6c 6f 63 61 6c 20 50 57 44  ath_is_local PWD
2a170 0a 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  . */.static int 
2a180 70 61 74 68 5f 69 73 5f 6c 6f 63 61 6c 28 0a 20  path_is_local(. 
2a190 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
2a1a0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
2a1b0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
2a1c0 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
2a1d0 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
2a1e0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2a1f0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2a200 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2a210 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2a220 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
2a230 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a240 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2a250 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
2a260 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
2a270 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
2a280 74 73 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20  ts */.){.#ifdef 
2a290 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 63 6f 6e 73  __APPLE__.  cons
2a2a0 74 20 63 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20  t char *zPath;. 
2a2b0 20 69 6e 74 20 6e 50 61 74 68 3b 0a 20 20 73 74   int nPath;.  st
2a2c0 72 75 63 74 20 73 74 61 74 66 73 20 66 73 49 6e  ruct statfs fsIn
2a2d0 66 6f 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a  fo;.  .  if( obj
2a2e0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2a2f0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2a300 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
2a310 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
2a320 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2a330 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
2a340 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
2a350 76 5b 30 5d 2c 20 30 29 2c 20 22 20 50 41 54 48  v[0], 0), " PATH
2a360 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2a370 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a380 0a 20 20 7a 50 61 74 68 20 3d 20 54 63 6c 5f 47  .  zPath = Tcl_G
2a390 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
2a3a0 6f 62 6a 76 5b 31 5d 2c 20 26 6e 50 61 74 68 29  objv[1], &nPath)
2a3b0 3b 0a 20 20 69 66 28 20 73 74 61 74 66 73 28 7a  ;.  if( statfs(z
2a3c0 50 61 74 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d  Path, &fsInfo) =
2a3d0 3d 20 2d 31 20 29 7b 0a 20 20 20 20 69 6e 74 20  = -1 ){.    int 
2a3e0 65 72 72 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20  err = errno;.   
2a3f0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2a400 74 28 69 6e 74 65 72 70 2c 20 22 45 72 72 6f 72  t(interp, "Error
2a410 20 63 61 6c 6c 69 6e 67 20 73 74 61 74 66 73 20   calling statfs 
2a420 6f 6e 20 70 61 74 68 22 2c 0a 20 20 20 20 20 20  on path",.      
2a430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
2a440 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 65 72 72  cl_NewIntObj(err
2a450 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
2a460 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a470 0a 20 20 69 66 28 20 66 73 49 6e 66 6f 2e 66 5f  .  if( fsInfo.f_
2a480 66 6c 61 67 73 26 4d 4e 54 5f 4c 4f 43 41 4c 20  flags&MNT_LOCAL 
2a490 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  ){.    Tcl_SetOb
2a4a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2a4b0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 31 29  Tcl_NewIntObj(1)
2a4c0 29 3b 20 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ); .  } else {. 
2a4d0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2a4e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2a4f0 4e 65 77 49 6e 74 4f 62 6a 28 30 29 29 3b 20 0a  NewIntObj(0)); .
2a500 20 20 7d 0a 23 65 6c 73 65 0a 20 20 54 63 6c 5f    }.#else.  Tcl_
2a510 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2a520 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
2a530 62 6a 28 31 29 29 3b 20 0a 23 65 6e 64 69 66 0a  bj(1)); .#endif.
2a540 20 20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f    .  return TCL_
2a550 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20  OK;  .}../*. ** 
2a560 74 63 6c 63 6d 64 3a 20 20 20 70 61 74 68 5f 69  tclcmd:   path_i
2a570 73 5f 64 6f 73 20 50 57 44 0a 20 2a 2f 0a 73 74  s_dos PWD. */.st
2a580 61 74 69 63 20 69 6e 74 20 70 61 74 68 5f 69 73  atic int path_is
2a590 5f 64 6f 73 28 0a 20 20 43 6c 69 65 6e 74 44 61  _dos(.  ClientDa
2a5a0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2a5b0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2a5c0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
2a5d0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
2a5e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2a5f0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2a600 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2a610 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2a620 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2a630 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2a640 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2a650 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2a660 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2a670 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2a680 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2a690 23 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f  #ifdef __APPLE__
2a6a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2a6b0 50 61 74 68 3b 0a 20 20 69 6e 74 20 6e 50 61 74  Path;.  int nPat
2a6c0 68 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74  h;.  struct stat
2a6d0 66 73 20 66 73 49 6e 66 6f 3b 0a 20 20 0a 20 20  fs fsInfo;.  .  
2a6e0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
2a6f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2a700 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
2a710 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
2a720 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
2a730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
2a740 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
2a750 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
2a760 20 22 20 50 41 54 48 22 2c 20 30 29 3b 0a 20 20   " PATH", 0);.  
2a770 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a780 4f 52 3b 0a 20 20 7d 0a 20 20 7a 50 61 74 68 20  OR;.  }.  zPath 
2a790 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46  = Tcl_GetStringF
2a7a0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20  romObj(objv[1], 
2a7b0 26 6e 50 61 74 68 29 3b 0a 20 20 69 66 28 20 73  &nPath);.  if( s
2a7c0 74 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73  tatfs(zPath, &fs
2a7d0 49 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20  Info) == -1 ){. 
2a7e0 20 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72     int err = err
2a7f0 6e 6f 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  no;.    Tcl_Appe
2a800 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2a810 20 22 45 72 72 6f 72 20 63 61 6c 6c 69 6e 67 20   "Error calling 
2a820 73 74 61 74 66 73 20 6f 6e 20 70 61 74 68 22 2c  statfs on path",
2a830 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2a840 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74        Tcl_NewInt
2a850 4f 62 6a 28 65 72 72 29 2c 20 30 29 3b 0a 20 20  Obj(err), 0);.  
2a860 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a870 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 20 28 30 20  OR;.  }.  if (0 
2a880 3d 3d 20 73 74 72 6e 63 6d 70 28 22 6d 73 64 6f  == strncmp("msdo
2a890 73 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74  s", fsInfo.f_fst
2a8a0 79 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20  ypename, 5)) {. 
2a8b0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2a8c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2a8d0 4e 65 77 49 6e 74 4f 62 6a 28 31 29 29 3b 20 0a  NewIntObj(1)); .
2a8e0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 30 20 3d    } else if (0 =
2a8f0 3d 20 73 74 72 6e 63 6d 70 28 22 65 78 66 61 74  = strncmp("exfat
2a900 22 2c 20 66 73 49 6e 66 6f 2e 66 5f 66 73 74 79  ", fsInfo.f_fsty
2a910 70 65 6e 61 6d 65 2c 20 35 29 29 20 7b 0a 20 20  pename, 5)) {.  
2a920 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2a930 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2a940 65 77 49 6e 74 4f 62 6a 28 31 29 29 3b 20 0a 20  ewIntObj(1)); . 
2a950 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 54 63   } else {.    Tc
2a960 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2a970 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
2a980 74 4f 62 6a 28 30 29 29 3b 20 0a 20 20 7d 0a 23  tObj(0)); .  }.#
2a990 65 6c 73 65 0a 20 20 54 63 6c 5f 53 65 74 4f 62  else.  Tcl_SetOb
2a9a0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2a9b0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 30 29  Tcl_NewIntObj(0)
2a9c0 29 3b 20 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20  ); .#endif.  .  
2a9d0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
2a9e0 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .}..#if SQLITE_O
2a9f0 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  S_WIN./*.** tclc
2aa00 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
2aa10 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72  ol_win32_av_retr
2aa20 79 20 44 42 20 20 4e 52 45 54 52 59 20 20 44 45  y DB  NRETRY  DE
2aa30 4c 41 59 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  LAY.**.** This T
2aa40 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20  CL command runs 
2aa50 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  the sqlite3_file
2aa60 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61  _control interfa
2aa70 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 53  ce with.** the S
2aa80 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
2aa90 32 5f 41 56 5f 52 45 54 52 59 20 6f 70 63 6f 64  2_AV_RETRY opcod
2aaa0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2aab0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66   SQLITE_TCLAPI f
2aac0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
2aad0 32 5f 61 76 5f 72 65 74 72 79 28 0a 20 20 43 6c  2_av_retry(.  Cl
2aae0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2aaf0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
2ab00 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
2ab10 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
2ab20 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
2ab30 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2ab40 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2ab50 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2ab60 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2ab70 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
2ab80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ab90 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2aba0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
2abb0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
2abc0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2abd0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2abe0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
2abf0 20 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68 61   int a[2];.  cha
2ac00 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  r z[100];..  if(
2ac10 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
2ac20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2ac30 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2ac40 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2ac50 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
2ac60 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
2ac70 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
2ac80 20 22 20 44 42 20 4e 52 45 54 52 59 20 44 45 4c   " DB NRETRY DEL
2ac90 41 59 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  AY", 0);.    ret
2aca0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2acb0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2acc0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2acd0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2ace0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
2acf0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2ad00 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
2ad10 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2ad20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
2ad30 20 26 61 5b 30 5d 29 20 29 20 72 65 74 75 72 6e   &a[0]) ) return
2ad40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
2ad50 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2ad60 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2ad70 5b 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72 65  [3], &a[1]) ) re
2ad80 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2ad90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
2ada0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
2adb0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e  NULL, SQLITE_FCN
2adc0 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52  TL_WIN32_AV_RETR
2add0 59 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20 20  Y, (void*)a);.  
2ade0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2adf0 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
2ae00 25 64 20 25 64 20 25 64 22 2c 20 72 63 2c 20 61  %d %d %d", rc, a
2ae10 5b 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54 63  [0], a[1]);.  Tc
2ae20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2ae30 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a  nterp, z, (char*
2ae40 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
2ae50 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
2ae60 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
2ae70 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 67 65  control_win32_ge
2ae80 74 5f 68 61 6e 64 6c 65 20 44 42 0a 2a 2a 0a 2a  t_handle DB.**.*
2ae90 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
2aea0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
2aeb0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
2aec0 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a   interface with.
2aed0 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  ** the SQLITE_FC
2aee0 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48 41  NTL_WIN32_GET_HA
2aef0 4e 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  NDLE opcode..*/.
2af00 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
2af10 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 67 65  control_win32_ge
2af20 74 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65  t_handle(.  Clie
2af30 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2af40 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
2af50 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
2af60 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
2af70 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2af80 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2af90 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2afa0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2afb0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2afc0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2afd0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2afe0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2aff0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2b000 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2b010 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2b020 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2b030 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 48  b;.  int rc;.  H
2b040 41 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55  ANDLE hFile = NU
2b050 4c 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30  LL;.  char z[100
2b060 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
2b070 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
2b080 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2b090 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2b0a0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
2b0b0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
2b0c0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
2b0d0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c  v[0], 0), " DB",
2b0e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2b0f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2b100 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2b110 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2b120 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2b130 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
2b140 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2b150 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
2b160 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
2b170 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
2b180 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54  _FCNTL_WIN32_GET
2b190 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20 20 20  _HANDLE,.       
2b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b1b0 20 20 20 20 20 28 76 6f 69 64 2a 29 26 68 46 69       (void*)&hFi
2b1c0 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  le);.  sqlite3_s
2b1d0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2b1e0 29 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c 20 72  ), z, "%d %p", r
2b1f0 63 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c 65 29  c, (void*)hFile)
2b200 3b 0a 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 7a 2c 20  sult(interp, z, 
2b220 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
2b230 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2b240 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
2b250 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
2b260 32 5f 73 65 74 5f 68 61 6e 64 6c 65 20 44 42 20  2_set_handle DB 
2b270 48 41 4e 44 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69  HANDLE.**.** Thi
2b280 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
2b290 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
2b2a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
2b2b0 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68  rface with.** th
2b2c0 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57  e SQLITE_FCNTL_W
2b2d0 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45 20  IN32_SET_HANDLE 
2b2e0 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  opcode..*/.stati
2b2f0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2b300 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  API file_control
2b310 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c  _win32_set_handl
2b320 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
2b330 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
2b340 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
2b350 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
2b360 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
2b370 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2b380 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2b390 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2b3a0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2b3b0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2b3c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2b3d0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2b3e0 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2b3f0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2b400 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2b410 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
2b420 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2b430 74 20 72 63 3b 0a 20 20 48 41 4e 44 4c 45 20 68  t rc;.  HANDLE h
2b440 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20 63  File = NULL;.  c
2b450 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69  har z[100];..  i
2b460 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
2b470 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2b480 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
2b490 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
2b4a0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
2b4b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
2b4c0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
2b4d0 29 2c 20 22 20 44 42 20 48 41 4e 44 4c 45 22 2c  ), " DB HANDLE",
2b4e0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2b4f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2b500 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2b510 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
2b520 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2b530 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65  , &db) ){.    re
2b540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2b550 20 20 7d 0a 20 20 69 66 28 20 67 65 74 57 69 6e    }.  if( getWin
2b560 33 32 48 61 6e 64 6c 65 28 69 6e 74 65 72 70 2c  32Handle(interp,
2b570 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2b580 62 6a 76 5b 32 5d 29 2c 20 26 68 46 69 6c 65 29  bjv[2]), &hFile)
2b590 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
2b5a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2b5b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
2b5c0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
2b5d0 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  LL, SQLITE_FCNTL
2b5e0 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c  _WIN32_SET_HANDL
2b5f0 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  E,.             
2b600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2b610 76 6f 69 64 2a 29 26 68 46 69 6c 65 29 3b 0a 20  void*)&hFile);. 
2b620 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2b630 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
2b640 22 25 64 20 25 70 22 2c 20 72 63 2c 20 28 76 6f  "%d %p", rc, (vo
2b650 69 64 2a 29 68 46 69 6c 65 29 3b 0a 20 20 54 63  id*)hFile);.  Tc
2b660 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2b670 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a  nterp, z, (char*
2b680 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
2b690 4c 5f 4f 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69 66  L_OK;  .}.#endif
2b6a0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
2b6b0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70    file_control_p
2b6c0 65 72 73 69 73 74 5f 77 61 6c 20 44 42 20 50 45  ersist_wal DB PE
2b6d0 52 53 49 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a  RSIST-FLAG.**.**
2b6e0 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
2b6f0 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
2b700 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
2b710 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a  interface with.*
2b720 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  * the SQLITE_FCN
2b730 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 6f  TL_PERSIST_WAL o
2b740 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pcode..*/.static
2b750 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2b760 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  PI file_control_
2b770 70 65 72 73 69 73 74 5f 77 61 6c 28 0a 20 20 43  persist_wal(.  C
2b780 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2b790 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
2b7a0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
2b7b0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
2b7c0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2b7d0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2b7e0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2b7f0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2b800 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2b810 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2b820 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2b830 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2b840 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2b850 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2b860 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2b870 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
2b880 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
2b890 20 20 69 6e 74 20 62 50 65 72 73 69 73 74 3b 0a    int bPersist;.
2b8a0 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a    char z[100];..
2b8b0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
2b8c0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2b8d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2b8e0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2b8f0 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
2b900 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
2b910 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
2b920 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47 22  , 0), " DB FLAG"
2b930 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
2b940 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2b950 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
2b960 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
2b970 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
2b980 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
2b990 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2b9a0 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
2b9b0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
2b9c0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62  erp, objv[2], &b
2b9d0 50 65 72 73 69 73 74 29 20 29 20 72 65 74 75 72  Persist) ) retur
2b9e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
2b9f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
2ba00 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c  _control(db, NUL
2ba10 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  L, SQLITE_FCNTL_
2ba20 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 76 6f  PERSIST_WAL, (vo
2ba30 69 64 2a 29 26 62 50 65 72 73 69 73 74 29 3b 0a  id*)&bPersist);.
2ba40 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2ba50 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
2ba60 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62 50   "%d %d", rc, bP
2ba70 65 72 73 69 73 74 29 3b 0a 20 20 54 63 6c 5f 41  ersist);.  Tcl_A
2ba80 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2ba90 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30 29  rp, z, (char*)0)
2baa0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2bab0 4b 3b 20 20 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c  K;  .}./*.** tcl
2bac0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
2bad0 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76  rol_powersafe_ov
2bae0 65 72 77 72 69 74 65 20 44 42 20 50 53 4f 57 2d  erwrite DB PSOW-
2baf0 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  FLAG.**.** This 
2bb00 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
2bb10 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
2bb20 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
2bb30 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ace with.** the 
2bb40 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57  SQLITE_FCNTL_POW
2bb50 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45  ERSAFE_OVERWRITE
2bb60 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
2bb70 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2bb80 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  LAPI file_contro
2bb90 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72  l_powersafe_over
2bba0 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  write(.  ClientD
2bbb0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2bbc0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
2bbd0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
2bbe0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
2bbf0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2bc00 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2bc10 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2bc20 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2bc30 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2bc40 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2bc50 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2bc60 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2bc70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2bc80 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2bc90 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2bca0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2bcb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2bcc0 62 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  b;.  char z[100]
2bcd0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
2bce0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2bcf0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2bd00 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2bd10 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
2bd20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
2bd30 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
2bd40 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c  [0], 0), " DB FL
2bd50 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  AG", 0);.    ret
2bd60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2bd70 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2bd80 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2bd90 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2bda0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
2bdb0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2bdc0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
2bdd0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2bde0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
2bdf0 20 26 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   &b) ) return TC
2be00 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
2be10 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
2be20 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53 51 4c  trol(db,NULL,SQL
2be30 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45 52 53  ITE_FCNTL_POWERS
2be40 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c 28 76  AFE_OVERWRITE,(v
2be50 6f 69 64 2a 29 26 62 29 3b 0a 20 20 73 71 6c 69  oid*)&b);.  sqli
2be60 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2be70 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25  eof(z), z, "%d %
2be80 64 22 2c 20 72 63 2c 20 62 29 3b 0a 20 20 54 63  d", rc, b);.  Tc
2be90 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2bea0 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a  nterp, z, (char*
2beb0 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
2bec0 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a  L_OK;  .}.../*.*
2bed0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
2bee0 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65  _control_vfsname
2bef0 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a   DB ?AUXDB?.**.*
2bf00 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
2bf10 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
2bf20 20 74 68 65 20 73 74 61 63 6b 20 6f 66 20 56 46   the stack of VF
2bf30 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Ses..*/.static i
2bf40 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2bf50 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66   file_control_vf
2bf60 73 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44  sname(.  ClientD
2bf70 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2bf80 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
2bf90 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
2bfa0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
2bfb0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2bfc0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2bfd0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2bfe0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2bff0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2c000 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2c010 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2c020 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2c030 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2c040 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2c050 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2c060 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2c070 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c080 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a  bName = "main";.
2c090 20 20 63 68 61 72 20 2a 7a 56 66 73 4e 61 6d 65    char *zVfsName
2c0a0 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
2c0b0 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20  c!=2 && objc!=3 
2c0c0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2c0d0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2c0e0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2c0f0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
2c100 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
2c110 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
2c120 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55  0], 0), " DB ?AU
2c130 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72  XDB?", 0);.    r
2c140 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2c150 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2c160 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2c170 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2c180 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
2c190 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2c1a0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2c1b0 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a  objc==3 ){.    z
2c1c0 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  DbName = Tcl_Get
2c1d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
2c1e0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
2c1f0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
2c200 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f  zDbName, SQLITE_
2c210 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c 28 76  FCNTL_VFSNAME,(v
2c220 6f 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65 29 3b  oid*)&zVfsName);
2c230 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
2c240 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56 66 73  ult(interp, zVfs
2c250 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  Name, (char*)0);
2c260 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2c270 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72 65 74  zVfsName);.  ret
2c280 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
2c290 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2c2a0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65   file_control_te
2c2b0 6d 70 66 69 6c 65 6e 61 6d 65 20 44 42 20 3f 41  mpfilename DB ?A
2c2c0 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75  UXDB?.**.** Retu
2c2d0 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
2c2e0 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2c2f0 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74  filename.*/.stat
2c300 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2c310 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  LAPI file_contro
2c320 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28 0a  l_tempfilename(.
2c330 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
2c340 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
2c350 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
2c360 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
2c370 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
2c380 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2c390 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2c3a0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2c3b0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2c3c0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
2c3d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2c3e0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2c3f0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
2c400 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
2c410 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2c420 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
2c430 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
2c440 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
2c450 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20   "main";.  char 
2c460 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20  *zTName = 0;..  
2c470 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f  if( objc!=2 && o
2c480 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
2c490 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2c4a0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2c4b0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2c4c0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
2c4d0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
2c4e0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
2c4f0 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29   DB ?AUXDB?", 0)
2c500 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2c510 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2c520 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2c530 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2c540 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2c550 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
2c560 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2c570 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29  .  if( objc==3 )
2c580 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20  {.    zDbName = 
2c590 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2c5a0 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71  jv[2]);.  }.  sq
2c5b0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
2c5c0 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20  ol(db, zDbName, 
2c5d0 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d  SQLITE_FCNTL_TEM
2c5e0 50 46 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69 64  PFILENAME, (void
2c5f0 2a 29 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54 63  *)&zTName);.  Tc
2c600 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2c610 6e 74 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20 28  nterp, zTName, (
2c620 63 68 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69  char*)0);.  sqli
2c630 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29  te3_free(zTName)
2c640 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2c650 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74  K;  .}.../*.** t
2c660 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
2c670 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20  _vfs_list.**.** 
2c680 20 20 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c    Return a tcl l
2c690 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ist containing t
2c6a0 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20  he names of all 
2c6b0 72 65 67 69 73 74 65 72 65 64 20 76 66 73 27 73  registered vfs's
2c6c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c6d0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66  SQLITE_TCLAPI vf
2c6e0 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e 74  s_list(.  Client
2c6f0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2c700 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2c710 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2c720 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2c730 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2c740 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2c750 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2c760 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2c770 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2c780 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2c790 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c7a0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2c7b0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2c7c0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2c7d0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2c7e0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
2c7f0 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a  *pVfs;.  Tcl_Obj
2c800 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77   *pRet = Tcl_New
2c810 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a  Obj();.  if( obj
2c820 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
2c830 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2c840 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
2c850 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2c860 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
2c870 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65 33 5f  or(pVfs=sqlite3_
2c880 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70 56 66  vfs_find(0); pVf
2c890 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e  s; pVfs=pVfs->pN
2c8a0 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69  ext){.    Tcl_Li
2c8b0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
2c8c0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
2c8d0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
2c8e0 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d  j(pVfs->zName, -
2c8f0 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  1));.  }.  Tcl_S
2c900 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2c910 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72 65 74  rp, pRet);.  ret
2c920 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
2c930 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2c940 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44   sqlite3_limit D
2c950 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  B ID VALUE.**.**
2c960 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
2c970 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
2c980 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66 61  e3_limit interfa
2c990 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
2c9a0 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
2c9b0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
2c9c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2c9d0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2c9e0 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43 6c 69 65  st_limit(.  Clie
2c9f0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2ca00 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
2ca10 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
2ca20 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
2ca30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2ca40 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2ca50 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2ca60 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2ca70 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2ca80 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2ca90 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2caa0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2cab0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2cac0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2cad0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2cae0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2caf0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  b;.  int rc;.  s
2cb00 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2cb10 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
2cb20 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20  zName;.     int 
2cb30 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d 20 3d 20  id;.  } aId[] = 
2cb40 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  {.    { "SQLITE_
2cb50 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22 2c 20 20  LIMIT_LENGTH",  
2cb60 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2cb70 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20  TE_LIMIT_LENGTH 
2cb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
2cb90 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
2cba0 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 22  IMIT_SQL_LENGTH"
2cbb0 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
2cbc0 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
2cbd0 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TH           },.
2cbe0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
2cbf0 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20 20 20  MIT_COLUMN",    
2cc00 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2cc10 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20  _LIMIT_COLUMN   
2cc20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2cc30 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
2cc40 49 54 5f 45 58 50 52 5f 44 45 50 54 48 22 2c 20  IT_EXPR_DEPTH", 
2cc50 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2cc60 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48  LIMIT_EXPR_DEPTH
2cc70 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2cc80 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
2cc90 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
2cca0 54 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  T",     SQLITE_L
2ccb0 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
2ccc0 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a 20 20 20  LECT      },.   
2ccd0 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
2cce0 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20 20 20 20  _VDBE_OP",      
2ccf0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2cd00 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20 20 20  MIT_VDBE_OP     
2cd10 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2cd20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
2cd30 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22 2c 20 20  FUNCTION_ARG",  
2cd40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2cd50 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  IT_FUNCTION_ARG 
2cd60 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2cd70 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41   "SQLITE_LIMIT_A
2cd80 54 54 41 43 48 45 44 22 2c 20 20 20 20 20 20 20  TTACHED",       
2cd90 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2cda0 54 5f 41 54 54 41 43 48 45 44 20 20 20 20 20 20  T_ATTACHED      
2cdb0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2cdc0 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49  "SQLITE_LIMIT_LI
2cdd0 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
2cde0 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  H", SQLITE_LIMIT
2cdf0 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
2ce00 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20 7b 20 22  NGTH  },.    { "
2ce10 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
2ce20 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22 2c 20 20  IABLE_NUMBER",  
2ce30 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2ce40 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20  VARIABLE_NUMBER 
2ce50 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
2ce60 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47  QLITE_LIMIT_TRIG
2ce70 47 45 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20  GER_DEPTH",     
2ce80 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54    SQLITE_LIMIT_T
2ce90 52 49 47 47 45 52 5f 44 45 50 54 48 20 20 20 20  RIGGER_DEPTH    
2cea0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
2ceb0 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45  LITE_LIMIT_WORKE
2cec0 52 5f 54 48 52 45 41 44 53 22 2c 20 20 20 20 20  R_THREADS",     
2ced0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
2cee0 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20 20  RKER_THREADS    
2cef0 20 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f     },.    .    /
2cf00 2a 20 4f 75 74 20 6f 66 20 72 61 6e 67 65 20 74  * Out of range t
2cf10 65 73 74 20 63 61 73 65 73 20 2a 2f 0a 20 20 20  est cases */.   
2cf20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
2cf30 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20  _TOOSMALL",     
2cf40 20 20 20 20 20 20 20 2d 31 2c 20 20 20 20 20 20         -1,      
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf60 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2cf70 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
2cf80 54 4f 4f 42 49 47 22 2c 20 20 20 20 20 20 20 20  TOOBIG",        
2cf90 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2cfa0 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
2cfb0 53 2b 31 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a  S+1     },.  };.
2cfc0 20 20 69 6e 74 20 69 2c 20 69 64 20 3d 20 30 3b    int i, id = 0;
2cfd0 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63 6f  .  int val;.  co
2cfe0 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 0a  nst char *zId;..
2cff0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
2d000 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2d010 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
2d020 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
2d030 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
2d040 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
2d050 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
2d060 2c 20 30 29 2c 20 22 20 44 42 20 49 44 20 56 41  , 0), " DB ID VA
2d070 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
2d080 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2d090 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
2d0a0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2d0b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2d0c0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
2d0d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2d0e0 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74 53    zId = Tcl_GetS
2d0f0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
2d100 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
2d110 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28  eof(aId)/sizeof(
2d120 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  aId[0]); i++){. 
2d130 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 49     if( strcmp(zI
2d140 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29  d, aId[i].zName)
2d150 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 64 20  ==0 ){.      id 
2d160 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20 20  = aId[i].id;.   
2d170 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2d180 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a    }.  if( i>=siz
2d190 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28  eof(aId)/sizeof(
2d1a0 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54  aId[0]) ){.    T
2d1b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2d1c0 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e  interp, "unknown
2d1d0 20 6c 69 6d 69 74 20 74 79 70 65 3a 20 22 2c 20   limit type: ", 
2d1e0 7a 49 64 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zId, (char*)0);.
2d1f0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2d200 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2d210 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
2d220 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
2d230 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
2d240 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
2d250 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69  c = sqlite3_limi
2d260 74 28 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b 0a  t(db, id, val);.
2d270 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2d280 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2d290 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20  ewIntObj(rc));. 
2d2a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
2d2b0 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d   .}../*.** tclcm
2d2c0 64 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74  d:  save_prng_st
2d2d0 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20 74  ate.**.** Save t
2d2e0 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
2d2f0 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75  pseudo-random nu
2d300 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a  mber generator..
2d310 2a 2a 20 41 74 20 74 68 65 20 73 61 6d 65 20 74  ** At the same t
2d320 69 6d 65 2c 20 76 65 72 69 66 79 20 74 68 61 74  ime, verify that
2d330 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2d340 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65 6e  ntrol works even
2d350 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20   when.** called 
2d360 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 72  with an out-of-r
2d370 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  ange opcode..*/.
2d380 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2d390 45 5f 54 43 4c 41 50 49 20 73 61 76 65 5f 70 72  E_TCLAPI save_pr
2d3a0 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
2d3b0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2d3c0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
2d3d0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
2d3e0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
2d3f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2d400 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2d410 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2d420 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2d430 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2d440 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2d450 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d460 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2d470 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2d480 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2d490 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2d4a0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  .){.  int rc = s
2d4b0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2d4c0 72 6f 6c 28 39 39 39 39 29 3b 0a 20 20 61 73 73  rol(9999);.  ass
2d4d0 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20  ert( rc==0 );.  
2d4e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
2d4f0 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20  t_control(-1);. 
2d500 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
2d510 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  ;.  sqlite3_test
2d520 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2d530 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
2d540 56 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  VE);.  return TC
2d550 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
2d560 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72 65 5f 70  lcmd:  restore_p
2d570 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61  rng_state.*/.sta
2d580 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2d590 43 4c 41 50 49 20 72 65 73 74 6f 72 65 5f 70 72  CLAPI restore_pr
2d5a0 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
2d5b0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
2d5c0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
2d5d0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
2d5e0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
2d5f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2d600 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2d610 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2d620 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2d630 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2d640 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
2d650 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2d660 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2d670 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2d680 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
2d690 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2d6a0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65  .){.  sqlite3_te
2d6b0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2d6c0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
2d6d0 52 45 53 54 4f 52 45 29 3b 0a 20 20 72 65 74 75  RESTORE);.  retu
2d6e0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a  rn TCL_OK;.}./*.
2d6f0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73 65  ** tclcmd:  rese
2d700 74 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a  t_prng_state.*/.
2d710 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2d720 45 5f 54 43 4c 41 50 49 20 72 65 73 65 74 5f 70  E_TCLAPI reset_p
2d730 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69  rng_state(.  Cli
2d740 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2d750 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
2d760 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
2d770 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
2d780 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2d790 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2d7a0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2d7b0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2d7c0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2d7d0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
2d7e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2d7f0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2d800 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2d810 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
2d820 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2d830 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  /.){.  sqlite3_r
2d840 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
2d850 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2d860 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
2d870 20 20 70 72 6e 67 5f 73 65 65 64 20 49 4e 54 20    prng_seed INT 
2d880 3f 44 42 3f 0a 2a 2a 0a 2a 2a 20 53 65 74 20 75  ?DB?.**.** Set u
2d890 70 20 74 68 65 20 53 51 4c 49 54 45 5f 54 45 53  p the SQLITE_TES
2d8a0 54 43 54 52 4c 5f 50 52 4e 47 5f 53 45 45 44 20  TCTRL_PRNG_SEED 
2d8b0 70 72 61 67 6d 61 20 77 69 74 68 20 70 61 72 61  pragma with para
2d8c0 6d 65 74 65 72 20 49 4e 54 20 61 6e 64 20 44 42  meter INT and DB
2d8d0 2e 0a 2a 2a 20 49 4e 54 20 69 73 20 61 6e 20 69  ..** INT is an i
2d8e0 6e 74 65 67 65 72 2e 20 20 44 42 20 69 73 20 61  nteger.  DB is a
2d8f0 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2d900 74 69 6f 6e 2c 20 6f 72 20 61 20 4e 55 4c 4c 20  tion, or a NULL 
2d910 70 6f 69 6e 74 65 72 20 69 66 0a 2a 2a 20 6f 6d  pointer if.** om
2d920 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  itted..**.** Whe
2d930 6e 20 49 4e 54 21 3d 30 20 61 6e 64 20 44 42 21  n INT!=0 and DB!
2d940 3d 30 2c 20 73 65 74 20 74 68 65 20 50 52 4e 47  =0, set the PRNG
2d950 20 73 65 65 64 20 74 6f 20 74 68 65 20 76 61 6c   seed to the val
2d960 75 65 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  ue of the schema
2d970 0a 2a 2a 20 63 6f 6f 6b 69 65 20 66 6f 72 20 44  .** cookie for D
2d980 42 2c 20 6f 72 20 74 6f 20 49 4e 54 20 69 66 20  B, or to INT if 
2d990 74 68 65 20 73 63 68 65 6d 61 20 63 6f 6f 6b 69  the schema cooki
2d9a0 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62 65 20  e happens to be 
2d9b0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  zero..**.** When
2d9c0 20 49 4e 54 21 3d 30 20 61 6e 64 20 44 42 3d 3d   INT!=0 and DB==
2d9d0 30 2c 20 73 65 74 20 74 68 65 20 50 52 4e 47 20  0, set the PRNG 
2d9e0 73 65 65 64 20 74 6f 20 6a 75 73 74 20 49 4e 54  seed to just INT
2d9f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 49 4e 54 3d 3d  ..**.** If INT==
2da00 30 20 61 6e 64 20 44 42 3d 3d 30 20 74 68 65 6e  0 and DB==0 then
2da10 20 75 73 65 20 74 68 65 20 64 65 66 61 75 6c 74   use the default
2da20 20 70 72 6f 63 65 64 75 72 65 20 6f 66 20 63 61   procedure of ca
2da30 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a 20 78 52 61  lling the.** xRa
2da40 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20  ndomness method 
2da50 6f 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  on the default V
2da60 46 53 20 74 6f 20 67 65 74 20 74 68 65 20 50 52  FS to get the PR
2da70 4e 47 20 73 65 65 64 2e 0a 2a 2f 0a 73 74 61 74  NG seed..*/.stat
2da80 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2da90 4c 41 50 49 20 70 72 6e 67 5f 73 65 65 64 28 0a  LAPI prng_seed(.
2daa0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
2dab0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
2dac0 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
2dad0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
2dae0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
2daf0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
2db00 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
2db10 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
2db20 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
2db30 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
2db40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2db50 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
2db60 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
2db70 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
2db80 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
2db90 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
2dba0 69 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  i = 0;.  sqlite3
2dbb0 20 2a 64 62 20 3d 20 30 3b 0a 20 20 69 66 28 20   *db = 0;.  if( 
2dbc0 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
2dbd0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
2dbe0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2dbf0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 45 45  p, 1, objv, "SEE
2dc00 44 20 3f 44 42 3f 22 29 3b 0a 20 20 20 20 72 65  D ?DB?");.    re
2dc10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2dc20 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65    }.  if( Tcl_Ge
2dc30 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
2dc40 72 70 2c 6f 62 6a 76 5b 30 5d 2c 26 69 29 20 29  rp,objv[0],&i) )
2dc50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2dc60 52 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33  R;.  if( objc==3
2dc70 20 26 26 20 67 65 74 44 62 50 6f 69 6e 74 65 72   && getDbPointer
2dc80 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2dc90 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
2dca0 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
2dcb0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2dcc0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   }.  sqlite3_tes
2dcd0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
2dce0 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
2dcf0 45 45 44 2c 20 69 2c 20 64 62 29 3b 0a 20 20 72  EED, i, db);.  r
2dd00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2dd10 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2dd20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f  database_may_be_
2dd30 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e  corrupt.**.** In
2dd40 64 69 63 61 74 65 20 74 68 61 74 20 64 61 74 61  dicate that data
2dd50 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74  base files might
2dd60 20 62 65 20 63 6f 72 72 75 70 74 2e 20 49 6e 20   be corrupt. In 
2dd70 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 65 74  other words, set
2dd80 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 73   the normal.** s
2dd90 74 61 74 65 20 6f 66 20 6f 70 65 72 61 74 69 6f  tate of operatio
2dda0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2ddb0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64   SQLITE_TCLAPI d
2ddc0 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63  atabase_may_be_c
2ddd0 6f 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74  orrupt(.  Client
2dde0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2ddf0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
2de00 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
2de10 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
2de20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2de30 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2de40 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2de50 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2de60 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2de70 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2de80 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2de90 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2dea0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2deb0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2dec0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2ded0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  {.  sqlite3_test
2dee0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2def0 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
2df00 4f 52 52 55 50 54 2c 20 30 29 3b 0a 20 20 72 65  ORRUPT, 0);.  re
2df10 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
2df20 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61  *.** tclcmd:  da
2df30 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
2df40 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63  rupt.**.** Indic
2df50 61 74 65 20 74 68 61 74 20 64 61 74 61 62 61 73  ate that databas
2df60 65 20 66 69 6c 65 73 20 61 72 65 20 61 6c 77 61  e files are alwa
2df70 79 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20  ys well-formed. 
2df80 54 68 69 73 20 65 6e 61 62 6c 65 73 0a 2a 2a 20  This enables.** 
2df90 65 78 74 72 61 20 61 73 73 65 72 74 28 29 20 73  extra assert() s
2dfa0 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 74  tatements that t
2dfb0 65 73 74 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  est conditions t
2dfc0 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20 74  hat are always t
2dfd0 72 75 65 0a 2a 2a 20 66 6f 72 20 77 65 6c 6c 2d  rue.** for well-
2dfe0 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 73  formed databases
2dff0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2e000 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 61  SQLITE_TCLAPI da
2e010 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72  tabase_never_cor
2e020 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  rupt(.  ClientDa
2e030 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2e040 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2e050 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
2e060 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
2e070 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2e080 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2e090 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2e0a0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2e0b0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2e0c0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2e0d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2e0e0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2e0f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2e100 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2e110 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2e120 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
2e130 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
2e140 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
2e150 52 55 50 54 2c 20 31 29 3b 0a 20 20 72 65 74 75  RUPT, 1);.  retu
2e160 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2e170 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61  .** tclcmd:  pca
2e180 63 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61  che_stats.*/.sta
2e190 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2e1a0 43 4c 41 50 49 20 74 65 73 74 5f 70 63 61 63 68  CLAPI test_pcach
2e1b0 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e  e_stats(.  Clien
2e1c0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2e1d0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
2e1e0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
2e1f0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
2e200 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2e210 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2e220 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2e230 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2e240 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2e250 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2e260 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2e270 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2e280 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2e290 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2e2a0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2e2b0 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20  ){.  int nMin;. 
2e2c0 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74   int nMax;.  int
2e2d0 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74   nCurrent;.  int
2e2e0 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20   nRecyclable;.  
2e2f0 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
2e300 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
2e310 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20  tats(&nCurrent, 
2e320 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e  &nMax, &nMin, &n
2e330 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20  Recyclable);..  
2e340 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
2e350 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
2e360 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
2e370 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
2e380 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
2e390 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a  current", -1));.
2e3a0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2e3b0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2e3c0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
2e3d0 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29  IntObj(nCurrent)
2e3e0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
2e3f0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2e400 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
2e410 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61  NewStringObj("ma
2e420 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  x", -1));.  Tcl_
2e430 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2e440 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
2e450 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
2e460 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nMax));.  Tcl_L
2e470 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2e480 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
2e490 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
2e4a0 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a  bj("min", -1));.
2e4b0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2e4c0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2e4d0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
2e4e0 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20  IntObj(nMin));. 
2e4f0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2e500 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2e510 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
2e520 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c  tringObj("recycl
2e530 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54  able", -1));.  T
2e540 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2e550 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2e560 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
2e570 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29  Obj(nRecyclable)
2e580 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  );..  Tcl_SetObj
2e590 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
2e5a0 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
2e5b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  TCL_OK;.}..#ifde
2e5c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2e5d0 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
2e5e0 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 75  atic void test_u
2e5f0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28  nlock_notify_cb(
2e600 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74  void **aArg, int
2e610 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 69   nArg){.  int ii
2e620 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
2e630 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nArg; ii++){.  
2e640 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28 54 63    Tcl_EvalEx((Tc
2e650 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72 67 5b  l_Interp *)aArg[
2e660 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74  ii], "unlock_not
2e670 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56  ify", -1, TCL_EV
2e680 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a  AL_GLOBAL);.  }.
2e690 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2e6a0 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
2e6b0 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a  _NOTIFY */../*.*
2e6c0 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
2e6d0 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
2e6e0 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51   db.*/.#ifdef SQ
2e6f0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
2e700 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63  CK_NOTIFY.static
2e710 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2e720 50 49 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  PI test_unlock_n
2e730 6f 74 69 66 79 28 0a 20 20 43 6c 69 65 6e 74 44  otify(.  ClientD
2e740 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2e750 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
2e760 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2e770 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2e780 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2e790 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2e7a0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2e7b0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2e7c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2e7d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2e7e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2e7f0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2e800 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2e810 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2e820 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
2e830 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2e840 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2e850 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2e860 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
2e870 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2e880 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50   }..  if( getDbP
2e890 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2e8a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2e8b0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
2e8c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2e8d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
2e8e0 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
2e8f0 6f 74 69 66 79 28 64 62 2c 20 74 65 73 74 5f 75  otify(db, test_u
2e900 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c  nlock_notify_cb,
2e910 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72 70 29   (void *)interp)
2e920 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
2e930 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
2e940 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
2e950 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
2e960 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2e970 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
2e980 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
2e990 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
2e9a0 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74   db ?NAME?.*/.st
2e9b0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2e9c0 54 43 4c 41 50 49 20 74 65 73 74 5f 77 61 6c 5f  TCLAPI test_wal_
2e9d0 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c  checkpoint(.  Cl
2e9e0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2e9f0 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
2ea00 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
2ea10 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2ea20 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2ea30 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2ea40 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2ea50 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
2ea60 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2ea70 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2ea80 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
2ea90 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
2eaa0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2eab0 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
2eac0 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  b = 0;.  sqlite3
2ead0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
2eae0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
2eaf0 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  & objc!=2 ){.   
2eb00 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2eb10 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2eb20 76 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b  v, "DB ?NAME?");
2eb30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2eb40 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
2eb50 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2eb60 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2eb70 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2eb80 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
2eb90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2eba0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29  .  if( objc==3 )
2ebb0 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f  {.    zDb = Tcl_
2ebc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
2ebd0 5d 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  ]);.  }.  rc = s
2ebe0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
2ebf0 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a  point(db, zDb);.
2ec00 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
2ec10 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
2ec20 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
2ec30 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
2ec40 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2ec50 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
2ec60 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
2ec70 63 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f  ckpoint_v2 db MO
2ec80 44 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20  DE ?NAME?.**.** 
2ec90 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c  This command cal
2eca0 6c 73 20 74 68 65 20 77 61 6c 5f 63 68 65 63 6b  ls the wal_check
2ecb0 70 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e 63 74  point_v2() funct
2ecc0 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 70 65  ion with the spe
2ecd0 63 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61  cified.** mode a
2ece0 72 67 75 6d 65 6e 74 20 28 70 61 73 73 69 76 65  rgument (passive
2ecf0 2c 20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61 72  , full or restar
2ed00 74 29 2e 20 49 66 20 70 72 65 73 65 6e 74 2c 20  t). If present, 
2ed10 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61 6d  the database nam
2ed20 65 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61 73  e.** NAME is pas
2ed30 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e  sed as the secon
2ed40 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77 61  d argument to wa
2ed50 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
2ed60 29 2e 20 49 66 20 69 74 20 74 68 65 0a 2a 2a 20  ). If it the.** 
2ed70 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 69 73  NAME argument is
2ed80 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 61 20   not present, a 
2ed90 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73 20  NULL pointer is 
2eda0 70 61 73 73 65 64 20 69 6e 73 74 65 61 64 2e 0a  passed instead..
2edb0 2a 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65  **.** If wal_che
2edc0 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72 65 74  ckpoint_v2() ret
2edd0 75 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20 6f  urns any value o
2ede0 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54 45  ther than SQLITE
2edf0 5f 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49  _BUSY or.** SQLI
2ee00 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73  TE_OK, then this
2ee10 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73   command returns
2ee20 20 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20   TCL_ERROR. The 
2ee30 54 63 6c 20 72 65 73 75 6c 74 20 69 73 20 73 65  Tcl result is se
2ee40 74 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72 72 6f  t.** to the erro
2ee50 72 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69 6e  r message obtain
2ee60 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ed from sqlite3_
2ee70 65 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20  errmsg()..**.** 
2ee80 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73 20  Otherwise, this 
2ee90 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20  command returns 
2eea0 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 20  a list of three 
2eeb0 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66 69  integers. The fi
2eec0 72 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  rst integer.** i
2eed0 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 42 55  s 1 if SQLITE_BU
2eee0 53 59 20 77 61 73 20 72 65 74 75 72 6e 65 64 2c  SY was returned,
2eef0 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65 2e   or 0 otherwise.
2ef00 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74   The following t
2ef10 77 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61  wo integers.** a
2ef20 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  re the values re
2ef30 74 75 72 6e 65 64 20 76 69 61 20 74 68 65 20 6f  turned via the o
2ef40 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72 73  utput parameters
2ef50 20 62 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69   by wal_checkpoi
2ef60 6e 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65  nt_v2() -.** the
2ef70 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65   number of frame
2ef80 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64  s in the log and
2ef90 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
2efa0 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
2efb0 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 62 65  .** that have be
2efc0 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  en checkpointed.
2efd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
2efe0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
2eff0 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  t_wal_checkpoint
2f000 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  _v2(.  ClientDat
2f010 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2f020 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
2f030 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2f040 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2f050 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2f060 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2f070 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2f080 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2f090 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2f0a0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2f0b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2f0c0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2f0d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2f0e0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a   char *zDb = 0;.
2f0f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2f100 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20   int rc;..  int 
2f110 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f  eMode;.  int nLo
2f120 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20  g = -555;.  int 
2f130 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20  nCkpt = -555;.  
2f140 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
2f150 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20 61    const char * a
2f160 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73  Mode[] = { "pass
2f170 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72  ive", "full", "r
2f180 65 73 74 61 72 74 22 2c 20 22 74 72 75 6e 63 61  estart", "trunca
2f190 74 65 22 2c 20 30 20 7d 3b 0a 20 20 61 73 73 65  te", 0 };.  asse
2f1a0 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
2f1b0 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30  POINT_PASSIVE==0
2f1c0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
2f1d0 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
2f1e0 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73  FULL==1 );.  ass
2f1f0 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
2f200 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d  KPOINT_RESTART==
2f210 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
2f220 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
2f230 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a  _TRUNCATE==3 );.
2f240 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26  .  if( objc!=3 &
2f250 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  & objc!=4 ){.   
2f260 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2f270 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2f280 76 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d  v, "DB MODE ?NAM
2f290 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  E?");.    return
2f2a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2f2b0 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29  .  if( objc==4 )
2f2c0 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f  {.    zDb = Tcl_
2f2d0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33  GetString(objv[3
2f2e0 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  ]);.  }.  if( ge
2f2f0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2f300 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2f310 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2f320 7c 7c 20 28 0a 20 20 20 20 20 20 54 43 4c 5f 4f  || (.      TCL_O
2f330 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
2f340 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c  mObj(0, objv[2],
2f350 20 26 65 4d 6f 64 65 29 0a 20 20 20 26 26 20 54   &eMode).   && T
2f360 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e  CL_OK!=Tcl_GetIn
2f370 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  dexFromObj(inter
2f380 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64  p, objv[2], aMod
2f390 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65  e, "mode", 0, &e
2f3a0 4d 6f 64 65 29 20 0a 20 20 29 29 7b 0a 20 20 20  Mode) .  )){.   
2f3b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2f3c0 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  R;.  }..  rc = s
2f3d0 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
2f3e0 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62  point_v2(db, zDb
2f3f0 2c 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20  , eMode, &nLog, 
2f400 26 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28 20 72  &nCkpt);.  if( r
2f410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c!=SQLITE_OK && 
2f420 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc!=SQLITE_BUSY 
2f430 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2f440 72 20 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73 71  r *zErrCode = sq
2f450 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
2f460 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52  ;.    Tcl_ResetR
2f470 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
2f480 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2f490 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ult(interp, zErr
2f4a0 43 6f 64 65 2c 20 22 20 2d 20 22 2c 20 28 63 68  Code, " - ", (ch
2f4b0 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72 72  ar *)sqlite3_err
2f4c0 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20  msg(db), 0);.   
2f4d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2f4e0 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d  R;.  }..  pRet =
2f4f0 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
2f500 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2f510 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2f520 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
2f530 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54 45  ntObj(rc==SQLITE
2f540 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20 54  _BUSY?1:0));.  T
2f550 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2f560 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2f570 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
2f580 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54 63  Obj(nLog));.  Tc
2f590 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2f5a0 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
2f5b0 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
2f5c0 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54 63  bj(nCkpt));.  Tc
2f5d0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2f5e0 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20  nterp, pRet);.. 
2f5f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2f600 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
2f610 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
2f620 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62 20  tocheckpoint db 
2f630 56 41 4c 55 45 0a 2a 2f 0a 73 74 61 74 69 63 20  VALUE.*/.static 
2f640 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2f650 49 20 74 65 73 74 5f 77 61 6c 5f 61 75 74 6f 63  I test_wal_autoc
2f660 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69  heckpoint(.  Cli
2f670 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
2f680 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
2f690 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2f6a0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2f6b0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2f6c0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2f6d0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2f6e0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
2f6f0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2f700 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2f710 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2f720 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
2f730 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
2f740 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2f750 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
2f760 69 6e 74 20 69 56 61 6c 3b 0a 0a 0a 20 20 69 66  int iVal;...  if
2f770 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
2f780 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2f790 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2f7a0 76 2c 20 22 44 42 20 56 41 4c 55 45 22 29 3b 0a  v, "DB VALUE");.
2f7b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2f7c0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
2f7d0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2f7e0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2f7f0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
2f800 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65  b) .   || Tcl_Ge
2f810 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 6f  tIntFromObj(0, o
2f820 62 6a 76 5b 32 5d 2c 20 26 69 56 61 6c 29 0a 20  bjv[2], &iVal). 
2f830 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
2f840 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2f850 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 61   rc = sqlite3_wa
2f860 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
2f870 28 64 62 2c 20 69 56 61 6c 29 3b 0a 20 20 54 63  (db, iVal);.  Tc
2f880 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
2f890 74 65 72 70 29 3b 0a 20 20 69 66 28 20 72 63 21  terp);.  if( rc!
2f8a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f8b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
2f8c0 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74 65 33  rrCode = sqlite3
2f8d0 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20  ErrName(rc);.   
2f8e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2f8f0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2f900 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 43  wStringObj(zErrC
2f910 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72  ode, -1));.    r
2f920 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2f930 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
2f940 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
2f950 20 74 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73   tclcmd:  test_s
2f960 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49  qlite3_log ?SCRI
2f970 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  PT?.*/.static st
2f980 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b  ruct LogCallback
2f990 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
2f9a0 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f  *pInterp;.  Tcl_
2f9b0 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67  Obj *pObj;.} log
2f9c0 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30  callback = {0, 0
2f9d0 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78  };.static void x
2f9e0 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  Logcallback(void
2f9f0 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20 65 72   *unused, int er
2fa00 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  r, char *zMsg){.
2fa10 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20    Tcl_Obj *pNew 
2fa20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
2fa30 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  bj(logcallback.p
2fa40 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  Obj);.  Tcl_Incr
2fa50 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a  RefCount(pNew);.
2fa60 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2fa70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20  endElement(.    
2fa80 20 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e    0, pNew, Tcl_N
2fa90 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
2faa0 74 65 33 45 72 72 4e 61 6d 65 28 65 72 72 29 2c  te3ErrName(err),
2fab0 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f   -1).  );.  Tcl_
2fac0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2fad0 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54 63  ment(0, pNew, Tc
2fae0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
2faf0 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  Msg, -1));.  Tcl
2fb00 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61  _EvalObjEx(logca
2fb10 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20  llback.pInterp, 
2fb20 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  pNew, TCL_EVAL_G
2fb30 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44  LOBAL|TCL_EVAL_D
2fb40 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65  IRECT);.  Tcl_De
2fb50 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29  crRefCount(pNew)
2fb60 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53  ;.}.static int S
2fb70 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
2fb80 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 28 0a 20  t_sqlite3_log(. 
2fb90 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
2fba0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2fbb0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2fbc0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2fbd0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2fbe0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2fbf0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
2fc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fc10 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2fc20 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
2fc30 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
2fc40 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2fc50 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  ments */.){.  if
2fc60 28 20 6f 62 6a 63 3e 32 20 29 7b 0a 20 20 20 20  ( objc>2 ){.    
2fc70 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2fc80 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2fc90 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20 20  , "SCRIPT");.   
2fca0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2fcb0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f 67  R;.  }.  if( log
2fcc0 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 29 7b  callback.pObj ){
2fcd0 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66  .    Tcl_DecrRef
2fce0 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63  Count(logcallbac
2fcf0 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67  k.pObj);.    log
2fd00 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20  callback.pObj = 
2fd10 30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  0;.    logcallba
2fd20 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 30 3b 0a  ck.pInterp = 0;.
2fd30 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66      sqlite3_conf
2fd40 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
2fd50 5f 4c 4f 47 2c 20 28 76 6f 69 64 2a 29 30 2c 20  _LOG, (void*)0, 
2fd60 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a 20  (void*)0);.  }. 
2fd70 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20   if( objc>1 ){. 
2fd80 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70     logcallback.p
2fd90 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20  Obj = objv[1];. 
2fda0 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
2fdb0 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  unt(logcallback.
2fdc0 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61  pObj);.    logca
2fdd0 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d  llback.pInterp =
2fde0 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 71 6c   interp;.    sql
2fdf0 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49  ite3_config(SQLI
2fe00 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78  TE_CONFIG_LOG, x
2fe10 4c 6f 67 63 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  Logcallback, (vo
2fe20 69 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 72 65  id*)0);.  }.  re
2fe30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2fe40 2f 2a 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62  /*.**     tcl_ob
2fe50 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d  jproc COMMANDNAM
2fe60 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20  E ARGS....**.** 
2fe70 52 75 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e  Run a TCL comman
2fe80 64 20 75 73 69 6e 67 20 69 74 73 20 6f 62 6a 50  d using its objP
2fe90 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 20 20  roc interface.  
2fea0 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69  Throw an error i
2feb0 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64  f.** the command
2fec0 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20   has no objProc 
2fed0 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74  interface..*/.st
2fee0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2fef0 54 43 4c 41 50 49 20 72 75 6e 41 73 4f 62 6a 50  TCLAPI runAsObjP
2ff00 72 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  roc(.  void * cl
2ff10 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2ff20 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2ff30 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2ff40 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2ff50 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64  v[].){.  Tcl_Cmd
2ff60 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20  Info cmdInfo;.  
2ff70 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20  if( objc<2 ){.  
2ff80 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2ff90 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2ffa0 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e  jv, "COMMAND ...
2ffb0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2ffc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2ffd0 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
2ffe0 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
2fff0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
30000 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f  jv[1]), &cmdInfo
30010 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  ) ){.    Tcl_App
30020 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
30030 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66  , "command not f
30040 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20  ound: ",.       
30050 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
30060 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61  g(objv[1]), (cha
30070 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
30080 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
30090 0a 20 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f  .  if( cmdInfo.o
300a0 62 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20  bjProc==0 ){.   
300b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
300c0 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61  t(interp, "comma
300d0 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f  nd has no objPro
300e0 63 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  c: ",.          
300f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
30100 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
30110 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
30120 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
30130 72 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f  return cmdInfo.o
30140 62 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f  bjProc(cmdInfo.o
30150 62 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e  bjClientData, in
30160 74 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62  terp, objc-1, ob
30170 6a 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  jv+1);.}..#ifnde
30180 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
30190 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e  PLAIN./*.** WARN
301a0 49 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ING: The followi
301b0 6e 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69  ng function, pri
301c0 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ntExplainQueryPl
301d0 61 6e 28 29 20 69 73 20 61 6e 20 65 78 61 63 74  an() is an exact
301e0 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78 61 6d  .** copy of exam
301f0 70 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20 65 71  ple code from eq
30200 70 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e  p.in (eqp.html).
30210 20 49 66 20 74 68 69 73 20 63 6f 64 65 20 69 73   If this code is
30220 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68   modified,.** th
30230 65 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61  en the documenta
30240 74 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73 20  tion copy needs 
30250 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61  to be modified a
30260 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a  s well..*/./*.**
30270 20 41 72 67 75 6d 65 6e 74 20 70 53 74 6d 74 20   Argument pStmt 
30280 69 73 20 61 20 70 72 65 70 61 72 65 64 20 53 51  is a prepared SQ
30290 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69  L statement. Thi
302a0 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69  s function compi
302b0 6c 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49  les.** an EXPLAI
302c0 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d  N QUERY PLAN com
302d0 6d 61 6e 64 20 74 6f 20 72 65 70 6f 72 74 20 6f  mand to report o
302e0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
302f0 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64  tatement,.** and
30300 20 70 72 69 6e 74 73 20 74 68 65 20 72 65 70 6f   prints the repo
30310 72 74 20 74 6f 20 73 74 64 6f 75 74 20 75 73 69  rt to stdout usi
30320 6e 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a  ng printf()..*/.
30330 69 6e 74 20 70 72 69 6e 74 45 78 70 6c 61 69 6e  int printExplain
30340 51 75 65 72 79 50 6c 61 6e 28 73 71 6c 69 74 65  QueryPlan(sqlite
30350 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a  3_stmt *pStmt){.
30360 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
30370 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
30380 20 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a    /* Input SQL *
30390 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61  /.  char *zExpla
303a0 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  in;             
303b0 20 20 20 20 2f 2a 20 53 51 4c 20 77 69 74 68 20      /* SQL with 
303c0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
303d0 41 4e 20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a  AN prepended */.
303e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
303f0 70 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20  pExplain;       
30400 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58    /* Compiled EX
30410 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
30420 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
30430 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
30440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
30450 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
30460 6d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  m sqlite3_prepar
30470 65 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71  e_v2() */..  zSq
30480 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  l = sqlite3_sql(
30490 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53  pStmt);.  if( zS
304a0 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  ql==0 ) return S
304b0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20  QLITE_ERROR;..  
304c0 7a 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74  zExplain = sqlit
304d0 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c  e3_mprintf("EXPL
304e0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25  AIN QUERY PLAN %
304f0 73 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28  s", zSql);.  if(
30500 20 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72   zExplain==0 ) r
30510 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
30520 45 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  EM;..  rc = sqli
30530 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 73  te3_prepare_v2(s
30540 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65  qlite3_db_handle
30550 28 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69  (pStmt), zExplai
30560 6e 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  n, -1, &pExplain
30570 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
30580 66 72 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a  free(zExplain);.
30590 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
305a0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
305b0 0a 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54  ..  while( SQLIT
305c0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
305d0 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b  tep(pExplain) ){
305e0 0a 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74  .    int iSelect
305f0 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  id = sqlite3_col
30600 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
30610 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f  , 0);.    int iO
30620 72 64 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  rder = sqlite3_c
30630 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
30640 69 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20  in, 1);.    int 
30650 69 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f  iFrom = sqlite3_
30660 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
30670 61 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e  ain, 2);.    con
30680 73 74 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c  st char *zDetail
30690 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a   = (const char *
306a0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
306b0 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33  text(pExplain, 3
306c0 29 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66 28 22  );..    printf("
306d0 25 64 20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20  %d %d %d %s\n", 
306e0 69 53 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65  iSelectid, iOrde
306f0 72 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69  r, iFrom, zDetai
30700 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  l);.  }..  retur
30710 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  n sqlite3_finali
30720 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a  ze(pExplain);.}.
30730 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
30740 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70  TE_TCLAPI test_p
30750 72 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69 64  rint_eqp(.  void
30760 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
30770 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
30780 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
30790 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
307a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
307b0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
307c0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
307d0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
307e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
307f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
30800 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
30810 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
30820 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
30830 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
30840 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
30850 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
30860 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
30870 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
30880 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72  printExplainQuer
30890 79 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20 20  yPlan(pStmt);.  
308a0 2f 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64 65  /* This is neede
308b0 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f 20  d on Windows so 
308c0 74 68 61 74 20 61 20 74 65 73 74 20 63 61 73 65  that a test case
308d0 20 75 73 69 6e 67 20 74 68 69 73 20 0a 20 20 2a   using this .  *
308e0 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20 6f  * function can o
308f0 70 65 6e 20 61 20 72 65 61 64 20 70 69 70 65 20  pen a read pipe 
30900 61 6e 64 20 67 65 74 20 74 68 65 20 6f 75 74 70  and get the outp
30910 75 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e 74  ut of.  ** print
30920 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e  ExplainQueryPlan
30930 28 29 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  () immediately..
30940 20 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73 74    */.  fflush(st
30950 64 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  dout);.  Tcl_Set
30960 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
30970 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
30980 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
30990 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
309a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
309b0 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a  OMIT_EXPLAIN */.
309c0 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74  ./*.** sqlite3_t
309d0 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52 42  est_control VERB
309e0 20 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74   ARGS....*/.stat
309f0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
30a00 4c 41 50 49 20 74 65 73 74 5f 74 65 73 74 5f 63  LAPI test_test_c
30a10 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a  ontrol(.  void *
30a20 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
30a30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
30a40 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
30a50 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
30a60 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75  objv[].){.  stru
30a70 63 74 20 56 65 72 62 20 7b 0a 20 20 20 20 63 6f  ct Verb {.    co
30a80 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
30a90 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d 20  .    int i;.  } 
30aa0 61 56 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20 20  aVerb[] = {.    
30ab0 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54  { "SQLITE_TESTCT
30ac0 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
30ad0 4c 54 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 54  LT",    SQLITE_T
30ae0 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
30af0 45 5f 46 41 55 4c 54 20 7d 2c 20 0a 20 20 20 20  E_FAULT }, .    
30b00 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54  { "SQLITE_TESTCT
30b10 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 22 2c  RL_SORTER_MMAP",
30b20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
30b30 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
30b40 4d 41 50 20 20 20 20 20 7d 2c 20 0a 20 20 20 20  MAP     }, .    
30b50 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54  { "SQLITE_TESTCT
30b60 52 4c 5f 49 4d 50 4f 53 54 45 52 22 2c 20 20 20  RL_IMPOSTER",   
30b70 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
30b80 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
30b90 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
30ba0 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52   "SQLITE_TESTCTR
30bb0 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46 55 4e 43 54  L_INTERNAL_FUNCT
30bc0 49 4f 4e 53 22 2c 20 53 51 4c 49 54 45 5f 54 45  IONS", SQLITE_TE
30bd0 53 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f  STCTRL_INTERNAL_
30be0 46 55 4e 43 54 49 4f 4e 53 7d 2c 0a 20 20 7d 3b  FUNCTIONS},.  };
30bf0 0a 20 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20  .  int iVerb;.  
30c00 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74  int iFlag;.  int
30c10 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
30c20 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
30c30 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
30c40 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52  p, 1, objv, "VER
30c50 42 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20  B ARGS...");.   
30c60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
30c70 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54  R;.  }..  rc = T
30c80 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
30c90 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20 20  bjStruct(.      
30ca0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
30cb0 20 61 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61   aVerb, sizeof(a
30cc0 56 65 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22  Verb[0]), "VERB"
30cd0 2c 20 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b  , 0, &iVerb.  );
30ce0 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
30cf0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
30d00 20 20 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b    iFlag = aVerb[
30d10 69 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74  iVerb].i;.  swit
30d20 63 68 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20  ch( iFlag ){.   
30d30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
30d40 54 43 54 52 4c 5f 49 4e 54 45 52 4e 41 4c 5f 46  TCTRL_INTERNAL_F
30d50 55 4e 43 54 49 4f 4e 53 3a 0a 20 20 20 20 63 61  UNCTIONS:.    ca
30d60 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
30d70 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
30d80 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LT: {.      int 
30d90 76 61 6c 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  val;.      if( o
30da0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  bjc!=3 ){.      
30db0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
30dc0 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
30dd0 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b 0a 20 20  jv, "ONOFF");.  
30de0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
30df0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
30e00 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65        if( Tcl_Ge
30e10 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
30e20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
30e30 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
30e40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
30e50 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
30e60 6e 74 72 6f 6c 28 69 46 6c 61 67 2c 20 76 61 6c  ntrol(iFlag, val
30e70 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
30e80 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
30e90 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
30ea0 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20  SORTER_MMAP: {. 
30eb0 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20       int val;.  
30ec0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b      sqlite3 *db;
30ed0 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
30ee0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =4 ){.        Tc
30ef0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
30f00 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
30f10 22 44 42 20 4c 49 4d 49 54 22 29 3b 0a 20 20 20  "DB LIMIT");.   
30f20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
30f30 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
30f40 20 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f       if( getDbPo
30f50 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
30f60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
30f70 5b 32 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [2]), &db) ) ret
30f80 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
30f90 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
30fa0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
30fb0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
30fc0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
30fd0 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
30fe0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
30ff0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
31000 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62  _SORTER_MMAP, db
31010 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  , val);.      br
31020 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
31030 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
31040 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b  CTRL_IMPOSTER: {
31050 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 4f 66 66  .      int onOff
31060 2c 20 74 6e 75 6d 3b 0a 20 20 20 20 20 20 63 6f  , tnum;.      co
31070 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
31080 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
31090 20 2a 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20   *db;.      if( 
310a0 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 20  objc!=6 ){.     
310b0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
310c0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
310d0 62 6a 76 2c 20 22 44 42 20 64 62 4e 61 6d 65 20  bjv, "DB dbName 
310e0 6f 6e 4f 66 66 20 74 6e 75 6d 22 29 3b 0a 20 20  onOff tnum");.  
310f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
31100 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
31110 20 20 20 20 20 20 69 66 28 20 67 65 74 44 62 50        if( getDbP
31120 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
31130 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
31140 76 5b 32 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[2]), &db) ) re
31150 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
31160 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20        zDbName = 
31170 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
31180 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69 66  jv[3]);.      if
31190 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
311a0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
311b0 5b 34 5d 2c 20 26 6f 6e 4f 66 66 29 20 29 20 72  [4], &onOff) ) r
311c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
311d0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
311e0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
311f0 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 74  erp, objv[5], &t
31200 6e 75 6d 29 20 29 20 72 65 74 75 72 6e 20 54 43  num) ) return TC
31210 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73  L_ERROR;.      s
31220 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
31230 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
31240 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62  TRL_IMPOSTER, db
31250 2c 20 7a 44 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66  , zDbName, onOff
31260 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62  , tnum);.      b
31270 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
31280 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
31290 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
312a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
312b0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
312c0 49 58 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  IX.#include <sys
312d0 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
312e0 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
312f0 68 3e 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53  h>..static int S
31300 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
31310 74 5f 67 65 74 72 75 73 61 67 65 28 0a 20 20 76  t_getrusage(.  v
31320 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
31330 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
31340 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
31350 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
31360 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
31370 20 63 68 61 72 20 62 75 66 5b 31 30 32 34 5d 3b   char buf[1024];
31380 0a 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65  .  struct rusage
31390 20 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c   r;.  memset(&r,
313a0 20 30 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a   0, sizeof(r));.
313b0 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41    getrusage(RUSA
313c0 47 45 5f 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20  GE_SELF, &r);.. 
313d0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
313e0 66 28 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 62  f(sizeof(buf), b
313f0 75 66 2c 0a 20 20 20 20 22 72 75 5f 75 74 69 6d  uf,.    "ru_utim
31400 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 73 74 69  e=%d.%06d ru_sti
31410 6d 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 6d 69  me=%d.%06d ru_mi
31420 6e 66 6c 74 3d 25 64 20 72 75 5f 6d 61 6a 66 6c  nflt=%d ru_majfl
31430 74 3d 25 64 22 2c 20 0a 20 20 20 20 28 69 6e 74  t=%d", .    (int
31440 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 73  )r.ru_utime.tv_s
31450 65 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 75 74  ec, (int)r.ru_ut
31460 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20  ime.tv_usec, .  
31470 20 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d    (int)r.ru_stim
31480 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72  e.tv_sec, (int)r
31490 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65  .ru_stime.tv_use
314a0 63 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72  c, .    (int)r.r
314b0 75 5f 6d 69 6e 66 6c 74 2c 20 28 69 6e 74 29 72  u_minflt, (int)r
314c0 2e 72 75 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b 0a  .ru_majflt.  );.
314d0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
314e0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
314f0 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c  ewStringObj(buf,
31500 20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   -1));.  return 
31510 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
31520 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
31530 57 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  WIN./*.** Inform
31540 61 74 69 6f 6e 20 70 61 73 73 65 64 20 66 72 6f  ation passed fro
31550 6d 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61  m the main threa
31560 64 20 69 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f  d into the windo
31570 77 73 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a  ws file locker.*
31580 2a 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  * background thr
31590 65 61 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77  ead..*/.struct w
315a0 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b  in32FileLocker {
315b0 0a 20 20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b  .  char *evName;
315c0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
315d0 66 20 65 76 65 6e 74 20 74 6f 20 73 69 67 6e 61  f event to signa
315e0 6c 20 74 68 72 65 61 64 20 73 74 61 72 74 75 70  l thread startup
315f0 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
31600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
31610 64 6c 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  dle of the file 
31620 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
31630 20 20 69 6e 74 20 64 65 6c 61 79 31 3b 20 20 20    int delay1;   
31640 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62        /* Delay b
31650 65 66 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f  efore locking */
31660 0a 20 20 69 6e 74 20 64 65 6c 61 79 32 3b 20 20  .  int delay2;  
31670 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20         /* Delay 
31680 62 65 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67  before unlocking
31690 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20   */.  int ok;   
316a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
316b0 69 73 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e  ished ok */.  in
316c0 74 20 65 72 72 3b 20 20 20 20 20 20 20 20 20 20  t err;          
316d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
316e0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
316f0 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20  };.#endif...#if 
31700 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69  SQLITE_OS_WIN.#i
31710 6e 63 6c 75 64 65 20 3c 70 72 6f 63 65 73 73 2e  nclude <process.
31720 68 3e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63  h>./*.** The bac
31730 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74  kground thread t
31740 68 61 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f  hat does file lo
31750 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
31760 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45   void SQLITE_CDE
31770 43 4c 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  CL win32_file_lo
31780 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70 70 44  cker(void *pAppD
31790 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74 20 77  ata){.  struct w
317a0 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 2a  in32FileLocker *
317b0 70 20 3d 20 28 73 74 72 75 63 74 20 77 69 6e 33  p = (struct win3
317c0 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41 70  2FileLocker*)pAp
317d0 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70 2d 3e  pData;.  if( p->
317e0 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48 41  evName ){.    HA
317f0 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45 76  NDLE ev = OpenEv
31800 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46 59  ent(EVENT_MODIFY
31810 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c 20 70  _STATE, FALSE, p
31820 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ->evName);.    i
31830 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20 20 20  f ( ev ){.      
31840 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a 20 20  SetEvent(ev);.  
31850 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
31860 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ev);.    }.  }. 
31870 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31 20 29   if( p->delay1 )
31880 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 31   Sleep(p->delay1
31890 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69 6c  );.  if( LockFil
318a0 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30  e(p->h, 0, 0, 10
318b0 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b 0a 20  0000000, 0) ){. 
318c0 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61     Sleep(p->dela
318d0 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  y2);.    UnlockF
318e0 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20  ile(p->h, 0, 0, 
318f0 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b 0a 20  100000000, 0);. 
31900 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20 20     p->ok = 1;.  
31910 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 72  }else{.    p->er
31920 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c 6f  r = 1;.  }.  Clo
31930 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b 0a  seHandle(p->h);.
31940 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70 2d    p->h = 0;.  p-
31950 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20 70  >delay1 = 0;.  p
31960 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d 0a  ->delay2 = 0;.}.
31970 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
31980 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20  TE_OS_WIN./*.** 
31990 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32 5f       lock_win32_
319a0 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44 45  file FILENAME DE
319b0 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a 2a  LAY1 DELAY2.**.*
319c0 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
319d0 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f 63  ve manditory loc
319e0 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44 45  k on file for DE
319f0 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  LAY2 millisecond
31a00 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41 59  s..** Wait DELAY
31a10 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  1 milliseconds b
31a20 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
31a30 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
31a40 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
31a50 43 4c 41 50 49 20 77 69 6e 33 32 5f 66 69 6c 65  CLAPI win32_file
31a60 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20  _lock(.  void * 
31a70 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
31a80 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
31a90 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
31aa0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
31ab0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69  bjv[].){.  stati
31ac0 63 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69  c struct win32Fi
31ad0 6c 65 4c 6f 63 6b 65 72 20 78 20 3d 20 7b 20 22  leLocker x = { "
31ae0 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22  win32_file_lock"
31af0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 0, 0, 0, 0, 0 
31b00 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
31b10 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 68  *zFilename;.  ch
31b20 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
31b30 69 6e 74 20 72 65 74 72 79 20 3d 20 30 3b 0a 20  int retry = 0;. 
31b40 20 48 41 4e 44 4c 45 20 65 76 3b 0a 20 20 44 57   HANDLE ev;.  DW
31b50 4f 52 44 20 77 52 65 73 75 6c 74 3b 0a 20 20 0a  ORD wResult;.  .
31b60 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
31b70 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
31b80 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
31b90 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
31ba0 2c 20 22 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41  , "FILENAME DELA
31bb0 59 31 20 44 45 4c 41 59 32 22 29 3b 0a 20 20 20  Y1 DELAY2");.   
31bc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
31bd0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
31be0 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  c==1 ){.    sqli
31bf0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
31c00 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
31c10 20 22 25 64 20 25 64 20 25 64 20 25 64 20 25 64   "%d %d %d %d %d
31c20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
31c30 20 20 20 20 20 20 20 20 78 2e 6f 6b 2c 20 78 2e          x.ok, x.
31c40 65 72 72 2c 20 78 2e 64 65 6c 61 79 31 2c 20 78  err, x.delay1, x
31c50 2e 64 65 6c 61 79 32 2c 20 78 2e 68 29 3b 0a 20  .delay2, x.h);. 
31c60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
31c70 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
31c80 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
31c90 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
31ca0 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 78 2e 68    }.  while( x.h
31cb0 20 26 26 20 72 65 74 72 79 3c 33 30 20 29 7b 0a   && retry<30 ){.
31cc0 20 20 20 20 72 65 74 72 79 2b 2b 3b 0a 20 20 20      retry++;.   
31cd0 20 53 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 7d   Sleep(100);.  }
31ce0 0a 20 20 69 66 28 20 78 2e 68 20 29 7b 0a 20 20  .  if( x.h ){.  
31cf0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
31d00 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 75 73 79  lt(interp, "busy
31d10 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
31d20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
31d30 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
31d40 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
31d50 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
31d60 20 26 78 2e 64 65 6c 61 79 31 29 20 29 20 72 65   &x.delay1) ) re
31d70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
31d80 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
31d90 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
31da0 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e 64 65 6c 61  objv[3], &x.dela
31db0 79 32 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  y2) ) return TCL
31dc0 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e  _ERROR;.  zFilen
31dd0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
31de0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
31df0 78 2e 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65  x.h = CreateFile
31e00 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 47 45 4e 45  (zFilename, GENE
31e10 52 49 43 5f 52 45 41 44 7c 47 45 4e 45 52 49 43  RIC_READ|GENERIC
31e20 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20  _WRITE,.        
31e30 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45        FILE_SHARE
31e40 5f 52 45 41 44 7c 46 49 4c 45 5f 53 48 41 52 45  _READ|FILE_SHARE
31e50 5f 57 52 49 54 45 2c 20 30 2c 20 4f 50 45 4e 5f  _WRITE, 0, OPEN_
31e60 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20  ALWAYS,.        
31e70 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49        FILE_ATTRI
31e80 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b  BUTE_NORMAL, 0);
31e90 0a 20 20 69 66 28 20 21 78 2e 68 20 29 7b 0a 20  .  if( !x.h ){. 
31ea0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
31eb0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e  ult(interp, "can
31ec0 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22  not open file: "
31ed0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68  , zFilename, (ch
31ee0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
31ef0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
31f00 7d 0a 20 20 65 76 20 3d 20 43 72 65 61 74 65 45  }.  ev = CreateE
31f10 76 65 6e 74 28 4e 55 4c 4c 2c 20 54 52 55 45 2c  vent(NULL, TRUE,
31f20 20 46 41 4c 53 45 2c 20 78 2e 65 76 4e 61 6d 65   FALSE, x.evName
31f30 29 3b 0a 20 20 69 66 20 28 20 21 65 76 20 29 7b  );.  if ( !ev ){
31f40 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
31f50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
31f60 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 65 76 65  annot create eve
31f70 6e 74 3a 20 22 2c 20 78 2e 65 76 4e 61 6d 65 2c  nt: ", x.evName,
31f80 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
31f90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
31fa0 3b 0a 20 20 7d 0a 20 20 5f 62 65 67 69 6e 74 68  ;.  }.  _beginth
31fb0 72 65 61 64 28 77 69 6e 33 32 5f 66 69 6c 65 5f  read(win32_file_
31fc0 6c 6f 63 6b 65 72 2c 20 30 2c 20 28 76 6f 69 64  locker, 0, (void
31fd0 2a 29 26 78 29 3b 0a 20 20 53 6c 65 65 70 28 30  *)&x);.  Sleep(0
31fe0 29 3b 0a 20 20 69 66 20 28 20 28 77 52 65 73 75  );.  if ( (wResu
31ff0 6c 74 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67  lt = WaitForSing
32000 6c 65 4f 62 6a 65 63 74 28 65 76 2c 20 31 30 30  leObject(ev, 100
32010 30 30 29 29 21 3d 57 41 49 54 5f 4f 42 4a 45 43  00))!=WAIT_OBJEC
32020 54 5f 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  T_0 ){.    sqlit
32030 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
32040 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
32050 22 30 78 25 78 22 2c 20 77 52 65 73 75 6c 74 29  "0x%x", wResult)
32060 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
32070 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
32080 77 61 69 74 20 66 61 69 6c 65 64 3a 20 22 2c 20  wait failed: ", 
32090 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
320a0 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  .    CloseHandle
320b0 28 65 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (ev);.    return
320c0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
320d0 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76    CloseHandle(ev
320e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
320f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
32100 20 20 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70    exists_win32_p
32110 61 74 68 20 50 41 54 48 0a 2a 2a 0a 2a 2a 20 52  ath PATH.**.** R
32120 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
32130 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
32140 20 70 61 74 68 20 65 78 69 73 74 73 2c 20 77 68   path exists, wh
32150 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  ose fully qualif
32160 69 65 64 20 6e 61 6d 65 0a 2a 2a 20 6d 61 79 20  ied name.** may 
32170 65 78 63 65 65 64 20 32 36 30 20 63 68 61 72 61  exceed 260 chara
32180 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70  cters if it is p
32190 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c  refixed with "\\
321a0 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ?\"..*/.static i
321b0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
321c0 20 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61   win32_exists_pa
321d0 74 68 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  th(.  void *clie
321e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
321f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
32200 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
32210 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
32220 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ].){.  if( objc!
32230 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
32240 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
32250 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54  p, 1, objv, "PAT
32260 48 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  H");.    return 
32270 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
32280 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
32290 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
322a0 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20  wBooleanObj(.   
322b0 20 20 20 47 65 74 46 69 6c 65 41 74 74 72 69 62     GetFileAttrib
322c0 75 74 65 73 57 28 20 54 63 6c 5f 47 65 74 55 6e  utesW( Tcl_GetUn
322d0 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21  icode(objv[1]))!
322e0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
322f0 54 52 49 42 55 54 45 53 20 29 29 3b 0a 20 20 72  TRIBUTES ));.  r
32300 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
32310 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64  ./*.**      find
32320 5f 77 69 6e 33 32 5f 66 69 6c 65 20 50 41 54 54  _win32_file PATT
32330 45 52 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ERN.**.** Return
32340 73 20 61 20 6c 69 73 74 20 6f 66 20 65 6e 74 72  s a list of entr
32350 69 65 73 20 69 6e 20 61 20 64 69 72 65 63 74 6f  ies in a directo
32360 72 79 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  ry that match th
32370 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 74  e specified patt
32380 65 72 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75  ern,.** whose fu
32390 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61  lly qualified na
323a0 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34  me may exceed 24
323b0 38 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20  8 characters if 
323c0 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77  it is prefixed w
323d0 69 74 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a  ith.** "\\?\"..*
323e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
323f0 49 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32  ITE_TCLAPI win32
32400 5f 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76 6f  _find_file(.  vo
32410 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
32420 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
32430 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
32440 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
32450 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48  ST objv[].){.  H
32460 41 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c 65 20  ANDLE hFindFile 
32470 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
32480 5f 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32 5f  _VALUE;.  WIN32_
32490 46 49 4e 44 5f 44 41 54 41 57 20 66 69 6e 64 44  FIND_DATAW findD
324a0 61 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ata;.  Tcl_Obj *
324b0 6c 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52 44  listObj;.  DWORD
324c0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66   lastErrno;.  if
324d0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
324e0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
324f0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
32500 76 2c 20 22 50 41 54 54 45 52 4e 22 29 3b 0a 20  v, "PATTERN");. 
32510 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
32520 52 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e 64  ROR;.  }.  hFind
32530 46 69 6c 65 20 3d 20 46 69 6e 64 46 69 72 73 74  File = FindFirst
32540 46 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69  FileW(Tcl_GetUni
32550 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  code(objv[1]), &
32560 66 69 6e 64 44 61 74 61 29 3b 0a 20 20 69 66 28  findData);.  if(
32570 20 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56 41   hFindFile==INVA
32580 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
32590 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
325a0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
325b0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
325c0 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  bj(GetLastError(
325d0 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
325e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
325f0 20 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e   listObj = Tcl_N
32600 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49  ewObj();.  Tcl_I
32610 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74  ncrRefCount(list
32620 4f 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  Obj);.  do {.   
32630 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
32640 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
32650 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e  , listObj, Tcl_N
32660 65 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20 20  ewUnicodeObj(.  
32670 20 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e 63        findData.c
32680 46 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a  FileName, -1));.
32690 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
326a0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
326b0 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63  erp, listObj, Tc
326c0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
326d0 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44 61 74  .        findDat
326e0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
326f0 65 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65 28  es));.  } while(
32700 20 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28 68   FindNextFileW(h
32710 46 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64 44  FindFile, &findD
32720 61 74 61 29 20 29 3b 0a 20 20 6c 61 73 74 45 72  ata) );.  lastEr
32730 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
32740 6f 72 28 29 3b 0a 20 20 69 66 28 20 6c 61 73 74  or();.  if( last
32750 45 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20  Errno!=NO_ERROR 
32760 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  && lastErrno!=ER
32770 52 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45  ROR_NO_MORE_FILE
32780 53 20 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c 6f  S ){.    FindClo
32790 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20  se(hFindFile);. 
327a0 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
327b0 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20  unt(listObj);.  
327c0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
327d0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
327e0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74  ewWideIntObj(Get
327f0 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20  LastError()));. 
32800 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
32810 52 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64 43  ROR;.  }.  FindC
32820 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b  lose(hFindFile);
32830 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
32840 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ult(interp, list
32850 4f 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  Obj);.  return T
32860 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
32870 20 20 20 20 20 64 65 6c 65 74 65 5f 77 69 6e 33       delete_win3
32880 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 0a  2_file FILENAME.
32890 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74 68  **.** Deletes th
328a0 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
328b0 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75  , whose fully qu
328c0 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79  alified name may
328d0 20 65 78 63 65 65 64 20 32 36 30 0a 2a 2a 20 63   exceed 260.** c
328e0 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
328f0 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
32900 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74   "\\?\"..*/.stat
32910 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
32920 4c 41 50 49 20 77 69 6e 33 32 5f 64 65 6c 65 74  LAPI win32_delet
32930 65 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a  e_file(.  void *
32940 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
32950 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
32960 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
32970 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
32980 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f  bjv[].){.  if( o
32990 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
329a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
329b0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
329c0 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20  "FILENAME");.   
329d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
329e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 44 65  R;.  }.  if( !De
329f0 6c 65 74 65 46 69 6c 65 57 28 54 63 6c 5f 47 65  leteFileW(Tcl_Ge
32a00 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d  tUnicode(objv[1]
32a10 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  )) ){.    Tcl_Se
32a20 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
32a30 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
32a40 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f  tObj(GetLastErro
32a50 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  r()));.    retur
32a60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
32a70 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
32a80 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
32a90 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
32aa0 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65 5f  /*.**      make_
32ab0 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43 54  win32_dir DIRECT
32ac0 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65  ORY.**.** Create
32ad0 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
32ae0 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73 65  directory, whose
32af0 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
32b00 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64   name may exceed
32b10 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74 65   248.** characte
32b20 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66  rs if it is pref
32b30 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22  ixed with "\\?\"
32b40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32b50 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 69  SQLITE_TCLAPI wi
32b60 6e 33 32 5f 6d 6b 64 69 72 28 0a 20 20 76 6f 69  n32_mkdir(.  voi
32b70 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
32b80 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
32b90 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
32ba0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
32bb0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66  T objv[].){.  if
32bc0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
32bd0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
32be0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
32bf0 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b  v, "DIRECTORY");
32c00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
32c10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
32c20 20 21 43 72 65 61 74 65 44 69 72 65 63 74 6f 72   !CreateDirector
32c30 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64  yW(Tcl_GetUnicod
32c40 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  e(objv[1]), NULL
32c50 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ) ){.    Tcl_Set
32c60 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
32c70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
32c80 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
32c90 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
32ca0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
32cb0 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
32cc0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
32cd0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
32ce0 2a 0a 2a 2a 20 20 20 20 20 20 72 65 6d 6f 76 65  *.**      remove
32cf0 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43  _win32_dir DIREC
32d00 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  TORY.**.** Remov
32d10 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
32d20 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73   directory, whos
32d30 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
32d40 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65  d name may excee
32d50 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74  d 248.** charact
32d60 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65  ers if it is pre
32d70 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c  fixed with "\\?\
32d80 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
32d90 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77   SQLITE_TCLAPI w
32da0 69 6e 33 32 5f 72 6d 64 69 72 28 0a 20 20 76 6f  in32_rmdir(.  vo
32db0 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
32dc0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
32dd0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
32de0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
32df0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
32e00 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
32e10 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
32e20 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
32e30 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29  jv, "DIRECTORY")
32e40 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
32e50 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
32e60 28 20 21 52 65 6d 6f 76 65 44 69 72 65 63 74 6f  ( !RemoveDirecto
32e70 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f  ryW(Tcl_GetUnico
32e80 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a  de(objv[1])) ){.
32e90 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
32ea0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
32eb0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
32ec0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
32ed0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
32ee0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
32ef0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
32f00 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
32f10 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
32f20 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74  ../*.**      opt
32f30 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f  imization_contro
32f40 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e  l DB OPT BOOLEAN
32f50 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  .**.** Enable or
32f60 20 64 69 73 61 62 6c 65 20 71 75 65 72 79 20 6f   disable query o
32f70 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69  ptimizations usi
32f80 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  ng the sqlite3_t
32f90 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a  est_control().**
32fa0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 44 69 73   interface.  Dis
32fb0 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20  able if BOOLEAN 
32fc0 69 73 20 66 61 6c 73 65 20 61 6e 64 20 65 6e 61  is false and ena
32fd0 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69  ble if BOOLEAN i
32fe0 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69  s true..** OPT i
32ff0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
33000 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74  e optimization t
33010 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a  o be disabled..*
33020 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
33030 49 54 45 5f 54 43 4c 41 50 49 20 6f 70 74 69 6d  ITE_TCLAPI optim
33040 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28  ization_control(
33050 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
33060 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
33070 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
33080 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
33090 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
330a0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
330b0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
330c0 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20  st char *zOpt;. 
330d0 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e   int onoff;.  in
330e0 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 73 74  t mask = 0;.  st
330f0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
33100 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
33110 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20  ar *zOptName;.  
33120 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20    int mask;.  } 
33130 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aOpt[] = {.    {
33140 20 22 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20   "all",         
33150 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41          SQLITE_A
33160 6c 6c 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c  llOpts        },
33170 0a 20 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20 20  .    { "none",  
33180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
33190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
331a0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 75      },.    { "qu
331b0 65 72 79 2d 66 6c 61 74 74 65 6e 65 72 22 2c 20  ery-flattener", 
331c0 20 20 20 20 53 51 4c 49 54 45 5f 51 75 65 72 79      SQLITE_Query
331d0 46 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20 20  Flattener },.   
331e0 20 7b 20 22 67 72 6f 75 70 62 79 2d 6f 72 64 65   { "groupby-orde
331f0 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  r",       SQLITE
33200 5f 47 72 6f 75 70 42 79 4f 72 64 65 72 20 20 20  _GroupByOrder   
33210 7d 2c 0a 20 20 20 20 7b 20 22 66 61 63 74 6f 72  },.    { "factor
33220 2d 63 6f 6e 73 74 61 6e 74 73 22 2c 20 20 20 20  -constants",    
33230 53 51 4c 49 54 45 5f 46 61 63 74 6f 72 4f 75 74  SQLITE_FactorOut
33240 43 6f 6e 73 74 20 7d 2c 0a 20 20 20 20 7b 20 22  Const },.    { "
33250 64 69 73 74 69 6e 63 74 2d 6f 70 74 22 2c 20 20  distinct-opt",  
33260 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 69 73        SQLITE_Dis
33270 74 69 6e 63 74 4f 70 74 20 20 20 20 7d 2c 0a 20  tinctOpt    },. 
33280 20 20 20 7b 20 22 63 6f 76 65 72 2d 69 64 78 2d     { "cover-idx-
33290 73 63 61 6e 22 2c 20 20 20 20 20 20 53 51 4c 49  scan",      SQLI
332a0 54 45 5f 43 6f 76 65 72 49 64 78 53 63 61 6e 20  TE_CoverIdxScan 
332b0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 72 64 65    },.    { "orde
332c0 72 2d 62 79 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20  r-by-idx-join", 
332d0 20 20 53 51 4c 49 54 45 5f 4f 72 64 65 72 42 79    SQLITE_OrderBy
332e0 49 64 78 4a 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b  IdxJoin },.    {
332f0 20 22 74 72 61 6e 73 69 74 69 76 65 22 2c 20 20   "transitive",  
33300 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
33310 72 61 6e 73 69 74 69 76 65 20 20 20 20 20 7d 2c  ransitive     },
33320 0a 20 20 20 20 7b 20 22 6f 6d 69 74 2d 6e 6f 6f  .    { "omit-noo
33330 70 2d 6a 6f 69 6e 22 2c 20 20 20 20 20 20 53 51  p-join",      SQ
33340 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69  LITE_OmitNoopJoi
33350 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74  n   },.    { "st
33360 61 74 34 22 2c 20 20 20 20 20 20 20 20 20 20 20  at4",           
33370 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74 34      SQLITE_Stat4
33380 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
33390 20 7b 20 22 73 6b 69 70 2d 73 63 61 6e 22 2c 20   { "skip-scan", 
333a0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
333b0 5f 53 6b 69 70 53 63 61 6e 20 20 20 20 20 20 20  _SkipScan       
333c0 7d 2c 0a 20 20 20 20 7b 20 22 70 75 73 68 2d 64  },.    { "push-d
333d0 6f 77 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  own",           
333e0 53 51 4c 49 54 45 5f 50 75 73 68 44 6f 77 6e 20  SQLITE_PushDown 
333f0 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20        },.  };.. 
33400 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
33410 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
33420 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
33430 6f 62 6a 76 2c 20 22 44 42 20 4f 50 54 20 42 4f  objv, "DB OPT BO
33440 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74  OLEAN");.    ret
33450 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
33460 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
33470 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
33480 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
33490 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
334a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
334b0 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
334c0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
334d0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f  p, objv[3], &ono
334e0 66 66 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ff) ) return TCL
334f0 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d  _ERROR;.  zOpt =
33500 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
33510 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[2]);.  for(i
33520 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70  =0; i<sizeof(aOp
33530 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30  t)/sizeof(aOpt[0
33540 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
33550 28 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61  ( strcmp(zOpt, a
33560 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29  Opt[i].zOptName)
33570 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 73  ==0 ){.      mas
33580 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b  k = aOpt[i].mask
33590 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
335a0 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
335b0 6e 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d  noff ) mask = ~m
335c0 61 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69  ask;.  if( i>=si
335d0 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f  zeof(aOpt)/sizeo
335e0 66 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20  f(aOpt[0]) ){.  
335f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
33600 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
33610 6f 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  own optimization
33620 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65   - should be one
33630 20 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20 20 20   of:",.         
33640 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
33650 72 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  r*)0);.    for(i
33660 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70  =0; i<sizeof(aOp
33670 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30  t)/sizeof(aOpt[0
33680 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
33690 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
336a0 28 69 6e 74 65 72 70 2c 20 22 20 22 2c 20 61 4f  (interp, " ", aO
336b0 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c 20  pt[i].zOptName, 
336c0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d  (char*)0);.    }
336d0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
336e0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
336f0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
33700 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
33710 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
33720 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65   db, mask);.  re
33730 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
33740 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73  /*.**     load_s
33750 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20  tatic_extension 
33760 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a  DB NAME ....**.*
33770 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f  * Load one or mo
33780 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  re statically li
33790 6e 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e  nked extensions.
337a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
337b0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 63 6c  QLITE_TCLAPI tcl
337c0 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e 73  LoadStaticExtens
337d0 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a  ionCmd(.  void *
337e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
337f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
33800 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
33810 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
33820 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65  objv[].){.  exte
33830 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 61  rn int sqlite3_a
33840 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c 69 74  match_init(sqlit
33850 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
33860 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
33870 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
33880 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 61  n int sqlite3_ca
33890 72 72 61 79 5f 69 6e 69 74 28 73 71 6c 69 74 65  rray_init(sqlite
338a0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
338b0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
338c0 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
338d0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f   int sqlite3_clo
338e0 73 75 72 65 5f 69 6e 69 74 28 73 71 6c 69 74 65  sure_init(sqlite
338f0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
33900 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
33910 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
33920 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 73 76   int sqlite3_csv
33930 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
33940 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
33950 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
33960 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  *);.  extern int
33970 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e   sqlite3_eval_in
33980 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
33990 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
339a0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
339b0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
339c0 6c 69 74 65 33 5f 65 78 70 6c 61 69 6e 5f 69 6e  lite3_explain_in
339d0 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
339e0 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
339f0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
33a00 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
33a10 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69  lite3_fileio_ini
33a20 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
33a30 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
33a40 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
33a50 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
33a60 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74  ite3_fuzzer_init
33a70 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
33a80 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
33a90 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
33aa0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
33ab0 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 28 73 71  te3_ieee_init(sq
33ac0 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
33ad0 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
33ae0 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
33af0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
33b00 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 28 73  _nextchar_init(s
33b10 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
33b20 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
33b30 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
33b40 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
33b50 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69  3_percentile_ini
33b60 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
33b70 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
33b80 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
33b90 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
33ba0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
33bb0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
33bc0 6c 69 74 65 33 5f 70 72 65 66 69 78 65 73 5f 69  lite3_prefixes_i
33bd0 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
33be0 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
33bf0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
33c00 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72  ;.#endif.  exter
33c10 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65  n int sqlite3_re
33c20 67 65 78 70 5f 69 6e 69 74 28 73 71 6c 69 74 65  gexp_init(sqlite
33c30 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
33c40 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
33c50 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
33c60 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6d   int sqlite3_rem
33c70 65 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c 69 74  ember_init(sqlit
33c80 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
33c90 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
33ca0 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
33cb0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
33cc0 72 69 65 73 5f 69 6e 69 74 28 73 71 6c 69 74 65  ries_init(sqlite
33cd0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
33ce0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
33cf0 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
33d00 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 70 65   int sqlite3_spe
33d10 6c 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c 69 74  llfix_init(sqlit
33d20 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
33d30 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
33d40 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
33d50 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  n int sqlite3_to
33d60 74 79 70 65 5f 69 6e 69 74 28 73 71 6c 69 74 65  type_init(sqlite
33d70 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
33d80 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
33d90 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
33da0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 6f   int sqlite3_who
33db0 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28 73 71  lenumber_init(sq
33dc0 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
33dd0 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
33de0 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
33df0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
33e00 5f 75 6e 69 6f 6e 76 74 61 62 5f 69 6e 69 74 28  _unionvtab_init(
33e10 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
33e20 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
33e30 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 23 69  i_routines*);.#i
33e40 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45  fdef SQLITE_HAVE
33e50 5f 5a 4c 49 42 0a 20 20 65 78 74 65 72 6e 20 69  _ZLIB.  extern i
33e60 6e 74 20 73 71 6c 69 74 65 33 5f 7a 69 70 66 69  nt sqlite3_zipfi
33e70 6c 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  le_init(sqlite3*
33e80 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
33e90 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
33ea0 65 73 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 73  es*);.#endif.  s
33eb0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
33ec0 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
33ed0 68 61 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20  har *zExtName;. 
33ee0 20 20 20 69 6e 74 20 28 2a 70 49 6e 69 74 29 28     int (*pInit)(
33ef0 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
33f00 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
33f10 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
33f20 7d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d  } aExtension[] =
33f30 20 7b 0a 20 20 20 20 7b 20 22 61 6d 61 74 63 68   {.    { "amatch
33f40 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
33f50 20 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68    sqlite3_amatch
33f60 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
33f70 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 61      },.    { "ca
33f80 72 72 61 79 22 2c 20 20 20 20 20 20 20 20 20 20  rray",          
33f90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 61        sqlite3_ca
33fa0 72 72 61 79 5f 69 6e 69 74 20 20 20 20 20 20 20  rray_init       
33fb0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
33fc0 20 22 63 6c 6f 73 75 72 65 22 2c 20 20 20 20 20   "closure",     
33fd0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33fe0 33 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20  3_closure_init  
33ff0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
34000 20 20 20 7b 20 22 63 73 76 22 2c 20 20 20 20 20     { "csv",     
34010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
34020 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69 74 20 20  lite3_csv_init  
34030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34040 7d 2c 0a 20 20 20 20 7b 20 22 65 76 61 6c 22 2c  },.    { "eval",
34050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34060 20 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69    sqlite3_eval_i
34070 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
34080 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78      },.    { "ex
34090 70 6c 61 69 6e 22 2c 20 20 20 20 20 20 20 20 20  plain",         
340a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
340b0 70 6c 61 69 6e 5f 69 6e 69 74 20 20 20 20 20 20  plain_init      
340c0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
340d0 20 22 66 69 6c 65 69 6f 22 2c 20 20 20 20 20 20   "fileio",      
340e0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
340f0 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 20 20 20  3_fileio_init   
34100 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
34110 20 20 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20     { "fuzzer",  
34120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
34130 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69  lite3_fuzzer_ini
34140 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
34150 7d 2c 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35  },.    { "ieee75
34160 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  4",             
34170 20 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69    sqlite3_ieee_i
34180 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
34190 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65      },.    { "ne
341a0 78 74 63 68 61 72 22 2c 20 20 20 20 20 20 20 20  xtchar",        
341b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65        sqlite3_ne
341c0 78 74 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20  xtchar_init     
341d0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
341e0 20 22 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20   "percentile",  
341f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
34200 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69  3_percentile_ini
34210 74 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23  t           },.#
34220 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
34230 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
34240 20 20 20 20 7b 20 22 70 72 65 66 69 78 65 73 22      { "prefixes"
34250 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,              s
34260 71 6c 69 74 65 33 5f 70 72 65 66 69 78 65 73 5f  qlite3_prefixes_
34270 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
34280 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b   },.#endif.    {
34290 20 22 72 65 67 65 78 70 22 2c 20 20 20 20 20 20   "regexp",      
342a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
342b0 33 5f 72 65 67 65 78 70 5f 69 6e 69 74 20 20 20  3_regexp_init   
342c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
342d0 20 20 20 7b 20 22 72 65 6d 65 6d 62 65 72 22 2c     { "remember",
342e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
342f0 6c 69 74 65 33 5f 72 65 6d 65 6d 62 65 72 5f 69  lite3_remember_i
34300 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
34310 7d 2c 0a 20 20 20 20 7b 20 22 73 65 72 69 65 73  },.    { "series
34320 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
34330 20 20 73 71 6c 69 74 65 33 5f 73 65 72 69 65 73    sqlite3_series
34340 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
34350 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 70      },.    { "sp
34360 65 6c 6c 66 69 78 22 2c 20 20 20 20 20 20 20 20  ellfix",        
34370 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 70        sqlite3_sp
34380 65 6c 6c 66 69 78 5f 69 6e 69 74 20 20 20 20 20  ellfix_init     
34390 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
343a0 20 22 74 6f 74 79 70 65 22 2c 20 20 20 20 20 20   "totype",      
343b0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
343c0 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74 20 20 20  3_totype_init   
343d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
343e0 20 20 20 7b 20 22 75 6e 69 6f 6e 76 74 61 62 22     { "unionvtab"
343f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,             sq
34400 6c 69 74 65 33 5f 75 6e 69 6f 6e 76 74 61 62 5f  lite3_unionvtab_
34410 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
34420 7d 2c 0a 20 20 20 20 7b 20 22 77 68 6f 6c 65 6e  },.    { "wholen
34430 75 6d 62 65 72 22 2c 20 20 20 20 20 20 20 20 20  umber",         
34440 20 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c 65 6e    sqlite3_wholen
34450 75 6d 62 65 72 5f 69 6e 69 74 20 20 20 20 20 20  umber_init      
34460 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 53 51      },.#ifdef SQ
34470 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20  LITE_HAVE_ZLIB. 
34480 20 20 20 7b 20 22 7a 69 70 66 69 6c 65 22 2c 20     { "zipfile", 
34490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
344a0 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e  lite3_zipfile_in
344b0 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
344c0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20  },.#endif.  };. 
344d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
344e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
344f0 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 72  e;.  int i, j, r
34500 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
34510 73 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62  sg = 0;.  if( ob
34520 6a 63 3c 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  jc<3 ){.    Tcl_
34530 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
34540 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
34550 42 20 4e 41 4d 45 20 2e 2e 2e 22 29 3b 0a 20 20  B NAME ...");.  
34560 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
34570 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
34580 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
34590 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
345a0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
345b0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
345c0 4f 52 3b 0a 20 20 66 6f 72 28 6a 3d 32 3b 20 6a  OR;.  for(j=2; j
345d0 3c 6f 62 6a 63 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <objc; j++){.   
345e0 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
345f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6a 5d 29 3b  String(objv[j]);
34600 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
34610 41 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e  ArraySize(aExten
34620 73 69 6f 6e 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  sion); i++){.   
34630 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4e     if( strcmp(zN
34640 61 6d 65 2c 20 61 45 78 74 65 6e 73 69 6f 6e 5b  ame, aExtension[
34650 69 5d 2e 7a 45 78 74 4e 61 6d 65 29 3d 3d 30 20  i].zExtName)==0 
34660 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20  ) break;.    }. 
34670 20 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53     if( i>=ArrayS
34680 69 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e 29 20  ize(aExtension) 
34690 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
346a0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
346b0 2c 20 22 6e 6f 20 73 75 63 68 20 65 78 74 65 6e  , "no such exten
346c0 73 69 6f 6e 3a 20 22 2c 20 7a 4e 61 6d 65 2c 20  sion: ", zName, 
346d0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 20  (char*)0);.     
346e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
346f0 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
34700 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d 2e 70   aExtension[i].p
34710 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 72 63  Init ){.      rc
34720 20 3d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69 5d   = aExtension[i]
34730 2e 70 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72  .pInit(db, &zErr
34740 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  Msg, 0);.    }el
34750 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
34760 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
34770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34780 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67  TE_OK || zErrMsg
34790 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70   ){.      Tcl_Ap
347a0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
347b0 70 2c 20 22 69 6e 69 74 69 61 6c 69 7a 61 74 69  p, "initializati
347c0 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20  on of ", zName, 
347d0 22 20 66 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72  " failed: ", zEr
347e0 72 4d 73 67 2c 0a 20 20 20 20 20 20 20 20 20 20  rMsg,.          
347f0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68               (ch
34800 61 72 2a 29 30 29 3b 0a 20 20 20 20 20 20 73 71  ar*)0);.      sq
34810 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
34820 73 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  sg);.      retur
34830 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
34840 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
34850 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
34860 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65 73 74       sorter_test
34870 5f 66 61 6b 65 68 65 61 70 20 42 4f 4f 4c 0a 2a  _fakeheap BOOL.*
34880 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  *.*/.static int 
34890 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 6f  SQLITE_TCLAPI so
348a0 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65  rter_test_fakehe
348b0 61 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ap(.  void * cli
348c0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
348d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
348e0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
348f0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
34900 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 62 41 72 67  [].){.  int bArg
34910 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
34920 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
34930 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
34940 31 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 22 29  1, objv, "BOOL")
34950 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
34960 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
34970 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  f( Tcl_GetBoolea
34980 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
34990 20 6f 62 6a 76 5b 31 5d 2c 20 26 62 41 72 67 29   objv[1], &bArg)
349a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
349b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
349c0 20 69 66 28 20 62 41 72 67 20 29 7b 0a 20 20 20   if( bArg ){.   
349d0 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
349e0 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d  alConfig.pHeap==
349f0 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
34a00 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
34a10 48 65 61 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e  Heap = SQLITE_IN
34a20 54 5f 54 4f 5f 50 54 52 28 2d 31 29 3b 0a 20 20  T_TO_PTR(-1);.  
34a30 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
34a40 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
34a50 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d  alConfig.pHeap==
34a60 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
34a70 52 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 73  R(-1) ){.      s
34a80 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
34a90 69 67 2e 70 48 65 61 70 20 3d 20 30 3b 0a 20 20  ig.pHeap = 0;.  
34aa0 20 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52    }.  }..  Tcl_R
34ab0 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
34ac0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
34ad0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  _OK;.}../*.**   
34ae0 20 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f    sorter_test_so
34af0 72 74 34 5f 68 65 6c 70 65 72 20 44 42 20 53 51  rt4_helper DB SQ
34b00 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 0a 2a 2a  L1 NSTEP SQL2.**
34b10 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 53 51 4c 20  .** Compile SQL 
34b20 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c 31 20  statement $SQL1 
34b30 61 6e 64 20 73 74 65 70 20 69 74 20 24 4e 53 54  and step it $NST
34b40 45 50 20 74 69 6d 65 73 2e 20 46 6f 72 20 65 61  EP times. For ea
34b50 63 68 20 72 6f 77 2c 20 0a 2a 2a 20 63 68 65 63  ch row, .** chec
34b60 6b 20 74 68 61 74 20 74 68 65 20 6c 65 66 74 6d  k that the leftm
34b70 6f 73 74 20 61 6e 64 20 72 69 67 68 74 6d 6f 73  ost and rightmos
34b80 74 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e  t columns return
34b90 65 64 20 61 72 65 20 62 6f 74 68 20 69 6e 74 65  ed are both inte
34ba0 67 65 72 73 2c 0a 2a 2a 20 61 6e 64 20 74 68 61  gers,.** and tha
34bb0 74 20 62 6f 74 68 20 63 6f 6e 74 61 69 6e 20 74  t both contain t
34bc0 68 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 0a 2a  he same value..*
34bd0 2a 0a 2a 2a 20 54 68 65 6e 20 65 78 65 63 75 74  *.** Then execut
34be0 65 20 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c  e statement $SQL
34bf0 32 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  2. Check that th
34c00 65 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75  e statement retu
34c10 72 6e 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20  rns the same.** 
34c20 73 65 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20  set of integers 
34c30 69 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65  in the same orde
34c40 72 20 61 73 20 69 6e 20 74 68 65 20 70 72 65 76  r as in the prev
34c50 69 6f 75 73 20 73 74 65 70 20 28 75 73 69 6e 67  ious step (using
34c60 20 24 53 51 4c 31 29 2e 0a 2a 2f 0a 73 74 61 74   $SQL1)..*/.stat
34c70 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
34c80 4c 41 50 49 20 73 6f 72 74 65 72 5f 74 65 73 74  LAPI sorter_test
34c90 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 28 0a 20  _sort4_helper(. 
34ca0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
34cb0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
34cc0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
34cd0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
34ce0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
34cf0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
34d00 53 71 6c 31 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Sql1;.  const ch
34d10 61 72 20 2a 7a 53 71 6c 32 3b 0a 20 20 69 6e 74  ar *zSql2;.  int
34d20 20 6e 53 74 65 70 3b 20 0a 20 20 69 6e 74 20 69   nStep; .  int i
34d30 53 74 65 70 3b 20 0a 20 20 75 6e 73 69 67 6e 65  Step; .  unsigne
34d40 64 20 69 6e 74 20 69 43 6b 73 75 6d 31 20 3d 20  d int iCksum1 = 
34d50 30 3b 20 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  0; .  unsigned i
34d60 6e 74 20 69 43 6b 73 75 6d 32 20 3d 20 30 3b 20  nt iCksum2 = 0; 
34d70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
34d80 20 69 42 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   iB;.  sqlite3 *
34d90 64 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  db;.  sqlite3_st
34da0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 0a 20 20  mt *pStmt;.  .  
34db0 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
34dc0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
34dd0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
34de0 62 6a 76 2c 20 22 44 42 20 53 51 4c 31 20 4e 53  bjv, "DB SQL1 NS
34df0 54 45 50 20 53 51 4c 32 22 29 3b 0a 20 20 20 20  TEP SQL2");.    
34e00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
34e10 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
34e20 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
34e30 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
34e40 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
34e50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
34e60 52 3b 0a 20 20 7a 53 71 6c 31 20 3d 20 54 63 6c  R;.  zSql1 = Tcl
34e70 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
34e80 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
34e90 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
34ea0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
34eb0 53 74 65 70 29 20 29 20 72 65 74 75 72 6e 20 54  Step) ) return T
34ec0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
34ed0 32 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  2 = Tcl_GetStrin
34ee0 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 72  g(objv[4]);..  r
34ef0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
34f00 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 31  are_v2(db, zSql1
34f10 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
34f20 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
34f30 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c  TE_OK ) goto sql
34f40 5f 65 72 72 6f 72 3b 0a 0a 20 20 69 42 20 3d 20  _error;..  iB = 
34f50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
34f60 6f 75 6e 74 28 70 53 74 6d 74 29 2d 31 3b 0a 20  ount(pStmt)-1;. 
34f70 20 66 6f 72 28 69 53 74 65 70 3d 30 3b 20 69 53   for(iStep=0; iS
34f80 74 65 70 3c 6e 53 74 65 70 20 26 26 20 53 51 4c  tep<nStep && SQL
34f90 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
34fa0 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53  _step(pStmt); iS
34fb0 74 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  tep++){.    int 
34fc0 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  a = sqlite3_colu
34fd0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
34fe0 3b 0a 20 20 20 20 69 66 28 20 61 21 3d 73 71 6c  ;.    if( a!=sql
34ff0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
35000 70 53 74 6d 74 2c 20 69 42 29 20 29 7b 0a 20 20  pStmt, iB) ){.  
35010 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
35020 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 61  sult(interp, "da
35030 74 61 20 65 72 72 6f 72 3a 20 28 61 21 3d 62 29  ta error: (a!=b)
35040 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74  ", 0);.      ret
35050 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
35060 20 20 20 7d 0a 0a 20 20 20 20 69 43 6b 73 75 6d     }..    iCksum
35070 31 20 2b 3d 20 28 69 43 6b 73 75 6d 31 20 3c 3c  1 += (iCksum1 <<
35080 20 33 29 20 2b 20 28 75 6e 73 69 67 6e 65 64 20   3) + (unsigned 
35090 69 6e 74 29 61 3b 0a 20 20 7d 0a 20 20 72 63 20  int)a;.  }.  rc 
350a0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
350b0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
350c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
350d0 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b   goto sql_error;
350e0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
350f0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
35100 7a 53 71 6c 32 2c 20 2d 31 2c 20 26 70 53 74 6d  zSql2, -1, &pStm
35110 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
35120 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
35130 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 20 20 66  o sql_error;.  f
35140 6f 72 28 69 53 74 65 70 3d 30 3b 20 53 51 4c 49  or(iStep=0; SQLI
35150 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
35160 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53 74  step(pStmt); iSt
35170 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61  ep++){.    int a
35180 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
35190 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
351a0 0a 20 20 20 20 69 43 6b 73 75 6d 32 20 2b 3d 20  .    iCksum2 += 
351b0 28 69 43 6b 73 75 6d 32 20 3c 3c 20 33 29 20 2b  (iCksum2 << 3) +
351c0 20 28 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 61   (unsigned int)a
351d0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
351e0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
351f0 74 6d 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  tmt);.  if( rc!=
35200 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
35210 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69   sql_error;..  i
35220 66 28 20 69 43 6b 73 75 6d 31 21 3d 69 43 6b 73  f( iCksum1!=iCks
35230 75 6d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  um2 ){.    Tcl_A
35240 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
35250 72 70 2c 20 22 63 68 65 63 6b 73 75 6d 20 6d 69  rp, "checksum mi
35260 73 6d 61 74 63 68 22 2c 20 30 29 3b 0a 20 20 20  smatch", 0);.   
35270 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
35280 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
35290 20 54 43 4c 5f 4f 4b 3b 0a 20 73 71 6c 5f 65 72   TCL_OK;. sql_er
352a0 72 6f 72 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ror:.  Tcl_Appen
352b0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
352c0 22 73 71 6c 20 65 72 72 6f 72 3a 20 22 2c 20 73  "sql error: ", s
352d0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
352e0 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  ), 0);.  return 
352f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 0a 23  TCL_ERROR;.}...#
35300 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45  ifdef SQLITE_USE
35310 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
35320 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
35330 65 33 75 73 65 72 61 75 74 68 2e 68 22 0a 2f 2a  e3userauth.h"./*
35340 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
35350 69 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e  ite3_user_authen
35360 74 69 63 61 74 65 20 44 42 20 55 53 45 52 4e 41  ticate DB USERNA
35370 4d 45 20 50 41 53 53 57 4f 52 44 0a 2a 2f 0a 73  ME PASSWORD.*/.s
35380 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
35390 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73 65  _TCLAPI test_use
353a0 72 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28 0a  r_authenticate(.
353b0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
353c0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
353d0 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
353e0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
353f0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
35400 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
35410 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
35420 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
35430 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
35440 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
35450 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
35460 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
35470 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
35480 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
35490 20 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63   *zUser = 0;.  c
354a0 68 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30  har *zPasswd = 0
354b0 3b 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20  ;.  int nPasswd 
354c0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
354d0 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
354e0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
354f0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
35500 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
35510 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41  objv, "DB USERNA
35520 4d 45 20 50 41 53 53 57 4f 52 44 22 29 3b 0a 20  ME PASSWORD");. 
35530 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
35540 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
35550 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
35560 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
35570 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
35580 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
35590 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
355a0 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53  zUser = Tcl_GetS
355b0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
355c0 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f    zPasswd = Tcl_
355d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
355e0 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73  (objv[3], &nPass
355f0 77 64 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  wd);.  rc = sqli
35600 74 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  te3_user_authent
35610 69 63 61 74 65 28 64 62 2c 20 7a 55 73 65 72 2c  icate(db, zUser,
35620 20 7a 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77   zPasswd, nPassw
35630 64 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  d);.  Tcl_SetRes
35640 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
35650 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
35660 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
35670 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
35680 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
35690 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
356a0 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  NTICATION */..#i
356b0 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
356c0 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
356d0 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
356e0 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 64 64 20  qlite3_user_add 
356f0 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53  DB USERNAME PASS
35700 57 4f 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a  WORD ISADMIN.*/.
35710 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
35720 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73  E_TCLAPI test_us
35730 65 72 5f 61 64 64 28 0a 20 20 43 6c 69 65 6e 74  er_add(.  Client
35740 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
35750 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
35760 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
35770 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
35780 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
35790 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
357a0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
357b0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
357c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
357d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
357e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
357f0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
35800 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
35810 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20  {.  char *zUser 
35820 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  = 0;.  char *zPa
35830 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sswd = 0;.  int 
35840 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69  nPasswd = 0;.  i
35850 6e 74 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a  nt isAdmin = 0;.
35860 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
35870 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
35880 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  objc!=5 ){.    T
35890 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
358a0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
358b0 20 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41   "DB USERNAME PA
358c0 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 22 29  SSWORD ISADMIN")
358d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
358e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
358f0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
35900 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
35910 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
35920 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
35930 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
35940 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47  .  zUser = Tcl_G
35950 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
35960 29 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d 20 54  );.  zPasswd = T
35970 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
35980 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50  Obj(objv[3], &nP
35990 61 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65  asswd);.  Tcl_Ge
359a0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
359b0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
359c0 20 26 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63   &isAdmin);.  rc
359d0 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
359e0 61 64 64 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a  add(db, zUser, z
359f0 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c  Passwd, nPasswd,
35a00 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c   isAdmin);.  Tcl
35a10 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
35a20 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
35a30 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
35a40 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
35a50 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
35a60 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45  if /* SQLITE_USE
35a70 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
35a80 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
35a90 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
35aa0 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  CATION./*.** tcl
35ab0 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73  cmd:  sqlite3_us
35ac0 65 72 5f 63 68 61 6e 67 65 20 44 42 20 55 53 45  er_change DB USE
35ad0 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49  RNAME PASSWORD I
35ae0 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63  SADMIN.*/.static
35af0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
35b00 50 49 20 74 65 73 74 5f 75 73 65 72 5f 63 68 61  PI test_user_cha
35b10 6e 67 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  nge(.  ClientDat
35b20 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
35b30 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
35b40 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
35b50 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
35b60 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
35b70 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
35b80 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
35b90 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
35ba0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
35bb0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
35bc0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
35bd0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
35be0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
35bf0 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30   char *zUser = 0
35c00 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77  ;.  char *zPassw
35c10 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61  d = 0;.  int nPa
35c20 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20  sswd = 0;.  int 
35c30 69 73 41 64 6d 69 6e 20 3d 20 30 3b 0a 20 20 73  isAdmin = 0;.  s
35c40 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
35c50 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
35c60 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=5 ){.    Tcl_
35c70 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
35c80 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
35c90 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57  B USERNAME PASSW
35ca0 4f 52 44 20 49 53 41 44 4d 49 4e 22 29 3b 0a 20  ORD ISADMIN");. 
35cb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
35cc0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
35cd0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
35ce0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
35cf0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
35d00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
35d10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
35d20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53  zUser = Tcl_GetS
35d30 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
35d40 20 20 7a 50 61 73 73 77 64 20 3d 20 54 63 6c 5f    zPasswd = Tcl_
35d50 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
35d60 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 50 61 73 73  (objv[3], &nPass
35d70 77 64 29 3b 0a 20 20 54 63 6c 5f 47 65 74 42 6f  wd);.  Tcl_GetBo
35d80 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
35d90 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 69  erp, objv[4], &i
35da0 73 41 64 6d 69 6e 29 3b 0a 20 20 72 63 20 3d 20  sAdmin);.  rc = 
35db0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61  sqlite3_user_cha
35dc0 6e 67 65 28 64 62 2c 20 7a 55 73 65 72 2c 20 7a  nge(db, zUser, z
35dd0 50 61 73 73 77 64 2c 20 6e 50 61 73 73 77 64 2c  Passwd, nPasswd,
35de0 20 69 73 41 64 6d 69 6e 29 3b 0a 20 20 54 63 6c   isAdmin);.  Tcl
35df0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
35e00 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
35e10 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
35e20 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
35e30 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
35e40 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45  if /* SQLITE_USE
35e50 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
35e60 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
35e70 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
35e80 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  CATION./*.** tcl
35e90 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73  cmd:  sqlite3_us
35ea0 65 72 5f 64 65 6c 65 74 65 20 44 42 20 55 53 45  er_delete DB USE
35eb0 52 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20  RNAME.*/.static 
35ec0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
35ed0 49 20 74 65 73 74 5f 75 73 65 72 5f 64 65 6c 65  I test_user_dele
35ee0 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
35ef0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
35f00 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
35f10 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
35f20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
35f30 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
35f40 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
35f50 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
35f60 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
35f70 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
35f80 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
35f90 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
35fa0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
35fb0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
35fc0 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
35fd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
35fe0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
35ff0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
36000 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
36010 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
36020 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 22 29  , "DB USERNAME")
36030 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
36040 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
36050 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
36060 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
36070 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
36080 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
36090 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
360a0 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f 47  .  zUser = Tcl_G
360b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
360c0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
360d0 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 64 62  3_user_delete(db
360e0 2c 20 7a 55 73 65 72 29 3b 0a 20 20 54 63 6c 5f  , zUser);.  Tcl_
360f0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
36100 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f  , (char *)t1Erro
36110 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53  rName(rc), TCL_S
36120 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e  TATIC);.  return
36130 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69   TCL_OK;.}.#endi
36140 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52  f /* SQLITE_USER
36150 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20  _AUTHENTICATION 
36160 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  */../*.** tclcmd
36170 3a 20 62 61 64 5f 62 65 68 61 76 69 6f 72 20 54  : bad_behavior T
36180 59 50 45 0a 2a 2a 0a 2a 2a 20 44 6f 20 73 6f 6d  YPE.**.** Do som
36190 65 20 74 68 69 6e 67 73 20 74 68 61 74 20 73 68  e things that sh
361a0 6f 75 6c 64 20 74 72 69 67 67 65 72 20 61 20 76  ould trigger a v
361b0 61 6c 67 72 69 6e 64 20 6f 72 20 2d 66 73 61 6e  algrind or -fsan
361c0 69 74 69 7a 65 3d 75 6e 64 65 66 69 6e 65 64 0a  itize=undefined.
361d0 2a 2a 20 77 61 72 6e 69 6e 67 2e 20 20 54 68 69  ** warning.  Thi
361e0 73 20 69 73 20 75 73 65 64 20 74 6f 20 76 65 72  s is used to ver
361f0 69 66 79 20 74 68 61 74 20 65 72 72 6f 72 73 20  ify that errors 
36200 61 6e 64 20 77 61 72 6e 69 6e 67 73 20 6f 75 74  and warnings out
36210 70 75 74 20 62 79 20 74 68 6f 73 65 0a 2a 2a 20  put by those.** 
36220 74 6f 6f 6c 73 20 61 72 65 20 64 65 74 65 63 74  tools are detect
36230 65 64 20 62 79 20 74 68 65 20 74 65 73 74 20 73  ed by the test s
36240 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  cripts..**.**   
36250 20 20 20 20 54 59 50 45 20 20 20 20 20 20 20 42      TYPE       B
36260 45 48 41 56 49 4f 52 0a 2a 2a 20 20 20 20 20 20  EHAVIOR.**      
36270 20 31 20 20 20 20 20 20 20 20 20 20 4f 76 65 72   1          Over
36280 66 6c 6f 77 20 61 20 73 69 67 6e 65 64 20 69 6e  flow a signed in
36290 74 65 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 32  teger.**       2
362a0 20 20 20 20 20 20 20 20 20 20 4a 75 6d 70 20 62            Jump b
362b0 61 73 65 64 20 6f 6e 20 61 6e 20 75 6e 69 6e 69  ased on an unini
362c0 74 69 61 6c 69 7a 65 64 20 76 61 72 69 61 62 6c  tialized variabl
362d0 65 0a 2a 2a 20 20 20 20 20 20 20 33 20 20 20 20  e.**       3    
362e0 20 20 20 20 20 20 52 65 61 64 20 61 66 74 65 72        Read after
362f0 20 66 72 65 65 0a 2a 2a 20 20 20 20 20 20 20 34   free.**       4
36300 20 20 20 20 20 20 20 20 20 20 50 61 6e 69 63 0a            Panic.
36310 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
36320 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
36330 5f 62 61 64 5f 62 65 68 61 76 69 6f 72 28 0a 20  _bad_behavior(. 
36340 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
36350 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
36360 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  er to an integer
36370 20 63 6f 6e 74 61 69 6e 69 6e 67 20 7a 65 72 6f   containing zero
36380 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
36390 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
363a0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
363b0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
363c0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
363d0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
363e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
363f0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
36400 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
36410 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
36420 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
36430 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 54  s */.){.  int iT
36440 79 70 65 3b 0a 20 20 69 6e 74 20 78 79 7a 3b 0a  ype;.  int xyz;.
36450 20 20 69 6e 74 20 69 20 3d 20 2a 28 69 6e 74 2a    int i = *(int*
36460 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  )clientData;.  i
36470 6e 74 20 6a 3b 0a 20 20 69 6e 74 20 77 5b 31 30  nt j;.  int w[10
36480 5d 3b 0a 20 20 69 6e 74 20 2a 61 3b 0a 20 20 69  ];.  int *a;.  i
36490 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
364a0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
364b0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
364c0 6a 76 2c 20 22 54 59 50 45 22 29 3b 0a 20 20 20  jv, "TYPE");.   
364d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
364e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c  R;.  }.  if( Tcl
364f0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
36500 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
36510 26 69 54 79 70 65 29 20 29 20 72 65 74 75 72 6e  &iType) ) return
36520 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 77   TCL_ERROR;.  sw
36530 69 74 63 68 28 20 69 54 79 70 65 20 29 7b 0a 20  itch( iType ){. 
36540 20 20 20 63 61 73 65 20 31 3a 20 7b 0a 20 20 20     case 1: {.   
36550 20 20 20 78 79 7a 20 3d 20 30 78 37 66 66 66 66     xyz = 0x7ffff
36560 66 30 30 20 2d 20 69 3b 0a 20 20 20 20 20 20 78  f00 - i;.      x
36570 79 7a 20 2b 3d 20 30 78 31 30 30 3b 0a 20 20 20  yz += 0x100;.   
36580 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
36590 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
365a0 4e 65 77 49 6e 74 4f 62 6a 28 78 79 7a 29 29 3b  NewIntObj(xyz));
365b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
365c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 32 3a 20    }.    case 2: 
365d0 7b 0a 20 20 20 20 20 20 77 5b 31 5d 20 3d 20 35  {.      w[1] = 5
365e0 3b 0a 20 20 20 20 20 20 69 66 28 20 77 5b 69 5d  ;.      if( w[i]
365f0 3e 30 20 29 20 77 5b 31 5d 2b 2b 3b 0a 20 20 20  >0 ) w[1]++;.   
36600 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
36610 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
36620 4e 65 77 49 6e 74 4f 62 6a 28 77 5b 31 5d 29 29  NewIntObj(w[1]))
36630 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
36640 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 33 3a     }.    case 3:
36650 20 7b 0a 20 20 20 20 20 20 61 20 3d 20 6d 61 6c   {.      a = mal
36660 6c 6f 63 28 20 73 69 7a 65 6f 66 28 69 6e 74 29  loc( sizeof(int)
36670 2a 31 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  *10 );.      for
36680 28 6a 3d 30 3b 20 6a 3c 31 30 3b 20 6a 2b 2b 29  (j=0; j<10; j++)
36690 20 61 5b 6a 5d 20 3d 20 6a 3b 0a 20 20 20 20 20   a[j] = j;.     
366a0 20 66 72 65 65 28 61 29 3b 0a 20 20 20 20 20 20   free(a);.      
366b0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
366c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
366d0 49 6e 74 4f 62 6a 28 61 5b 69 5d 29 29 3b 0a 20  IntObj(a[i]));. 
366e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
366f0 7d 0a 20 20 20 20 63 61 73 65 20 34 3a 20 7b 0a  }.    case 4: {.
36700 20 20 20 20 20 20 54 63 6c 5f 50 61 6e 69 63 28        Tcl_Panic(
36710 22 44 65 6c 69 62 65 72 61 74 65 20 70 61 6e 69  "Deliberate pani
36720 63 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  c");.      break
36730 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
36740 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 20 20  turn TCL_OK;.}  
36750 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
36760 20 20 72 65 67 69 73 74 65 72 5f 64 62 73 74 61    register_dbsta
36770 74 5f 76 74 61 62 20 44 42 0a 2a 2a 0a 2a 2a 20  t_vtab DB.**.** 
36780 43 61 75 73 65 20 74 68 65 20 64 62 73 74 61 74  Cause the dbstat
36790 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 74   virtual table t
367a0 6f 20 62 65 20 61 76 61 69 6c 61 62 6c 65 20 6f  o be available o
367b0 6e 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  n the connection
367c0 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   DB.*/.static in
367d0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
367e0 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 64 62  test_register_db
367f0 73 74 61 74 5f 76 74 61 62 28 0a 20 20 76 6f 69  stat_vtab(.  voi
36800 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
36810 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
36820 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
36830 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
36840 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 64  T objv[].){.#ifd
36850 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
36860 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 54 63  IRTUALTABLE.  Tc
36870 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
36880 6e 74 65 72 70 2c 20 22 64 62 73 74 61 74 20 6e  nterp, "dbstat n
36890 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 62 65 63  ot available bec
368a0 61 75 73 65 20 6f 66 20 22 0a 20 20 20 20 20 20  ause of ".      
368b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
368c0 20 20 20 20 20 22 53 51 4c 49 54 45 5f 4f 4d 49       "SQLITE_OMI
368d0 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 22 2c  T_VIRTUALTABLE",
368e0 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65   (void*)0);.  re
368f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
36900 23 65 6c 73 65 0a 20 20 73 74 72 75 63 74 20 53  #else.  struct S
36910 71 6c 69 74 65 44 62 20 7b 20 73 71 6c 69 74 65  qliteDb { sqlite
36920 33 20 2a 64 62 3b 20 7d 3b 0a 20 20 63 68 61 72  3 *db; };.  char
36930 20 2a 7a 44 62 3b 0a 20 20 54 63 6c 5f 43 6d 64   *zDb;.  Tcl_Cmd
36940 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 0a 20  Info cmdInfo;.. 
36950 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
36960 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
36970 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
36980 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
36990 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
369a0 52 3b 0a 20 20 7d 0a 0a 20 20 7a 44 62 20 3d 20  R;.  }..  zDb = 
369b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
369c0 6a 76 5b 31 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[1]);.  if( Tc
369d0 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f  l_GetCommandInfo
369e0 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63  (interp, zDb, &c
369f0 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 73  mdInfo) ){.    s
36a00 71 6c 69 74 65 33 2a 20 64 62 20 3d 20 28 28 73  qlite3* db = ((s
36a10 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29  truct SqliteDb*)
36a20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e  cmdInfo.objClien
36a30 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 20 20  tData)->db;.    
36a40 73 71 6c 69 74 65 33 44 62 73 74 61 74 52 65 67  sqlite3DbstatReg
36a50 69 73 74 65 72 28 64 62 29 3b 0a 20 20 7d 0a 20  ister(db);.  }. 
36a60 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
36a70 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
36a80 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
36a90 4c 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  LE */.}../*.** t
36aa0 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33  clcmd:   sqlite3
36ab0 5f 64 62 5f 63 6f 6e 66 69 67 20 44 42 20 53 45  _db_config DB SE
36ac0 54 54 49 4e 47 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TTING VALUE.**.*
36ad0 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33  * Invoke sqlite3
36ae0 5f 64 62 5f 63 6f 6e 66 69 67 28 29 20 66 6f 72  _db_config() for
36af0 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 65 74 74   one of the sett
36b00 69 6e 67 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73  ing values..*/.s
36b10 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
36b20 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c  _TCLAPI test_sql
36b30 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 0a  ite3_db_config(.
36b40 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
36b50 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
36b60 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
36b70 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
36b80 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
36b90 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
36ba0 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e  struct {.    con
36bb0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  st char *zName;.
36bc0 20 20 20 20 69 6e 74 20 65 56 61 6c 3b 0a 20 20      int eVal;.  
36bd0 7d 20 61 53 65 74 74 69 6e 67 5b 5d 20 3d 20 7b  } aSetting[] = {
36be0 0a 20 20 20 20 7b 20 22 46 4b 45 59 22 2c 20 20  .    { "FKEY",  
36bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
36c00 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41  ITE_DBCONFIG_ENA
36c10 42 4c 45 5f 46 4b 45 59 20 7d 2c 0a 20 20 20 20  BLE_FKEY },.    
36c20 7b 20 22 54 52 49 47 47 45 52 22 2c 20 20 20 20  { "TRIGGER",    
36c30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44          SQLITE_D
36c40 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54  BCONFIG_ENABLE_T
36c50 52 49 47 47 45 52 20 7d 2c 0a 20 20 20 20 7b 20  RIGGER },.    { 
36c60 22 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 22  "FTS3_TOKENIZER"
36c70 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43  ,     SQLITE_DBC
36c80 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53  ONFIG_ENABLE_FTS
36c90 33 5f 54 4f 4b 45 4e 49 5a 45 52 20 7d 2c 0a 20  3_TOKENIZER },. 
36ca0 20 20 20 7b 20 22 4c 4f 41 44 5f 45 58 54 45 4e     { "LOAD_EXTEN
36cb0 53 49 4f 4e 22 2c 20 20 20 20 20 53 51 4c 49 54  SION",     SQLIT
36cc0 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
36cd0 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  E_LOAD_EXTENSION
36ce0 20 7d 2c 0a 20 20 20 20 7b 20 22 4e 4f 5f 43 4b   },.    { "NO_CK
36cf0 50 54 5f 4f 4e 5f 43 4c 4f 53 45 22 2c 20 20 20  PT_ON_CLOSE",   
36d00 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
36d10 4e 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45  NO_CKPT_ON_CLOSE
36d20 20 7d 2c 0a 20 20 20 20 7b 20 22 51 50 53 47 22   },.    { "QPSG"
36d30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
36d40 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
36d50 45 4e 41 42 4c 45 5f 51 50 53 47 20 7d 2c 0a 20  ENABLE_QPSG },. 
36d60 20 20 20 7b 20 22 54 52 49 47 47 45 52 5f 45 51     { "TRIGGER_EQ
36d70 50 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  P",        SQLIT
36d80 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47 47  E_DBCONFIG_TRIGG
36d90 45 52 5f 45 51 50 20 7d 2c 0a 20 20 20 20 7b 20  ER_EQP },.    { 
36da0 22 52 45 53 45 54 5f 44 42 22 2c 20 20 20 20 20  "RESET_DB",     
36db0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43        SQLITE_DBC
36dc0 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54 41  ONFIG_RESET_DATA
36dd0 42 41 53 45 20 7d 2c 0a 20 20 20 20 7b 20 22 44  BASE },.    { "D
36de0 45 46 45 4e 53 49 56 45 22 2c 20 20 20 20 20 20  EFENSIVE",      
36df0 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e      SQLITE_DBCON
36e00 46 49 47 5f 44 45 46 45 4e 53 49 56 45 20 7d 2c  FIG_DEFENSIVE },
36e10 0a 20 20 20 20 7b 20 22 57 52 49 54 41 42 4c 45  .    { "WRITABLE
36e20 5f 53 43 48 45 4d 41 22 2c 20 20 20 20 53 51 4c  _SCHEMA",    SQL
36e30 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 57 52 49  ITE_DBCONFIG_WRI
36e40 54 41 42 4c 45 5f 53 43 48 45 4d 41 20 7d 2c 0a  TABLE_SCHEMA },.
36e50 20 20 20 20 7b 20 22 4c 45 47 41 43 59 5f 41 4c      { "LEGACY_AL
36e60 54 45 52 5f 54 41 42 4c 45 22 2c 20 53 51 4c 49  TER_TABLE", SQLI
36e70 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c 45 47 41  TE_DBCONFIG_LEGA
36e80 43 59 5f 41 4c 54 45 52 5f 54 41 42 4c 45 20 7d  CY_ALTER_TABLE }
36e90 2c 0a 20 20 20 20 7b 20 22 44 51 53 5f 44 4d 4c  ,.    { "DQS_DML
36ea0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
36eb0 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44 51  LITE_DBCONFIG_DQ
36ec0 53 5f 44 4d 4c 20 7d 2c 0a 20 20 20 20 7b 20 22  S_DML },.    { "
36ed0 44 51 53 5f 44 44 4c 22 2c 20 20 20 20 20 20 20  DQS_DDL",       
36ee0 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f       SQLITE_DBCO
36ef0 4e 46 49 47 5f 44 51 53 5f 44 44 4c 20 7d 2c 0a  NFIG_DQS_DDL },.
36f00 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
36f10 69 6e 74 20 76 3b 0a 20 20 63 6f 6e 73 74 20 63  int v;.  const c
36f20 68 61 72 20 2a 7a 53 65 74 74 69 6e 67 3b 0a 20  har *zSetting;. 
36f30 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 0a 20   sqlite3 *db;.. 
36f40 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
36f50 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
36f60 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
36f70 6f 62 6a 76 2c 20 22 44 42 20 53 45 54 54 49 4e  objv, "DB SETTIN
36f80 47 20 56 41 4c 55 45 22 29 3b 0a 20 20 20 20 72  G VALUE");.    r
36f90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
36fa0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
36fb0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
36fc0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
36fd0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
36fe0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
36ff0 0a 20 20 7a 53 65 74 74 69 6e 67 20 3d 20 54 63  .  zSetting = Tc
37000 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
37010 5b 32 5d 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  [2]);.  if( sqli
37020 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 53 51 4c  te3_strglob("SQL
37030 49 54 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67  ITE_*", zSetting
37040 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20  )==0 ) zSetting 
37050 2b 3d 20 37 3b 0a 20 20 69 66 28 20 73 71 6c 69  += 7;.  if( sqli
37060 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 44 42 43  te3_strglob("DBC
37070 4f 4e 46 49 47 5f 2a 22 2c 20 7a 53 65 74 74 69  ONFIG_*", zSetti
37080 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e  ng)==0 ) zSettin
37090 67 20 2b 3d 20 39 3b 0a 20 20 69 66 28 20 73 71  g += 9;.  if( sq
370a0 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 45  lite3_strglob("E
370b0 4e 41 42 4c 45 5f 2a 22 2c 20 7a 53 65 74 74 69  NABLE_*", zSetti
370c0 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74 74 69 6e  ng)==0 ) zSettin
370d0 67 20 2b 3d 20 37 3b 0a 20 20 66 6f 72 28 69 3d  g += 7;.  for(i=
370e0 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
370f0 53 65 74 74 69 6e 67 29 3b 20 69 2b 2b 29 7b 0a  Setting); i++){.
37100 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
37110 53 65 74 74 69 6e 67 2c 20 61 53 65 74 74 69 6e  Setting, aSettin
37120 67 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29  g[i].zName)==0 )
37130 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 69 66   break;.  }.  if
37140 28 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61  ( i>=ArraySize(a
37150 53 65 74 74 69 6e 67 29 20 29 7b 0a 20 20 20 20  Setting) ){.    
37160 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
37170 28 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 54  (interp,.      T
37180 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
37190 22 75 6e 6b 6e 6f 77 6e 20 73 71 6c 69 74 65 33  "unknown sqlite3
371a0 5f 64 62 5f 63 6f 6e 66 69 67 20 73 65 74 74 69  _db_config setti
371b0 6e 67 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72  ng", -1));.    r
371c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
371d0 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47  .  }.  if( Tcl_G
371e0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
371f0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
37200 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
37210 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
37220 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 61 53  db_config(db, aS
37230 65 74 74 69 6e 67 5b 69 5d 2e 65 56 61 6c 2c 20  etting[i].eVal, 
37240 76 2c 20 26 76 29 3b 0a 20 20 54 63 6c 5f 53 65  v, &v);.  Tcl_Se
37250 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
37260 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
37270 28 76 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (v));.  return T
37280 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
37290 43 68 61 6e 67 65 20 74 68 65 20 6e 61 6d 65 20  Change the name 
372a0 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
372b0 62 61 73 65 20 73 63 68 65 6d 61 20 66 72 6f 6d  base schema from
372c0 20 22 6d 61 69 6e 22 20 74 6f 20 22 69 63 65 63   "main" to "icec
372d0 75 62 65 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ube"..*/.static 
372e0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
372f0 49 20 74 65 73 74 5f 64 62 63 6f 6e 66 69 67 5f  I test_dbconfig_
37300 6d 61 69 6e 64 62 6e 61 6d 65 5f 69 63 65 63 75  maindbname_icecu
37310 62 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  be(.  void * cli
37320 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
37330 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
37340 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
37350 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
37360 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  [].){.  int rc;.
37370 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
37380 20 65 78 74 65 72 6e 20 69 6e 74 20 67 65 74 44   extern int getD
37390 62 50 6f 69 6e 74 65 72 28 54 63 6c 5f 49 6e 74  bPointer(Tcl_Int
373a0 65 72 70 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72  erp*, const char
373b0 2a 2c 20 73 71 6c 69 74 65 33 2a 2a 29 3b 0a 20  *, sqlite3**);. 
373c0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
373d0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
373e0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
373f0 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20  objv, "DB");.   
37400 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
37410 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  R;.  }else{.    
37420 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
37430 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
37440 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
37450 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
37460 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63  CL_ERROR;.    rc
37470 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f   = sqlite3_db_co
37480 6e 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f  nfig(db, SQLITE_
37490 44 42 43 4f 4e 46 49 47 5f 4d 41 49 4e 44 42 4e  DBCONFIG_MAINDBN
374a0 41 4d 45 2c 20 22 69 63 65 63 75 62 65 22 29 3b  AME, "icecube");
374b0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
374c0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
374d0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29  l_NewIntObj(rc))
374e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
374f0 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
37500 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
37510 5f 6d 6d 61 70 5f 77 61 72 6d 20 44 42 20 44 42  _mmap_warm DB DB
37520 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69  NAME.*/.static i
37530 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
37540 20 74 65 73 74 5f 6d 6d 61 70 5f 77 61 72 6d 28   test_mmap_warm(
37550 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
37560 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
37570 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
37580 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
37590 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
375a0 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  ){.  extern int 
375b0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
375c0 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74 20  _Interp*, const 
375d0 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a 2a  char*, sqlite3**
375e0 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
375f0 73 71 6c 69 74 65 33 5f 6d 6d 61 70 5f 77 61 72  sqlite3_mmap_war
37600 6d 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  m(sqlite3 *db, c
37610 6f 6e 73 74 20 63 68 61 72 20 2a 29 3b 0a 0a 20  onst char *);.. 
37620 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20   if( objc!=2 && 
37630 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
37640 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
37650 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
37660 20 22 44 42 20 3f 44 42 4e 41 4d 45 3f 22 29 3b   "DB ?DBNAME?");
37670 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
37680 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
37690 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
376a0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 20  sqlite3 *db;.   
376b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
376c0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 67 65   = 0;.    if( ge
376d0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
376e0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
376f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
37700 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
37710 4f 52 3b 0a 20 20 20 20 69 66 28 20 6f 62 6a 63  OR;.    if( objc
37720 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 7a 44 62  ==3 ){.      zDb
37730 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
37740 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 20 20 7d  (objv[2]);.    }
37750 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
37760 33 5f 6d 6d 61 70 5f 77 61 72 6d 28 64 62 2c 20  3_mmap_warm(db, 
37770 7a 44 62 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  zDb);.    Tcl_Se
37780 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
37790 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
377a0 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72 4e 61  Obj(sqlite3ErrNa
377b0 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a 20 20  me(rc), -1));.  
377c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
377d0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  .  }.}../*.** Us
377e0 61 67 65 3a 20 20 64 65 63 6f 64 65 5f 68 65 78  age:  decode_hex
377f0 64 62 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 45 78  db TEXT.**.** Ex
37800 61 6d 70 6c 65 3a 20 20 20 64 62 20 64 65 73 65  ample:   db dese
37810 72 69 61 6c 69 7a 65 20 5b 64 65 63 6f 64 65 5f  rialize [decode_
37820 68 65 78 64 62 20 24 6f 75 74 70 75 74 5f 6f 66  hexdb $output_of
37830 5f 64 62 74 6f 74 78 74 5d 0a 2a 2a 0a 2a 2a 20  _dbtotxt].**.** 
37840 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
37850 75 72 6e 73 20 61 20 62 79 74 65 2d 61 72 72 61  urns a byte-arra
37860 79 20 66 6f 72 20 61 6e 20 53 51 4c 69 74 65 20  y for an SQLite 
37870 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 68  database file th
37880 61 74 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 72 75  at.** is constru
37890 63 74 65 64 20 66 72 6f 6d 20 61 20 74 65 78 74  cted from a text
378a0 20 69 6e 70 75 74 20 77 68 69 63 68 20 69 73 20   input which is 
378b0 74 68 65 20 6f 75 74 70 75 74 20 6f 66 20 74 68  the output of th
378c0 65 20 22 64 62 74 6f 74 78 74 22 0a 2a 2a 20 75  e "dbtotxt".** u
378d0 74 69 6c 69 74 79 2e 0a 2a 2f 0a 73 74 61 74 69  tility..*/.stati
378e0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
378f0 41 50 49 20 74 65 73 74 5f 64 65 63 6f 64 65 5f  API test_decode_
37900 68 65 78 64 62 28 0a 20 20 76 6f 69 64 20 2a 20  hexdb(.  void * 
37910 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
37920 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
37930 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
37940 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
37950 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74  bjv[].){.  const
37960 20 63 68 61 72 20 2a 7a 49 6e 20 3d 20 30 3b 0a   char *zIn = 0;.
37970 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
37980 2a 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 20  *a = 0;.  int n 
37990 3d 20 30 3b 0a 20 20 69 6e 74 20 6c 69 6e 65 6e  = 0;.  int linen
379a0 6f 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  o = 0;.  int i, 
379b0 69 4e 65 78 74 3b 0a 20 20 69 6e 74 20 69 4f 66  iNext;.  int iOf
379c0 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 6e 74 20  fset = 0;.  int 
379d0 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  j, k;.  int rc;.
379e0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
379f0 5b 31 36 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63  [16];.  if( objc
37a00 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
37a10 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
37a20 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 48 45  rp, 1, objv, "HE
37a30 58 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72  XDB");.    retur
37a40 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
37a50 0a 20 20 7a 49 6e 20 3d 20 54 63 6c 5f 47 65 74  .  zIn = Tcl_Get
37a60 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
37a70 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 49 6e 5b  .  for(i=0; zIn[
37a80 69 5d 3b 20 69 3d 69 4e 65 78 74 29 7b 0a 20 20  i]; i=iNext){.  
37a90 20 20 6c 69 6e 65 6e 6f 2b 2b 3b 0a 20 20 20 20    lineno++;.    
37aa0 66 6f 72 28 69 4e 65 78 74 3d 69 3b 20 7a 49 6e  for(iNext=i; zIn
37ab0 5b 69 4e 65 78 74 5d 20 26 26 20 7a 49 6e 5b 69  [iNext] && zIn[i
37ac0 4e 65 78 74 5d 21 3d 27 5c 6e 27 3b 20 69 4e 65  Next]!='\n'; iNe
37ad0 78 74 2b 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20  xt++){}.    if( 
37ae0 7a 49 6e 5b 69 4e 65 78 74 5d 3d 3d 27 5c 6e 27  zIn[iNext]=='\n'
37af0 20 29 20 69 4e 65 78 74 2b 2b 3b 0a 20 20 20 20   ) iNext++;.    
37b00 77 68 69 6c 65 28 20 7a 49 6e 5b 69 5d 3d 3d 27  while( zIn[i]=='
37b10 20 27 20 7c 7c 20 7a 49 6e 5b 69 5d 3d 3d 27 5c   ' || zIn[i]=='\
37b20 74 27 20 29 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20  t' ){ i++; }.   
37b30 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
37b40 20 20 20 69 6e 74 20 70 67 73 7a 3b 0a 20 20 20     int pgsz;.   
37b50 20 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28 7a     rc = sscanf(z
37b60 49 6e 2b 69 2c 20 22 7c 20 73 69 7a 65 20 25 64  In+i, "| size %d
37b70 20 70 61 67 65 73 69 7a 65 20 25 64 22 2c 20 26   pagesize %d", &
37b80 6e 2c 20 26 70 67 73 7a 29 3b 0a 20 20 20 20 20  n, &pgsz);.     
37b90 20 69 66 28 20 72 63 21 3d 32 20 29 20 63 6f 6e   if( rc!=2 ) con
37ba0 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28  tinue;.      if(
37bb0 20 70 67 73 7a 3c 35 31 32 20 7c 7c 20 70 67 73   pgsz<512 || pgs
37bc0 7a 3e 36 35 35 33 36 20 7c 7c 20 28 70 67 73 7a  z>65536 || (pgsz
37bd0 26 28 70 67 73 7a 2d 31 29 29 21 3d 30 20 29 7b  &(pgsz-1))!=0 ){
37be0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 41 70 70  .        Tcl_App
37bf0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
37c00 2c 20 22 62 61 64 20 27 70 61 67 65 73 69 7a 65  , "bad 'pagesize
37c10 27 20 66 69 65 6c 64 22 2c 20 28 76 6f 69 64 2a  ' field", (void*
37c20 29 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  )0);.        ret
37c30 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
37c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 20 3d       }.      n =
37c50 20 28 6e 2b 70 67 73 7a 2d 31 29 26 7e 28 70 67   (n+pgsz-1)&~(pg
37c60 73 7a 2d 31 29 3b 20 20 2f 2a 20 52 6f 75 6e 64  sz-1);  /* Round
37c70 20 6e 20 75 70 20 74 6f 20 74 68 65 20 6e 65 78   n up to the nex
37c80 74 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 70 67  t multiple of pg
37c90 73 7a 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  sz */.      if( 
37ca0 6e 3c 35 31 32 20 29 7b 0a 20 20 20 20 20 20 20  n<512 ){.       
37cb0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
37cc0 74 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 27  t(interp, "bad '
37cd0 73 69 7a 65 27 20 66 69 65 6c 64 22 2c 20 28 76  size' field", (v
37ce0 6f 69 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 20  oid*)0);.       
37cf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
37d00 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  R;.      }.     
37d10 20 61 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29   a = malloc( n )
37d20 3b 0a 20 20 20 20 20 20 69 66 28 20 61 3d 3d 30  ;.      if( a==0
37d30 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
37d40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
37d50 65 72 70 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  erp, "out of mem
37d60 6f 72 79 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b  ory", (void*)0);
37d70 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
37d80 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
37d90 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
37da0 61 2c 20 30 2c 20 6e 29 3b 0a 20 20 20 20 20 20  a, 0, n);.      
37db0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a  continue;.    }.
37dc0 20 20 20 20 72 63 20 3d 20 73 73 63 61 6e 66 28      rc = sscanf(
37dd0 7a 49 6e 2b 69 2c 20 22 7c 20 70 61 67 65 20 25  zIn+i, "| page %
37de0 64 20 6f 66 66 73 65 74 20 25 64 22 2c 20 26 6a  d offset %d", &j
37df0 2c 20 26 6b 29 3b 0a 20 20 20 20 69 66 28 20 72  , &k);.    if( r
37e00 63 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 4f  c==2 ){.      iO
37e10 66 66 73 65 74 20 3d 20 6b 3b 0a 20 20 20 20 20  ffset = k;.     
37e20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
37e30 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61 6e 66  .    rc = sscanf
37e40 28 7a 49 6e 2b 69 2c 22 7c 20 25 64 3a 20 25 78  (zIn+i,"| %d: %x
37e50 20 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20   %x %x %x %x %x 
37e60 25 78 20 25 78 20 25 78 20 25 78 20 25 78 20 25  %x %x %x %x %x %
37e70 78 20 25 78 20 25 78 20 25 78 20 25 78 22 2c 0a  x %x %x %x %x",.
37e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e90 26 6a 2c 20 26 78 5b 30 5d 2c 20 26 78 5b 31 5d  &j, &x[0], &x[1]
37ea0 2c 20 26 78 5b 32 5d 2c 20 26 78 5b 33 5d 2c 20  , &x[2], &x[3], 
37eb0 26 78 5b 34 5d 2c 20 26 78 5b 35 5d 2c 20 26 78  &x[4], &x[5], &x
37ec0 5b 36 5d 2c 20 26 78 5b 37 5d 2c 0a 20 20 20 20  [6], &x[7],.    
37ed0 20 20 20 20 20 20 20 20 20 20 20 20 26 78 5b 38              &x[8
37ee0 5d 2c 20 26 78 5b 39 5d 2c 20 26 78 5b 31 30 5d  ], &x[9], &x[10]
37ef0 2c 20 26 78 5b 31 31 5d 2c 20 26 78 5b 31 32 5d  , &x[11], &x[12]
37f00 2c 20 26 78 5b 31 33 5d 2c 20 26 78 5b 31 34 5d  , &x[13], &x[14]
37f10 2c 20 26 78 5b 31 35 5d 29 3b 0a 20 20 20 20 69  , &x[15]);.    i
37f20 66 28 20 72 63 3d 3d 31 37 20 29 7b 0a 20 20 20  f( rc==17 ){.   
37f30 20 20 20 6b 20 3d 20 69 4f 66 66 73 65 74 2b 6a     k = iOffset+j
37f40 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 2b 31 36  ;.      if( k+16
37f50 3c 3d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  <=n ){.        i
37f60 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 66  nt ii;.        f
37f70 6f 72 28 69 69 3d 30 3b 20 69 69 3c 31 36 3b 20  or(ii=0; ii<16; 
37f80 69 69 2b 2b 29 20 61 5b 6b 2b 69 69 5d 20 3d 20  ii++) a[k+ii] = 
37f90 78 5b 69 69 5d 26 30 78 66 66 3b 0a 20 20 20 20  x[ii]&0xff;.    
37fa0 20 20 7d 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e    }.      contin
37fb0 75 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ue;.    }.  }.  
37fc0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
37fd0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
37fe0 42 79 74 65 41 72 72 61 79 4f 62 6a 28 61 2c 20  ByteArrayObj(a, 
37ff0 6e 29 29 3b 0a 20 20 66 72 65 65 28 61 29 3b 0a  n));.  free(a);.
38000 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
38010 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  .}.../*.** Regis
38020 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69 74  ter commands wit
38030 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 70  h the TCL interp
38040 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53 71  reter..*/.int Sq
38050 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28 54  litetest1_Init(T
38060 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
38070 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  p){.  extern int
38080 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f   sqlite3_search_
38090 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
380a0 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75 6e  int sqlite3_foun
380b0 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  d_count;.  exter
380c0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6e  n int sqlite3_in
380d0 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a 20  terrupt_count;. 
380e0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
380f0 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  te3_open_file_co
38100 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  unt;.  extern in
38110 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63  t sqlite3_sort_c
38120 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
38130 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72 65  nt sqlite3_curre
38140 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51 4c  nt_time;.#if SQL
38150 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20 64  ITE_OS_UNIX && d
38160 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
38170 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41 42  ) && SQLITE_ENAB
38180 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45  LE_LOCKING_STYLE
38190 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
381a0 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75 6d  lite3_hostid_num
381b0 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65 72  ;.#endif.  exter
381c0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 61  n int sqlite3_ma
381d0 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65 78  x_blobsize;.  ex
381e0 74 65 72 6e 20 69 6e 74 20 53 51 4c 49 54 45 5f  tern int SQLITE_
381f0 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 42 74  TCLAPI sqlite3Bt
38200 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65  reeSharedCacheRe
38210 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20 20 20 20  port(void*,.    
38220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38240 20 20 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70        Tcl_Interp
38250 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f  *,int,Tcl_Obj*CO
38260 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74 69 63 20  NST*);.  static 
38270 69 6e 74 20 69 5a 65 72 6f 20 3d 20 30 3b 0a 20  int iZero = 0;. 
38280 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
38290 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
382a0 65 3b 0a 20 20 20 20 20 54 63 6c 5f 43 6d 64 50  e;.     Tcl_CmdP
382b0 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 7d 20  roc *xProc;.  } 
382c0 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  aCmd[] = {.     
382d0 7b 20 22 64 62 5f 65 6e 74 65 72 22 2c 20 20 20  { "db_enter",   
382e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
382f0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
38300 29 64 62 5f 65 6e 74 65 72 20 20 20 20 20 20 20  )db_enter       
38310 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20