/ Hex Artifact Content
Login

Artifact 8574e41c1bf103727909b37351b3690cc07bc8a7:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 66 20 64  vdbeInt.h".#if d
0280: 65 66 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 53  efined(INCLUDE_S
0290: 51 4c 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20 20  QLITE_TCL_H).#  
02a0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 5f  include "sqlite_
02b0: 74 63 6c 2e 68 22 0a 23 65 6c 73 65 0a 23 20 20  tcl.h".#else.#  
02c0: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
02d0: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
02e0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
02f0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0300: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
0310: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73  copy of the firs
0320: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 71  t part of the Sq
0330: 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72 65  liteDb structure
0340: 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69 74   in .** tclsqlit
0350: 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69 74  e.c.  We need it
0360: 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74 68   here so that th
0370: 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  e get_sqlite_poi
0380: 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  nter routine.** 
0390: 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65 20  can extract the 
03a0: 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65 72  sqlite3* pointer
03b0: 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69 6e   from an existin
03c0: 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a 20  g Tcl SQLite.** 
03d0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
03e0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
03f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0400: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  };../*.** Conver
0410: 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65 64  t text generated
0420: 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f 6e   by the "%p" con
0430: 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 62  version format b
0440: 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f  ack into.** a po
0450: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
0460: 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49 6e   int testHexToIn
0470: 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28 20  t(int h){.  if( 
0480: 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27  h>='0' && h<='9'
0490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
04a0: 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20   - '0';.  }else 
04b0: 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68 3c  if( h>='a' && h<
04c0: 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75  ='f' ){.    retu
04d0: 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30 3b  rn h - 'a' + 10;
04e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
04f0: 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26 20  sert( h>='A' && 
0500: 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72 65  h<='F' );.    re
0510: 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20 31  turn h - 'A' + 1
0520: 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a 73  0;.  }.}.void *s
0530: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
0540: 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ptr(const char *
0550: 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  z){.  void *p;. 
0560: 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32   u64 v;.  u32 v2
0570: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30  ;.  if( z[0]=='0
0580: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29  ' && z[1]=='x' )
0590: 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  {.    z += 2;.  
05a0: 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  }.  v = 0;.  whi
05b0: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20  le( *z ){.    v 
05c0: 3d 20 28 76 3c 3c 34 29 20 2b 20 74 65 73 74 48  = (v<<4) + testH
05d0: 65 78 54 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20 20  exToInt(*z);.   
05e0: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   z++;.  }.  if( 
05f0: 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f  sizeof(p)==sizeo
0600: 66 28 76 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63  f(v) ){.    memc
0610: 70 79 28 26 70 2c 20 26 76 2c 20 73 69 7a 65 6f  py(&p, &v, sizeo
0620: 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f(p));.  }else{.
0630: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
0640: 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 32  of(p)==sizeof(v2
0650: 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28 75  ) );.    v2 = (u
0660: 33 32 29 76 3b 0a 20 20 20 20 6d 65 6d 63 70 79  32)v;.    memcpy
0670: 28 26 70 2c 20 26 76 32 2c 20 73 69 7a 65 6f 66  (&p, &v2, sizeof
0680: 28 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (p));.  }.  retu
0690: 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
06a0: 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 68  A TCL command th
06b0: 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  at returns the a
06c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 71  ddress of the sq
06d0: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 2a 2a  lite* pointer.**
06e0: 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 63   for an sqlite c
06f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 73 74 61 6e  onnection instan
0700: 63 65 2e 20 20 42 61 64 20 74 68 69 6e 67 73 20  ce.  Bad things 
0710: 68 61 70 70 65 6e 20 69 66 20 74 68 65 0a 2a 2a  happen if the.**
0720: 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 6e   input is not an
0730: 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69   sqlite connecti
0740: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
0750: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
0760: 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74  get_sqlite_point
0770: 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
0780: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
0790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
07a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
07b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
07c0: 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  [].){.  struct S
07d0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
07e0: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
07f0: 6f 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  o;.  char zBuf[1
0800: 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  00];.  if( objc!
0810: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
0820: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
0830: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 1, objv, "SQL
0840: 49 54 45 2d 43 4f 4e 4e 45 43 54 49 4f 4e 22 29  ITE-CONNECTION")
0850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
0860: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
0870: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
0880: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
0890: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
08a0: 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
08b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
08c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
08d0: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
08e0: 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  nd: ",.         
08f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
0900: 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
0910: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
0920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0930: 20 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c   p = (struct Sql
0940: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
0950: 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  bjClientData;.  
0960: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
0970: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
0980: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0990: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
09a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
09b0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
09c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
09d0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
09e0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
09f0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
0a00: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0a10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0a30: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0a40: 7b 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74  {.  struct Sqlit
0a50: 65 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d  eDb *p;.  Tcl_Cm
0a60: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
0a70: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
0a80: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
0a90: 7a 41 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  zA, &cmdInfo) ){
0aa0: 0a 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74  .    p = (struct
0ab0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
0ac0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
0ad0: 3b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 70 2d  ;.    *ppDb = p-
0ae0: 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >db;.  }else{.  
0af0: 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74    *ppDb = (sqlit
0b00: 65 33 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  e3*)sqlite3TestT
0b10: 65 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20  extToPtr(zA);.  
0b20: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
0b30: 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
0b40: 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 44 65  _OS_WIN./*.** De
0b50: 63 6f 64 65 20 61 20 57 69 6e 33 32 20 48 41 4e  code a Win32 HAN
0b60: 44 4c 45 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69  DLE object..*/.i
0b70: 6e 74 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c  nt getWin32Handl
0b80: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
0b90: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
0ba0: 20 2a 7a 41 2c 20 4c 50 48 41 4e 44 4c 45 20 70   *zA, LPHANDLE p
0bb0: 68 46 69 6c 65 29 7b 0a 20 20 2a 70 68 46 69 6c  hFile){.  *phFil
0bc0: 65 20 3d 20 28 48 41 4e 44 4c 45 29 73 71 6c 69  e = (HANDLE)sqli
0bd0: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
0be0: 28 7a 41 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (zA);.  return T
0bf0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
0c00: 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68  .extern const ch
0c10: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
0c20: 6d 65 28 69 6e 74 29 3b 0a 23 64 65 66 69 6e 65  me(int);.#define
0c30: 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c   t1ErrorName sql
0c40: 69 74 65 33 45 72 72 4e 61 6d 65 0a 0a 2f 2a 0a  ite3ErrName../*.
0c50: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71  ** Convert an sq
0c60: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f  lite3_stmt* into
0c70: 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54   an sqlite3*.  T
0c80: 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  his depends on t
0c90: 68 65 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20  he.** fact that 
0ca0: 74 68 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20  the sqlite3* is 
0cb0: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
0cc0: 69 6e 20 74 68 65 20 56 64 62 65 20 73 74 72 75  in the Vdbe stru
0cd0: 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cture..*/.#defin
0ce0: 65 20 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20  e StmtToDb(X)   
0cf0: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
0d00: 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e(X)../*.** Chec
0d10: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
0d20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
0d30: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
0d40: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
0d50: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0d60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0d70: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
0d80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0da0: 20 72 63 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   rc){.  if( sqli
0db0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
0dc0: 3d 3d 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ==0 && rc!=SQLIT
0dd0: 45 5f 4d 49 53 55 53 45 20 26 26 20 72 63 21 3d  E_MISUSE && rc!=
0de0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
0df0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e00: 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20 20 63  db)!=rc ){.    c
0e10: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
0e20: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
0e30: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
0e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
0e50: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
0e60: 66 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20  f), zBuf,.      
0e70: 20 22 65 72 72 6f 72 20 63 6f 64 65 20 25 73 20   "error code %s 
0e80: 28 25 64 29 20 64 6f 65 73 20 6e 6f 74 20 6d 61  (%d) does not ma
0e90: 74 63 68 20 73 71 6c 69 74 65 33 5f 65 72 72 63  tch sqlite3_errc
0ea0: 6f 64 65 20 25 73 20 28 25 64 29 22 2c 0a 20 20  ode %s (%d)",.  
0eb0: 20 20 20 20 20 74 31 45 72 72 6f 72 4e 61 6d 65       t1ErrorName
0ec0: 28 72 63 29 2c 20 72 63 2c 20 74 31 45 72 72 6f  (rc), rc, t1Erro
0ed0: 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29 3b 0a  rName(r2), r2);.
0ee0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0ef0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0f00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0f10: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0f20: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
0f30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0f50: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0f60: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
0f70: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
0f80: 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f 69 6e   int getStmtPoin
0f90: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
0fa0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
0fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
0fc0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
0fd0: 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a   **ppStmt.){.  *
0fe0: 70 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65  ppStmt = (sqlite
0ff0: 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65 33 54  3_stmt*)sqlite3T
1000: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 72  estTextToPtr(zAr
1010: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  g);.  return TCL
1020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
1030: 6e 65 72 61 74 65 20 61 20 74 65 78 74 20 72 65  nerate a text re
1040: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1050: 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 63  a pointer that c
1060: 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f 6f 64  an be understood
1070: 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74 44 62  .** by the getDb
1080: 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65 74 56  Pointer and getV
1090: 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65  mPointer routine
10a0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  s above..**.** T
10b0: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f  he problem is, o
10c0: 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20  n some machines 
10d0: 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79 6f 75  (Solaris) if you
10e0: 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77 69 74   do a printf wit
10f0: 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20 63 61  h.** "%p" you ca
1100: 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75 6e 64  nnot turn around
1110: 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e 66 20   and do a scanf 
1120: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 22 25  with the same "%
1130: 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f  p" and.** get yo
1140: 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e  ur pointer back.
1150: 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20 70 72    You have to pr
1160: 65 70 65 6e 64 20 61 20 22 30 78 22 20 62 65 66  epend a "0x" bef
1170: 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77  ore it will.** w
1180: 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65 61 73  ork.  Or at leas
1190: 74 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69  t that is what i
11a0: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
11b0: 20 28 64 72 68 29 2e 20 20 42 75 74 20 74 68 69   (drh).  But thi
11c0: 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20 76 61  s.** behavior va
11d0: 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e  ries from machin
11e0: 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54  e to machine.  T
11f0: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64  he solution used
1200: 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65   her is.** to te
1210: 73 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 69  st the string ri
1220: 67 68 74 20 61 66 74 65 72 20 69 74 20 69 73 20  ght after it is 
1230: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 65 65  generated to see
1240: 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a   if it can be.**
1250: 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79 20 73   understood by s
1260: 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74  canf, and if not
1270: 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69 6e 67  , try prepending
1280: 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65 65 20   an "0x" to see 
1290: 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c 70 73  if.** that helps
12a0: 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f  .  If nothing wo
12b0: 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65 72 72  rks, a fatal err
12c0: 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  or is generated.
12d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
12e0: 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
12f0: 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  r(Tcl_Interp *in
1300: 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50 74 72  terp, char *zPtr
1310: 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71  , void *p){.  sq
1320: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
1330: 30 30 2c 20 7a 50 74 72 2c 20 22 25 70 22 2c 20  00, zPtr, "%p", 
1340: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
1350: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1360: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
1370: 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 65  ne for sqlite3_e
1380: 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a 2a 2f  xec_printf()..*/
1390: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
13a0: 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69 64 20  _printf_cb(void 
13b0: 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67 63 2c  *pArg, int argc,
13c0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
13d0: 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54 63  ar **name){.  Tc
13e0: 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72 20 3d  l_DString *str =
13f0: 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a 29 70   (Tcl_DString*)p
1400: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  Arg;.  int i;.. 
1410: 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69 6e 67   if( Tcl_DString
1420: 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30 20 29  Length(str)==0 )
1430: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1440: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1450: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
1460: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c  pendElement(str,
1470: 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b   name[i] ? name[
1480: 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  i] : "NULL");.  
1490: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
14a0: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
14b0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
14c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
14d0: 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61 72 67  r, argv[i] ? arg
14e0: 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  v[i] : "NULL");.
14f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1500: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f  }../*.** The I/O
1510: 20 74 72 61 63 69 6e 67 20 63 61 6c 6c 62 61 63   tracing callbac
1520: 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  k..*/.#if !defin
1530: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
1540: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
1550: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
1560: 4f 54 52 41 43 45 29 0a 73 74 61 74 69 63 20 46  OTRACE).static F
1570: 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f 66 69 6c  ILE *iotrace_fil
1580: 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f  e = 0;.static vo
1590: 69 64 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c  id io_trace_call
15a0: 62 61 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  back(const char 
15b0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
15c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
15d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
15e0: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
15f0: 66 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 2c 20  f(iotrace_file, 
1600: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1610: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 66  va_end(ap);.  ff
1620: 6c 75 73 68 28 69 6f 74 72 61 63 65 5f 66 69 6c  lush(iotrace_fil
1630: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e);.}.#endif../*
1640: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f 5f 74  .** Usage:  io_t
1650: 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a  race FILENAME.**
1660: 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74 72 61  .** Turn I/O tra
1670: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  cing on or off. 
1680: 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20   If FILENAME is 
1690: 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72  not an empty str
16a0: 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72 61 63  ing,.** I/O trac
16b0: 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69 6e 67  ing begins going
16c0: 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45 2e 20   into FILENAME. 
16d0: 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20 61  If FILENAME is a
16e0: 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e  n empty.** strin
16f0: 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 69  g, I/O tracing i
1700: 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  s turned off..*/
1710: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1720: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69  TE_TCLAPI test_i
1730: 6f 5f 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20  o_trace(.  void 
1740: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1750: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1760: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1770: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1780: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1790: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
17a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
17b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
17c0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
17d0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
17e0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
17f0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1800: 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
1810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1820: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1830: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
1840: 43 45 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d  CE).  if( argc!=
1850: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1860: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1870: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1880: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1890: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
18a0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
18b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18d0: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18e0: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f  le ){.    if( io
18f0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f  trace_file!=stdo
1900: 75 74 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69  ut && iotrace_fi
1910: 6c 65 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20  le!=stderr ){.  
1920: 20 20 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61      fclose(iotra
1930: 63 65 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  ce_file);.    }.
1940: 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65      iotrace_file
1950: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1960: 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
1970: 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b  }.  if( argv[1][
1980: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  0] ){.    if( st
1990: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74  rcmp(argv[1],"st
19a0: 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  dout")==0 ){.   
19b0: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
19c0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
19d0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
19e0: 72 67 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29  rgv[1],"stderr")
19f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74  ==0 ){.      iot
1a00: 72 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65  race_file = stde
1a10: 72 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rr;.    }else{. 
1a20: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
1a30: 65 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31  e = fopen(argv[1
1a40: 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20  ], "w");.    }. 
1a50: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
1a60: 65 20 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c  e = io_trace_cal
1a70: 6c 62 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  lback;.  }.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1a90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1aa0: 65 3a 20 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69  e:  clang_saniti
1ab0: 7a 65 5f 61 64 64 72 65 73 73 20 0a 2a 2a 0a 2a  ze_address .**.*
1ac0: 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69  * Returns true i
1ad0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 77 61  f the program wa
1ae0: 73 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67  s compiled using
1af0: 20 63 6c 61 6e 67 20 77 69 74 68 20 74 68 65 20   clang with the 
1b00: 0a 2a 2a 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61  .** -fsanitize=a
1b10: 64 64 72 65 73 73 20 73 77 69 74 63 68 20 6f 6e  ddress switch on
1b20: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1b30: 65 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  e. False otherwi
1b40: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  se..**.** Also r
1b50: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1b60: 65 20 4f 4d 49 54 5f 4d 49 53 55 53 45 20 65 6e  e OMIT_MISUSE en
1b70: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1b80: 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74  le exists..*/.st
1b90: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1ba0: 54 43 4c 41 50 49 20 63 6c 61 6e 67 5f 73 61 6e  TCLAPI clang_san
1bb0: 69 74 69 7a 65 5f 61 64 64 72 65 73 73 28 0a 20  itize_address(. 
1bc0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
1bd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1be0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1bf0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1c00: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1c10: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1c20: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
1c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1c50: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
1c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
1c70: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
1c80: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  t */.){.  int re
1c90: 73 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e  s = 0;.#if defin
1ca0: 65 64 28 5f 5f 68 61 73 5f 66 65 61 74 75 72 65  ed(__has_feature
1cb0: 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f 66 65 61  ).# if __has_fea
1cc0: 74 75 72 65 28 61 64 64 72 65 73 73 5f 73 61 6e  ture(address_san
1cd0: 69 74 69 7a 65 72 29 0a 20 20 72 65 73 20 3d 20  itizer).  res = 
1ce0: 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  1;.# endif.#endi
1cf0: 66 0a 23 69 66 64 65 66 20 5f 5f 53 41 4e 49 54  f.#ifdef __SANIT
1d00: 49 5a 45 5f 41 44 44 52 45 53 53 5f 5f 0a 20 20  IZE_ADDRESS__.  
1d10: 72 65 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  res = 1;.#endif.
1d20: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
1d30: 67 65 74 65 6e 76 28 22 4f 4d 49 54 5f 4d 49 53  getenv("OMIT_MIS
1d40: 55 53 45 22 29 21 3d 30 20 29 20 72 65 73 20 3d  USE")!=0 ) res =
1d50: 20 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   1;.  Tcl_SetObj
1d60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73  cl_NewIntObj(res
1d80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1d90: 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20  _OK;.}.  ./*.** 
1da0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1db0: 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42 20  exec_printf  DB 
1dc0: 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a   FORMAT  STRING.
1dd0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
1de0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72   sqlite3_exec_pr
1df0: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
1e00: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
1e10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
1e20: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
1e30: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
1e40: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
1e50: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
1e60: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
1e70: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
1e80: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
1e90: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
1ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1eb0: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1ec0: 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20 76  exec_printf(.  v
1ed0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1ee0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ef0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1f00: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1f10: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1f20: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1f30: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
1f40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f60: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1f70: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
1f80: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
1f90: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1fa0: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
1fb0: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
1fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
1fd0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   0;.  char *zSql
1fe0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
1ff0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  ];.  if( argc!=4
2000: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2020: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2030: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2040: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2050: 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49  " DB FORMAT STRI
2060: 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  NG", 0);.    ret
2070: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2080: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2090: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
20a0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
20b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
20d0: 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20  t(&str);.  zSql 
20e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20f0: 66 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b  f(argv[2], argv[
2100: 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  3]);.  rc = sqli
2110: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2120: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
2130: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
2140: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2150: 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
2160: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2170: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
2180: 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41  d", rc);.  Tcl_A
2190: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
21a0: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  erp, zBuf);.  Tc
21b0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
21c0: 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49  interp, rc==SQLI
21d0: 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72  TE_OK ? Tcl_DStr
21e0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a  ingValue(&str) :
21f0: 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53   zErr);.  Tcl_DS
2200: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
2210: 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73 71  .  if( zErr ) sq
2220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
2230: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
2240: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
2250: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
2260: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2270: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2280: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
2290: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65   sqlite3_exec_he
22a0: 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a  x  DB  HEX.**.**
22b0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
22c0: 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61 20  te3_exec() on a 
22d0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6f  string that is o
22e0: 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e 73  btained by trans
22f0: 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69 6e  lating.** HEX in
2300: 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74 20  to ASCII.  Most 
2310: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 74  characters are t
2320: 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73 2e  ranslated as is.
2330: 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a 2a    %HH becomes.**
2340: 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65 72   a hex character
2350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2360: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2370: 73 74 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76  st_exec_hex(.  v
2380: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23a0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23b0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23c0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23d0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23e0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
23f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2400: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2410: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2420: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2430: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2440: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2450: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
2460: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
2470: 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a  , i, j;.  char *
2480: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zErr = 0;.  char
2490: 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a   *zHex;.  char z
24a0: 53 71 6c 5b 35 30 31 5d 3b 0a 20 20 63 68 61 72  Sql[501];.  char
24b0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
24c0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
24d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24e0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
24f0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2500: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2510: 0a 20 20 20 20 20 20 20 22 20 44 42 20 48 45 58  .       " DB HEX
2520: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2540: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2550: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2560: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2580: 7a 48 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  zHex = argv[2];.
2590: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 28    for(i=j=0; i<(
25a0: 73 69 7a 65 6f 66 28 7a 53 71 6c 29 2d 31 29 20  sizeof(zSql)-1) 
25b0: 26 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c  && zHex[j]; i++,
25c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   j++){.    if( z
25d0: 48 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a  Hex[j]=='%' && z
25e0: 48 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78  Hex[j+2] && zHex
25f0: 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a  [j+2] ){.      z
2600: 53 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65  Sql[i] = (testHe
2610: 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d  xToInt(zHex[j+1]
2620: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2630: 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b  oInt(zHex[j+2]);
2640: 0a 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20  .      j += 2;. 
2650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2660: 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a  zSql[i] = zHex[j
2670: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
2680: 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63  Sql[i] = 0;.  Tc
2690: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
26a0: 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  tr);.  rc = sqli
26b0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
26c0: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
26d0: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
26e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
26f0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
2700: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  , zBuf, "%d", rc
2710: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
2720: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
2730: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
2740: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2750: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
2760: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
2770: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
2780: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2790: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
27a0: 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f   zErr ) sqlite3_
27b0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66  free(zErr);.  if
27c0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
27d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
27e0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
27f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
2800: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2810: 2a 2a 20 55 73 61 67 65 3a 20 20 64 62 5f 65 6e  ** Usage:  db_en
2820: 74 65 72 20 44 42 0a 2a 2a 20 20 20 20 20 20 20  ter DB.**       
2830: 20 20 64 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a    db_leave DB.**
2840: 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c 65 61  .** Enter or lea
2850: 76 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ve the mutex on 
2860: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2870: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2880: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2890: 50 49 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76  PI db_enter(.  v
28a0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
28b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28c0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
28d0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
28e0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
28f0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2900: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2910: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2920: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2930: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2940: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2950: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2960: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2970: 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
2980: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
2990: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
29b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
29c0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
29d0: 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
29e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29f0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2a00: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2a10: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2a20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2a30: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OR;.  sqlite3_mu
2a40: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
2a50: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
2a60: 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  CL_OK;.}.static 
2a70: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2a80: 49 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  I db_leave(.  vo
2a90: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2aa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2ab0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2ac0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2ad0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2ae0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2af0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2b20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2b30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2b40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2b50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2b60: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
2b70: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
2b80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2b90: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2ba0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2bb0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2bc0: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2bd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2be0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2bf0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2c00: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2c10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c20: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
2c30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
2c40: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
2c50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2c60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2c70: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
2c80: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2c90: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2ca0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2cb0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2cd0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2ce0: 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _exec(.  void *N
2cf0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2d00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2d10: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2d20: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2d30: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2d40: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2d70: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2d80: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2d90: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2da0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2db0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2dc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
2dd0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
2de0: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2df0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
2e00: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
2e10: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2e20: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2e30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2e40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2e50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2e60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
2e70: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
2e80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2e90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ea0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2eb0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2ec0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2ed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
2ee0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
2ef0: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
2f00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2f10: 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  s", argv[2]);.  
2f20: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b  for(i=j=0; zSql[
2f30: 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i];){.    if( zS
2f40: 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20  ql[i]=='%' ){.  
2f50: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2f60: 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53  (testHexToInt(zS
2f70: 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74  ql[i+1])<<4) + t
2f80: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
2f90: 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20  [i+2]);.      i 
2fa0: 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  += 3;.    }else{
2fb0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
2fc0: 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20   = zSql[i++];.  
2fd0: 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a    }.  }.  zSql[j
2fe0: 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  ] = 0;.  rc = sq
2ff0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
3000: 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66  Sql, exec_printf
3010: 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  _cb, &str, &zErr
3020: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3030: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zSql);.  sqlit
3040: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3050: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
3060: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
3070: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3080: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3090: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
30a0: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
30b0: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
30c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
30d0: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
30e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
30f0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
3100: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
3110: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
3120: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
3130: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
3140: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3150: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3170: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
3180: 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a  nr  DB  SQL.**.*
3190: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
31a0: 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72 66  ite3_exec interf
31b0: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
31c0: 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  en database DB. 
31d0: 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c 20   Discard.** all 
31e0: 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74 69  results.*/.stati
31f0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
3200: 41 50 49 20 74 65 73 74 5f 65 78 65 63 5f 6e 72  API test_exec_nr
3210: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3220: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3230: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3240: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3250: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3260: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3270: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3290: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
32a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32c0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
32d0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
32e0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
32f0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
3300: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63   = 0;.  if( argc
3310: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
3320: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3330: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3340: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
3350: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
3360: 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29     " DB SQL", 0)
3370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3380: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3390: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
33a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
33b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
33c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
33d0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
33e0: 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20   argv[2], 0, 0, 
33f0: 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  &zErr);.  if( sq
3400: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
3410: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
3420: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3430: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
3440: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3450: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
3460: 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53  printf_z_test  S
3470: 45 50 41 52 41 54 4f 52 20 20 41 52 47 30 20 20  EPARATOR  ARG0  
3480: 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  ARG1 ....**.** T
3490: 65 73 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61  est the %z forma
34a0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
34b0: 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74  ntf().  Use mult
34c0: 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63  iple mprintf() c
34d0: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63  alls to .** conc
34e0: 61 74 65 6e 61 74 65 20 61 72 67 30 20 74 68 72  atenate arg0 thr
34f0: 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20  ough argn using 
3500: 73 65 70 61 72 61 74 6f 72 20 61 73 20 74 68 65  separator as the
3510: 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52   separator..** R
3520: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
3530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3540: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3550: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
3560: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3570: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3580: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3590: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
35a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
35b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
35c0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
35d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
35f0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3600: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3610: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3620: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
3630: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
3640: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
3650: 20 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32   i<argc && (i==2
3660: 20 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b   || zResult); i+
3670: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
3680: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3690: 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  f("%z%s%s", zRes
36a0: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
36b0: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
36c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
36d0: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
36e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
36f0: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
3700: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3710: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3720: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
3730: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
3740: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
3750: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
3760: 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74  _mprintf().  Ret
3770: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
3780: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
3790: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
37a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
37b0: 50 49 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  PI test_mprintf_
37c0: 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  n(.  void *NotUs
37d0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
37e0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
37f0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3800: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3810: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3820: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3840: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3850: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3860: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3870: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3880: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
3890: 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20  ar *zStr;.  int 
38a0: 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20  n = 0;.  zStr = 
38b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
38c0: 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c  "%s%n", argv[1],
38d0: 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   &n);.  sqlite3_
38e0: 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20 54 63  free(zStr);.  Tc
38f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
3900: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
3910: 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75  tObj(n));.  retu
3920: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
3930: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3940: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
3950: 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20 20 49    SIZE FORMAT  I
3960: 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  NT.**.** Test th
3970: 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 6e 70  e of sqlite3_snp
3980: 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e 65 2e  rintf() routine.
3990: 20 20 53 49 5a 45 20 69 73 20 74 68 65 20 73 69    SIZE is the si
39a0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ze of the.** out
39b0: 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
39c0: 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69 6d 75  tes.  The maximu
39d0: 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e 20 20  m size is 100.  
39e0: 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a  FORMAT is the.**
39f0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20   format string. 
3a00: 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67 6c 65   INT is a single
3a10: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
3a20: 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a  t.  The FORMAT.*
3a30: 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20 72 65  * string must re
3a40: 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68  quire no more th
3a50: 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e 74 65  an this one inte
3a60: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  ger argument.  I
3a70: 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20 69 6e  f.** You pass in
3a80: 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67   a format string
3a90: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6d   that requires m
3aa0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 72 67  ore than one arg
3ab0: 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68  ument,.** bad th
3ac0: 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70 65 6e  ings will happen
3ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3af0: 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28  st_snprintf_int(
3b00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3b10: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3b20: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3b30: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3b40: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3b50: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3b60: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3b80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3b90: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3bb0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3bc0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
3bd0: 20 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e   zStr[100];.  in
3be0: 74 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b  t n = atoi(argv[
3bf0: 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  1]);.  const cha
3c00: 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67  r *zFormat = arg
3c10: 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d  v[2];.  int a1 =
3c20: 20 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a   atoi(argv[3]);.
3c30: 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a    if( n>sizeof(z
3c40: 53 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f  Str) ) n = sizeo
3c50: 66 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  f(zStr);.  sqlit
3c60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3c70: 6f 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20  of(zStr), zStr, 
3c80: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
3c90: 70 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20  pqrstuvwxyz");. 
3ca0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3cb0: 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d  f(n, zStr, zForm
3cc0: 61 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41  at, a1);.  Tcl_A
3cd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3ce0: 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20  rp, zStr, 0);.  
3cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d10: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a  _OMIT_GET_TABLE.
3d20: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3d30: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
3d40: 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52  _printf  DB  FOR
3d50: 4d 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d  MAT  STRING  ?--
3d60: 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a  no-counts?.**.**
3d70: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
3d80: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3d90: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
3da0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
3db0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
3dc0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
3dd0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
3de0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
3df0: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
3e00: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
3e10: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
3e20: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
3e30: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
3e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
3e50: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
3e60: 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
3e70: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3e80: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3e90: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3ea0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3eb0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3ec0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3ed0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3ef0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3f20: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
3f30: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
3f40: 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f  ite3 *db;.  Tcl_
3f50: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69  DString str;.  i
3f60: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
3f70: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Err = 0;.  int n
3f80: 52 6f 77 20 3d 20 30 2c 20 6e 43 6f 6c 20 3d 20  Row = 0, nCol = 
3f90: 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73  0;.  char **aRes
3fa0: 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
3fb0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
3fc0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
3fd0: 6e 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31  nt resCount = -1
3fe0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3ff0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
4000: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
4010: 67 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74  gv[4], &resCount
4020: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4030: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4040: 61 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21  argc!=4 && argc!
4050: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
4060: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4070: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4080: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4090: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
40a0: 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54    " DB FORMAT ST
40b0: 52 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30  RING ?COUNT?", 0
40c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
40d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
40e0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
40f0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4100: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4110: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
4120: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4130: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
4140: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
4150: 5b 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20  [2],argv[3]);.  
4160: 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20  if( argc==5 ){. 
4170: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4180: 67 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53  get_table(db, zS
4190: 71 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c  ql, &aResult, 0,
41a0: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65   0, &zErr);.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
41c0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28  lite3_get_table(
41d0: 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75  db, zSql, &aResu
41e0: 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c  lt, &nRow, &nCol
41f0: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65  , &zErr);.    re
4200: 73 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31  sCount = (nRow+1
4210: 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71  )*nCol;.  }.  sq
4220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
4230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
4240: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
4250: 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72  ), zBuf, "%d", r
4260: 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  c);.  Tcl_Append
4270: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4280: 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
4290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
42a0: 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b    if( argc==4 ){
42b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
42c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
42d0: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22  Buf), zBuf, "%d"
42e0: 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54  , nRow);.      T
42f0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4300: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
4310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4320: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
4330: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
4340: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63   nCol);.      Tc
4350: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4360: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4370: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
4380: 3b 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b  ; i<resCount; i+
4390: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
43a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
43b0: 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f  rp, aResult[i] ?
43c0: 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e   aResult[i] : "N
43d0: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
43e0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
43f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4400: 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  rp, zErr);.  }. 
4410: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61   sqlite3_free_ta
4420: 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20  ble(aResult);.  
4430: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
4440: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
4450: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
4460: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
4470: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
4480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
4490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
44a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
44b0: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20  _OMIT_GET_TABLE 
44c0: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  */.../*.** Usage
44d0: 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  :  sqlite3_last_
44e0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a  insert_rowid DB.
44f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
4500: 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
4510: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
4520: 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74  nt insert..*/.st
4530: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
4540: 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 61 73 74  TCLAPI test_last
4550: 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20 2a  _rowid(.  void *
4560: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4570: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4580: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4590: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
45a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
45b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
45c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
45d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
45e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
45f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
4600: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4610: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
4630: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
4640: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
4650: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4660: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4670: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4680: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4690: 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c 20  gv[0], " DB\"", 
46a0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
46b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
46c0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
46d0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
46e0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
46f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
4700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4710: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
4720: 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65  , "%lld", sqlite
4730: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
4740: 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  wid(db));.  Tcl_
4750: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4760: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
4770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4780: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4790: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20  e:  sqlite3_key 
47a0: 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74  DB KEY.**.** Set
47b0: 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a   the codec key..
47c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
47d0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
47e0: 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _key(.  void *No
47f0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4800: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4810: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4820: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4830: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4840: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4860: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4870: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4880: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4890: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
48a0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23  argument */.){.#
48b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
48c0: 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
48d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
48e0: 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
48f0: 54 43 4c 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  TCL).  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  );.  sqlite3_key
4a20: 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  (db, zKey, nKey)
4a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4a40: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4a50: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4a60: 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a  e3_rekey DB KEY.
4a70: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
4a80: 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73   codec key..*/.s
4a90: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
4aa0: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 6b  _TCLAPI test_rek
4ab0: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4ac0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4ad0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4ae0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4af0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4b00: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4b10: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4b30: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4b40: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4b50: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4b60: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4b70: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
4b80: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
4b90: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4ba0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4bb0: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4bc0: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4bd0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4be0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4bf0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4c00: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4c10: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4c20: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4c30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4c40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4c50: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
4c60: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4c70: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4c80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
4c90: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4ca0: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4cb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4cc0: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4cd0: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4ce0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4cf0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4d00: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4d10: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4d20: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4d30: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
4d50: 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69  LITE_TCLAPI sqli
4d60: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20  te_test_close(. 
4d70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4d80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4d90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4da0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4db0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4dc0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4dd0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4df0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4e00: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4e20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4e30: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4e40: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
4e50: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
4e60: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
4e70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
4e80: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
4e90: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
4ea0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
4eb0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
4ec0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4ed0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4ee0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
4ef0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
4f00: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
4f10: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
4f20: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
4f30: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
4f40: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
4f50: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
4f60: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
4f70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
4f90: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
4fa0: 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65  2 DB.**.** Close
4fb0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  s the database o
4fc0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
4fd0: 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  _open..*/.static
4fe0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
4ff0: 50 49 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  PI sqlite_test_c
5000: 6c 6f 73 65 5f 76 32 28 0a 20 20 76 6f 69 64 20  lose_v2(.  void 
5010: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
5020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5030: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
5040: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
5050: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
5060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5070: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5090: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
50a0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
50b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
50c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
50d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
50e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
50f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
5100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5110: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
5120: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
5130: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
5140: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
5150: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
5160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5170: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
5180: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
5190: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
51a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
51b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
51c0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 3b 0a 20 20  close_v2(db);.  
51d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
51e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
51f0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
5200: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
5210: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5220: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5230: 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f  tion of the x_co
5240: 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f  alesce() functio
5250: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  n..** Return the
5260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
5270: 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5290: 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28  d t1_ifnullFunc(
52a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
52b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
52c0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
52d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
52e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
52f0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
5300: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
5310: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
5320: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
5330: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  v[i]) ){.      i
5340: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt n = sqlite3_v
5350: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
5360: 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i]);.      sqlit
5370: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5380: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
5390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
53a0: 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20  t(argv[i]),.    
53b0: 20 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f        n, SQLITE_
53c0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
53d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
53e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73   }.}../*.** Thes
53f0: 65 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74  e are test funct
5400: 69 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20  ions.    hex8() 
5410: 69 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61  interprets its a
5420: 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54  rgument as.** UT
5430: 46 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  F8 and returns a
5440: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20   hex encoding.  
5450: 68 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70  hex16le() interp
5460: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
5470: 74 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20  t.** as UTF16le 
5480: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
5490: 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  x encoding..*/.s
54a0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46  tatic void hex8F
54b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
54c0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
54d0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
54e0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
54f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5500: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5510: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
5520: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5530: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5540: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
5550: 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32  zeof(zBuf)/2 - 2
5560: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
5570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5580: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
5590: 29 2d 69 2a 32 2c 20 26 7a 42 75 66 5b 69 2a 32  )-i*2, &zBuf[i*2
55a0: 5d 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 29  ], "%02x", z[i])
55b0: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32  ;.  }.  zBuf[i*2
55c0: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
55d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20  _result_text(p, 
55e0: 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c  (char*)zBuf, -1,
55f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5600: 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  T);.}.#ifndef SQ
5610: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
5620: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 31  static void hex1
5630: 36 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  6Func(sqlite3_co
5640: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72  ntext *p, int ar
5650: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5660: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
5670: 73 74 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  st unsigned shor
5680: 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20  t int *z;.  int 
5690: 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34  i;.  char zBuf[4
56a0: 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  00];.  z = sqlit
56b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
56c0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
56d0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
56e0: 75 66 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69  uf)/4 - 4 && z[i
56f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
5700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5710: 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 34 2c 20  zeof(zBuf)-i*4, 
5720: 26 7a 42 75 66 5b 69 2a 34 5d 2c 22 25 30 34 78  &zBuf[i*4],"%04x
5730: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
5740: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d   }.  zBuf[i*4] =
5750: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
5760: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
5770: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
5780: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5790: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
57a0: 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74   A structure int
57b0: 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d  o which to accum
57c0: 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73  ulate text..*/.s
57d0: 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69  truct dstr {.  i
57e0: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53  nt nAlloc;  /* S
57f0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  pace allocated *
5800: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
5810: 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a   /* Space used *
5820: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
5830: 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f   /* The space */
5840: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .};../*.** Appen
5850: 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72  d text to a dstr
5860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5870: 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63  dstrAppend(struc
5880: 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74  t dstr *p, const
5890: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69   char *z, int di
58a0: 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  vider){.  int n 
58b0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
58c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
58d0: 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41   + n + 2 > p->nA
58e0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72  lloc ){.    char
58f0: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e   *zNew;.    p->n
5900: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
5910: 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20  c*2 + n + 200;. 
5920: 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65     zNew = sqlite
5930: 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  3_realloc(p->z, 
5940: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
5950: 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( zNew==0 ){. 
5960: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5970: 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d  e(p->z);.      m
5980: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5990: 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72  of(*p));.      r
59a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
59b0: 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20   p->z = zNew;.  
59c0: 7d 0a 20 20 69 66 28 20 64 69 76 69 64 65 72 20  }.  if( divider 
59d0: 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b  && p->nUsed>0 ){
59e0: 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73  .    p->z[p->nUs
59f0: 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b  ed++] = divider;
5a00: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
5a10: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a  ->z[p->nUsed], z
5a20: 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73  , n+1);.  p->nUs
5a30: 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  ed += n;.}../*.*
5a40: 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61  * Invoked for ea
5a50: 63 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d  ch callback from
5a60: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
5a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
5a80: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28  xecFuncCallback(
5a90: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
5aa0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
5ab0: 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73  gv, char **NotUs
5ac0: 65 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  ed){.  struct ds
5ad0: 74 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  tr *p = (struct 
5ae0: 64 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69  dstr*)pData;.  i
5af0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5b00: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
5b10: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d     if( argv[i]==
5b20: 30 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41  0 ){.      dstrA
5b30: 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c  ppend(p, "NULL",
5b40: 20 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   ' ');.    }else
5b50: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
5b60: 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27  nd(p, argv[i], '
5b70: 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   ');.    }.  }. 
5b80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5b90: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5ba0: 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69  on of the x_sqli
5bb0: 74 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69  te_exec() functi
5bc0: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
5bd0: 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69  on takes.** a si
5be0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e  ngle argument an
5bf0: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78  d attempts to ex
5c00: 65 63 75 74 65 20 74 68 61 74 20 61 72 67 75 6d  ecute that argum
5c10: 65 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e  ent as SQL code.
5c20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65  .** This is ille
5c30: 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73  gal and should s
5c40: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49  et the SQLITE_MI
5c50: 53 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65  SUSE flag on the
5c60: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
5c70: 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57   2004-Jan-07:  W
5c80: 65 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 74  e have changed t
5c90: 68 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c  his to make it l
5ca0: 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
5cb0: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
5cc0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e  rom within a fun
5cd0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a  ction call.  .**
5ce0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
5cf0: 65 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20  e simulates the 
5d00: 65 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67  effect of having
5d10: 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 74   two threads att
5d20: 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74  empt to.** use t
5d30: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5d40: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5d50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5d60: 64 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  d sqlite3ExecFun
5d70: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5d80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
5d90: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
5da0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5db0: 61 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74  argv.){.  struct
5dc0: 20 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65   dstr x;.  memse
5dd0: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
5de0: 78 29 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  x));.  (void)sql
5df0: 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74  ite3_exec((sqlit
5e00: 65 33 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  e3*)sqlite3_user
5e10: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a  _data(context),.
5e20: 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
5e30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5e40: 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20  argv[0]),.      
5e50: 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b  execFuncCallback
5e60: 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , &x, 0);.  sqli
5e70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5e80: 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e  context, x.z, x.
5e90: 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52  nUsed, SQLITE_TR
5ea0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
5eb0: 74 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d  te3_free(x.z);.}
5ec0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
5ed0: 74 61 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31  tation of tkt221
5ee0: 33 66 75 6e 63 28 29 2c 20 61 20 73 63 61 6c 61  3func(), a scala
5ef0: 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  r function that 
5f00: 74 61 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a  takes exactly.**
5f10: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20 49   one argument. I
5f20: 74 20 68 61 73 20 74 77 6f 20 69 6e 74 65 72 65  t has two intere
5f30: 73 74 69 6e 67 20 66 65 61 74 75 72 65 73 3a 0a  sting features:.
5f40: 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73  **.** * It calls
5f50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5f60: 65 78 74 28 29 20 33 20 74 69 6d 65 73 20 6f 6e  ext() 3 times on
5f70: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 73 71   the argument sq
5f80: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a  lite3_value*..**
5f90: 20 20 20 49 66 20 74 68 65 20 74 68 72 65 65 20     If the three 
5fa0: 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65  pointers returne
5fb0: 64 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  d are not the sa
5fc0: 6d 65 20 61 6e 20 53 51 4c 20 65 72 72 6f 72 20  me an SQL error 
5fd0: 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a  is raised..**.**
5fe0: 20 2a 20 4f 74 68 65 72 77 69 73 65 20 69 74 20   * Otherwise it 
5ff0: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
6000: 66 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  f the text repre
6010: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74 73  sentation of its
6020: 20 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20   .**   argument 
6030: 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
6040: 20 74 68 65 20 56 44 42 45 20 72 65 70 72 65 73   the VDBE repres
6050: 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 4d 65  entation is a Me
6060: 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69  m* cell .**   wi
6070: 74 68 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20  th the MEM_Term 
6080: 66 6c 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a  flag clear. .**.
6090: 2a 2a 20 54 69 63 6b 65 74 20 23 32 32 31 33 20  ** Ticket #2213 
60a0: 63 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65  can therefore be
60b0: 20 74 65 73 74 65 64 20 62 79 20 65 76 61 6c 75   tested by evalu
60c0: 61 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  ating the follow
60d0: 69 6e 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65  ing.** SQL expre
60e0: 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74  ssion:.**.**   t
60f0: 6b 74 32 32 31 33 66 75 6e 63 28 74 6b 74 32 32  kt2213func(tkt22
6100: 31 33 66 75 6e 63 28 27 61 20 73 74 72 69 6e 67  13func('a string
6110: 27 29 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '));.*/.static v
6120: 6f 69 64 20 74 6b 74 32 32 31 33 46 75 6e 63 74  oid tkt2213Funct
6130: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
6140: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6150: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a   .  int argc,  .
6160: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6170: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
6180: 6e 54 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65  nText;.  unsigne
6190: 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  d char const *zT
61a0: 65 78 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ext1;.  unsigned
61b0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65   char const *zTe
61c0: 78 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt2;.  unsigned 
61d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78  char const *zTex
61e0: 74 33 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73  t3;..  nText = s
61f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6200: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  es(argv[0]);.  z
6210: 54 65 78 74 31 20 3d 20 73 71 6c 69 74 65 33 5f  Text1 = sqlite3_
6220: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6230: 30 5d 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20  0]);.  zText2 = 
6240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6250: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
6260: 54 65 78 74 33 20 3d 20 73 71 6c 69 74 65 33 5f  Text3 = sqlite3_
6270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6280: 30 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78  0]);..  if( zTex
6290: 74 31 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54  t1!=zText2 || zT
62a0: 65 78 74 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a  ext2!=zText3 ){.
62b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
62c0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
62d0: 2c 20 22 74 6b 74 32 32 31 33 20 69 73 20 6e 6f  , "tkt2213 is no
62e0: 74 20 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20  t fixed", -1);. 
62f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
6300: 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20   *zCopy = (char 
6310: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6320: 28 6e 54 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d  (nText);.    mem
6330: 63 70 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74  cpy(zCopy, zText
6340: 31 2c 20 6e 54 65 78 74 29 3b 0a 20 20 20 20 73  1, nText);.    s
6350: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6360: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70  xt(context, zCop
6370: 79 2c 20 6e 54 65 78 74 2c 20 73 71 6c 69 74 65  y, nText, sqlite
6380: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
6390: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
63a0: 69 6e 67 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ing SQL function
63b0: 20 74 61 6b 65 73 20 34 20 61 72 67 75 6d 65 6e   takes 4 argumen
63c0: 74 73 2e 20 20 54 68 65 20 32 6e 64 20 61 6e 64  ts.  The 2nd and
63d0: 0a 2a 2a 20 34 74 68 20 61 72 67 75 6d 65 6e 74  .** 4th argument
63e0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
63f0: 74 68 65 73 65 20 73 74 72 69 6e 67 73 3a 20 20  these strings:  
6400: 27 74 65 78 74 27 2c 20 27 74 65 78 74 31 36 27  'text', 'text16'
6410: 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63  ,.** or 'blob' c
6420: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6430: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  API functions.**
6440: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
6450: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a  _value_text().**
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20  lue_text16().** 
6480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6490: 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20  ue_blob().**.** 
64a0: 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
64b0: 6e 74 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  nt is a string, 
64c0: 65 69 74 68 65 72 20 27 62 79 74 65 73 27 20 6f  either 'bytes' o
64d0: 72 20 27 62 79 74 65 73 31 36 27 20 6f 72 20 27  r 'bytes16' or '
64e0: 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73  noop',.** corres
64f0: 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 73 3a  ponding to APIs:
6500: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
6510: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6520: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6530: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
6540: 29 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a  ).**      noop.*
6550: 2a 0a 2a 2a 20 54 68 65 20 41 50 49 73 20 64 65  *.** The APIs de
6560: 73 69 67 6e 61 74 65 64 20 62 79 20 74 68 65 20  signated by the 
6570: 32 6e 64 20 74 68 72 6f 75 67 68 20 34 74 68 20  2nd through 4th 
6580: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
6590: 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  plied.** to the 
65a0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
65b0: 6e 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 65  n order.  If the
65c0: 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e   pointers return
65d0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 65 63  ed by the.** sec
65e0: 6f 6e 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61  ond and fourth a
65f0: 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68  re different, th
6600: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6610: 6e 73 20 31 2e 20 20 4f 74 68 65 72 77 69 73 65  ns 1.  Otherwise
6620: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
6630: 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a  e returns 0..**.
6640: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6650: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
6660: 20 74 6f 20 73 65 65 20 77 68 65 6e 20 72 65 74   to see when ret
6670: 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 73 20 66  urned pointers f
6680: 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74  rom.** the _text
6690: 28 29 2c 20 5f 74 65 78 74 31 36 28 29 20 61 6e  (), _text16() an
66a0: 64 20 5f 62 6c 6f 62 28 29 20 41 50 49 73 20 62  d _blob() APIs b
66b0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74 65  ecome invalidate
66c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
66d0: 64 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f  d ptrChngFunctio
66e0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
66f0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
6700: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
6710: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6720: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
6730: 76 6f 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20  void *p1, *p2;. 
6740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
6750: 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  d;.  if( argc!=4
6760: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d   ) return;.  zCm
6770: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6780: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6790: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
67a0: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
67b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
67c0: 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d  mp(zCmd,"text")=
67d0: 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28  =0 ){.    p1 = (
67e0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
67f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6800: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
6820: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
6830: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78  trcmp(zCmd, "tex
6840: 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t16")==0 ){.    
6850: 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p1 = (const void
6860: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6870: 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b  text16(argv[0]);
6880: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6890: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
68a0: 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20   "blob")==0 ){. 
68b0: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
68c0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
68d0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
68e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
68f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d  eturn;.  }.  zCm
6900: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6910: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6920: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
6930: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
6940: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
6950: 6d 70 28 7a 43 6d 64 2c 22 62 79 74 65 73 22 29  mp(zCmd,"bytes")
6960: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6970: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
6980: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6990: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
69a0: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
69b0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74  trcmp(zCmd, "byt
69c0: 65 73 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  es16")==0 ){.   
69d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
69e0: 79 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b  ytes16(argv[0]);
69f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6a00: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6a10: 20 22 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20   "noop")==0 ){. 
6a20: 20 20 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67     /* do nothing
6a30: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
6a40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
6a50: 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Cmd = (const cha
6a60: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6a70: 5f 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a  _text(argv[3]);.
6a80: 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20    if( zCmd==0 ) 
6a90: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74  return;.  if( st
6aa0: 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22  rcmp(zCmd,"text"
6ab0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d  )==0 ){.    p2 =
6ac0: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6ad0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6ae0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64  (argv[0]);.#ifnd
6af0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
6b00: 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28  TF16.  }else if(
6b10: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74   strcmp(zCmd, "t
6b20: 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20  ext16")==0 ){.  
6b30: 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p2 = (const vo
6b40: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
6b50: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
6b60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
6b70: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
6b80: 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b  d, "blob")==0 ){
6b90: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6ba0: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6bb0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
6bc0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
6bd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
6be0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6bf0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70  t(context, p1!=p
6c00: 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  2);.}../*.** Thi
6c10: 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72  s SQL function r
6c20: 65 74 75 72 6e 73 20 61 20 64 69 66 66 65 72 65  eturns a differe
6c30: 6e 74 20 61 6e 73 77 65 72 20 65 61 63 68 20 74  nt answer each t
6c40: 69 6d 65 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ime it is called
6c50: 2c 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  , even if.** the
6c60: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74   arguments are t
6c70: 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
6c80: 69 63 20 76 6f 69 64 20 6e 6f 6e 64 65 74 65 72  ic void nondeter
6c90: 6d 69 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e  ministicFunction
6ca0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6cb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6cc0: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
6cd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6ce0: 72 67 76 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  rgv.){.  static 
6cf0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 73  int cnt = 0;.  s
6d00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6d10: 74 28 63 6f 6e 74 65 78 74 2c 20 63 6e 74 2b 2b  t(context, cnt++
6d20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
6d30: 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  e:  sqlite3_crea
6d40: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a  te_function DB.*
6d50: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
6d60: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6d70: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
6d80: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
6d90: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
6da0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
6db0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73   named "x_coales
6dc0: 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ce".  This funct
6dd0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
6de0: 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68  e thing.** as th
6df0: 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e  e "coalesce" fun
6e00: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
6e10: 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73  ction also regis
6e20: 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63  ters an SQL func
6e30: 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78  tion.** named "x
6e40: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68  _sqlite_exec" th
6e50: 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  at invokes sqlit
6e60: 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f  e3_exec().  Invo
6e70: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65  king sqlite3_exe
6e80: 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77  c().** in this w
6e90: 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65  ay is illegal re
6ea0: 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75  cursion and shou
6eb0: 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ld raise an SQLI
6ec0: 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e  TE_MISUSE error.
6ed0: 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69  .** The effect i
6ee0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79  s similar to try
6ef0: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73  ing to use the s
6f00: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
6f10: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  nection from.** 
6f20: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74  two threads at t
6f30: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a  he same time..**
6f40: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
6f50: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
6f60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
6f70: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
6f80: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
6f90: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6fa0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  on function whil
6fb0: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
6fc0: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
6fd0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
6fe0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
6ff0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a  etection logic..
7000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
7010: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
7020: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7030: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7040: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
7050: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
7060: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
7070: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7080: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7090: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
70a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
70b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
70c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
70e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
70f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
7100: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
7110: 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  db;..  if( argc!
7120: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
7130: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7140: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
7150: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
7160: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
7170: 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20   " DB\"", 0);.  
7180: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7190: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
71a0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
71b0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
71c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
71d0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
71e0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
71f0: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65  ion(db, "x_coale
7200: 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  sce", -1, SQLITE
7210: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
7220: 20 20 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63     t1_ifnullFunc
7230: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
7240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7260: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7270: 28 64 62 2c 20 22 68 65 78 38 22 2c 20 31 2c 20  (db, "hex8", 1, 
7280: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
7290: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
72a0: 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c  IC,.          0,
72b0: 20 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29   hex8Func, 0, 0)
72c0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
72d0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
72e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
72f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7300: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7310: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78  unction(db, "hex
7320: 31 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  16", 1, SQLITE_U
7330: 54 46 31 36 20 7c 20 53 51 4c 49 54 45 5f 44 45  TF16 | SQLITE_DE
7340: 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20  TERMINISTIC,.   
7350: 20 20 20 20 20 20 20 30 2c 20 68 65 78 31 36 46         0, hex16F
7360: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
7370: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 3d  #endif.  if( rc=
7380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
73a0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
73b0: 62 2c 20 22 74 6b 74 32 32 31 33 66 75 6e 63 22  b, "tkt2213func"
73c0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
73d0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74   0, .          t
73e0: 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20  kt2213Function, 
73f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7400: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7410: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7420: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7430: 6f 6e 28 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f  on(db, "pointer_
7440: 63 68 61 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49  change", 4, SQLI
7450: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7460: 20 20 20 20 20 20 70 74 72 43 68 6e 67 46 75 6e        ptrChngFun
7470: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
7480: 7d 0a 0a 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  }..  /* Function
7490: 73 20 63 6f 75 6e 74 65 72 31 28 29 20 61 6e 64  s counter1() and
74a0: 20 63 6f 75 6e 74 65 72 32 28 29 20 68 61 76 65   counter2() have
74b0: 20 74 68 65 20 73 61 6d 65 20 69 6d 70 6c 65 6d   the same implem
74c0: 65 6e 74 61 74 69 6f 6e 20 2d 20 74 68 65 79 0a  entation - they.
74d0: 20 20 2a 2a 20 62 6f 74 68 20 72 65 74 75 72 6e    ** both return
74e0: 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
74f0: 74 65 67 65 72 20 77 69 74 68 20 65 61 63 68 20  teger with each 
7500: 63 61 6c 6c 2e 20 20 42 75 74 20 63 6f 75 6e 74  call.  But count
7510: 65 72 31 28 29 20 69 73 20 6d 61 72 6b 65 64 0a  er1() is marked.
7520: 20 20 2a 2a 20 61 73 20 6e 6f 6e 2d 64 65 74 65    ** as non-dete
7530: 72 6d 69 6e 69 73 74 69 63 20 61 6e 64 20 63 6f  rministic and co
7540: 75 6e 74 65 72 32 28 29 20 69 73 20 6d 61 72 6b  unter2() is mark
7550: 65 64 20 61 73 20 64 65 74 65 72 6d 69 6e 69 73  ed as determinis
7560: 74 69 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tic..  */.  if( 
7570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7580: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7590: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
75a0: 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 31 22  n(db, "counter1"
75b0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
75c0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  8,.          0, 
75d0: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
75e0: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
75f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
7600: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7610: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7620: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7630: 20 22 63 6f 75 6e 74 65 72 32 22 2c 20 2d 31 2c   "counter2", -1,
7640: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c   SQLITE_UTF8|SQL
7650: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7660: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7670: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
7680: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
7690: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
76a0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
76b0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c    /* Use the sql
76c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
76d0: 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72  tion16() API her
76e0: 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75  e. Mainly for fu
76f0: 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a  n, but also .  *
7700: 2a 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  * because it is 
7710: 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68  not tested anywh
7720: 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69  ere else. */.  i
7730: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7740: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f   ){.    const vo
7750: 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20  id *zUtf16;.    
7760: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
7770: 56 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Val;.    sqlite3
7780: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
7790: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61  >mutex);.    pVa
77a0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
77b0: 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
77c0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
77d0: 70 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c  pVal, -1, "x_sql
77e0: 69 74 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54  ite_exec", SQLIT
77f0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
7800: 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66  TATIC);.    zUtf
7810: 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  16 = sqlite3Valu
7820: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
7830: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
7840: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
7850: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7860: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7870: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
7880: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7890: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
78a0: 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36  ion16(db, zUtf16
78b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
78c0: 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46     1, SQLITE_UTF
78d0: 31 36 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45  16, db, sqlite3E
78e0: 78 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  xecFunc, 0, 0);.
78f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7900: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
7910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7920: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7930: 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
7940: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ..  if( sqlite3T
7950: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
7960: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
7970: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7980: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
7990: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
79a0: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
79b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
79c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
79d0: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
79e0: 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28  ent the x_count(
79f0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
7a00: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f  tion..**.** x_co
7a10: 75 6e 74 28 29 20 63 6f 75 6e 74 73 20 74 68 65  unt() counts the
7a20: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e   number of non-n
7a30: 75 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ull arguments.  
7a40: 42 75 74 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  But there are.**
7a50: 20 73 6f 6d 65 20 74 77 69 73 74 73 20 66 6f 72   some twists for
7a60: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
7a70: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
7a80: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f  argument to x_co
7a90: 75 6e 74 28 29 20 69 73 20 34 30 20 74 68 65 6e  unt() is 40 then
7aa0: 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69   a UTF-8 error i
7ab0: 73 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e  s reported.** on
7ac0: 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
7ad0: 6f 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e 74 28  on.  If x_count(
7ae0: 34 31 29 20 69 73 20 73 65 65 6e 2c 20 74 68 65  41) is seen, the
7af0: 6e 20 61 20 55 54 46 2d 31 36 20 65 72 72 6f 72  n a UTF-16 error
7b00: 0a 2a 2a 20 69 73 20 72 65 70 6f 72 74 65 64 20  .** is reported 
7b10: 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  on the step func
7b20: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 74 6f  tion.  If the to
7b30: 74 61 6c 20 63 6f 75 6e 74 20 69 73 20 34 32 2c  tal count is 42,
7b40: 20 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38   then.** a UTF-8
7b50: 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
7b60: 65 64 20 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69  ed on the finali
7b70: 7a 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ze function..*/.
7b80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 74  typedef struct t
7b90: 31 43 6f 75 6e 74 43 74 78 20 74 31 43 6f 75 6e  1CountCtx t1Coun
7ba0: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 74 31 43  tCtx;.struct t1C
7bb0: 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20  ountCtx {.  int 
7bc0: 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69  n;.};.static voi
7bd0: 64 20 74 31 43 6f 75 6e 74 53 74 65 70 28 0a 20  d t1CountStep(. 
7be0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7bf0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
7c00: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
7c10: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7c20: 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70  .  t1CountCtx *p
7c30: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
7c40: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
7c50: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
7c60: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61  f(*p));.  if( (a
7c70: 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  rgc==0 || SQLITE
7c80: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
7c90: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
7ca0: 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20 20  ]) ) && p ){.   
7cb0: 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69   p->n++;.  }.  i
7cc0: 66 28 20 61 72 67 63 3e 30 20 29 7b 0a 20 20 20  f( argc>0 ){.   
7cd0: 20 69 6e 74 20 76 20 3d 20 73 71 6c 69 74 65 33   int v = sqlite3
7ce0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7cf0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  0]);.    if( v==
7d00: 34 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  40 ){.      sqli
7d10: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7d20: 28 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c 75 65  (context, "value
7d30: 20 6f 66 20 34 30 20 68 61 6e 64 65 64 20 74 6f   of 40 handed to
7d40: 20 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a   x_count", -1);.
7d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d60: 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7d 65  MIT_UTF16.    }e
7d70: 6c 73 65 20 69 66 28 20 76 3d 3d 34 31 20 29 7b  lse if( v==41 ){
7d80: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
7d90: 72 20 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 5d  r zUtf16ErrMsg[]
7da0: 20 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c   = { 0, 0x61, 0,
7db0: 20 30 78 36 32 2c 20 30 2c 20 30 78 36 33 2c 20   0x62, 0, 0x63, 
7dc0: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20  0, 0, 0};.      
7dd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7de0: 72 72 6f 72 31 36 28 63 6f 6e 74 65 78 74 2c 20  rror16(context, 
7df0: 26 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 31 2d  &zUtf16ErrMsg[1-
7e00: 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e  SQLITE_BIGENDIAN
7e10: 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  ], -1);.#endif. 
7e20: 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74     }.  }.}   .st
7e30: 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e  atic void t1Coun
7e40: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7e50: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7e60: 78 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  xt){.  t1CountCt
7e70: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7e80: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7e90: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
7ea0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
7eb0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
7ec0: 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20  ->n==42 ){.     
7ed0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7ee0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
7ef0: 78 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74  x_count totals t
7f00: 6f 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20  o 42", -1);.    
7f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7f20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
7f30: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
7f40: 6e 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  n : 0);.    }.  
7f50: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
7f60: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
7f70: 54 45 44 0a 73 74 61 74 69 63 20 76 6f 69 64 20  TED.static void 
7f80: 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 28  legacyCountStep(
7f90: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7fa0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7fb0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7fc0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7fd0: 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  ){.  /* no-op */
7fe0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7ff0: 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c  legacyCountFinal
8000: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
8010: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
8020: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8030: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
8040: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
8050: 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a  ount(context));.
8060: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8070: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
8080: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
8090: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74   DB.**.** Call t
80a0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
80b0: 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f  e_function API o
80c0: 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  n the given data
80d0: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  base in order.**
80e0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e   to create a fun
80f0: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63  ction named "x_c
8100: 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66 75 6e  ount".  This fun
8110: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
8120: 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 69 6c 74  .** to the built
8130: 2d 69 6e 20 63 6f 75 6e 74 28 29 20 66 75 6e 63  -in count() func
8140: 74 69 6f 6e 2c 20 77 69 74 68 20 61 20 66 65 77  tion, with a few
8150: 20 73 70 65 63 69 61 6c 20 71 75 69 72 6b 73 0a   special quirks.
8160: 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74  ** for testing t
8170: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  he sqlite3_resul
8180: 74 5f 65 72 72 6f 72 28 29 20 41 50 49 73 2e 0a  t_error() APIs..
8190: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
81a0: 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f  al motivation fo
81b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
81c0: 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  as to be able to
81d0: 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c   call the.** sql
81e0: 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
81f0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77  egate function w
8200: 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20  hile a query is 
8210: 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f  in progress in o
8220: 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20  rder.** to test 
8230: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
8240: 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69  E detection logi
8250: 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65 2e 74  c.  See misuse.t
8260: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  est..**.** This 
8270: 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61 74 65  routine was late
8280: 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 65  r extended to te
8290: 73 74 20 74 68 65 20 75 73 65 20 6f 66 20 73 71  st the use of sq
82a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
82b0: 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61  or().** within a
82c0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
82d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a  ns..**.** Later:
82e0: 20 49 74 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20   It is now also 
82f0: 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65 67 69  extended to regi
8300: 73 74 65 72 20 74 68 65 20 61 67 67 72 65 67 61  ster the aggrega
8310: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  te function.** "
8320: 6c 65 67 61 63 79 5f 63 6f 75 6e 74 28 29 22 20  legacy_count()" 
8330: 77 69 74 68 20 74 68 65 20 73 75 70 70 6c 69 65  with the supplie
8340: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
8350: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  e. This is used.
8360: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 64  ** to test the d
8370: 65 70 72 65 63 61 74 65 64 20 73 71 6c 69 74 65  eprecated sqlite
8380: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
8390: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
83a0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
83b0: 4c 41 50 49 20 74 65 73 74 5f 63 72 65 61 74 65  LAPI test_create
83c0: 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f  _aggregate(.  vo
83d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
83e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
83f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8490: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
84a0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
84b0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
84c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
84d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
84e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
84f0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8500: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
8510: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
8520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8530: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
8540: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
8550: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
8560: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8570: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
8580: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8590: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
85a0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
85b0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74 31  , 0, 0,.      t1
85c0: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
85d0: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66  tFinalize);.  if
85e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
85f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
8600: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8610: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74  ion(db, "x_count
8620: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
8630: 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  8, 0, 0,.       
8640: 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43   t1CountStep,t1C
8650: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20  ountFinalize);. 
8660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
8670: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
8680: 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  D.  if( rc==SQLI
8690: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
86a0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
86b0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c  _function(db, "l
86c0: 65 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c  egacy_count", 0,
86d0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
86e0: 30 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61 63  0,.        legac
86f0: 79 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67 61  yCountStep, lega
8700: 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a  cyCountFinalize.
8710: 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
8720: 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  f.  if( sqlite3T
8730: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
8740: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
8750: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8760: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
8770: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
8780: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
8790: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
87a0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
87b0: 73 61 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45  sage:  printf TE
87c0: 58 54 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75  XT.**.** Send ou
87d0: 74 70 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20  tput to printf. 
87e0: 20 55 73 65 20 74 68 69 73 20 72 61 74 68 65 72   Use this rather
87f0: 20 74 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65   than puts to me
8800: 72 67 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  rge the output.*
8810: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
8820: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 64   sequence with d
8830: 65 62 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73  ebugging printfs
8840: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43   inserted into C
8850: 20 63 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75   code..** Puts u
8860: 73 65 73 20 61 20 73 65 70 61 72 61 74 65 20 62  ses a separate b
8870: 75 66 66 65 72 20 61 6e 64 20 64 65 62 75 67 67  uffer and debugg
8880: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77  ing statements w
8890: 69 6c 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a  ill be out of.**
88a0: 20 73 65 71 75 65 6e 63 65 20 69 66 20 69 74 20   sequence if it 
88b0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  is used..*/.stat
88c0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
88d0: 4c 41 50 49 20 74 65 73 74 5f 70 72 69 6e 74 66  LAPI test_printf
88e0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
88f0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
8900: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
8910: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
8920: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
8930: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
8940: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
8950: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8960: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8970: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
8980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8990: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
89a0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ment */.){.  if(
89b0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
89c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
89d0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
89e0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
89f0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8a00: 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22         " TEXT\""
8a10: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
8a20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
8a30: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
8a40: 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74   argv[1]);.  ret
8a50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
8a60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
8a70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8a80: 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  nt FORMAT INTEGE
8a90: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8aa0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8ab0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8ac0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
8ad0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
8ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
8af0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8b00: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
8b10: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8b20: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8b30: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8b40: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8b50: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8b60: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8b80: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8ba0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8bb0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8bc0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8bd0: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
8be0: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
8bf0: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
8c00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8c10: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8c20: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8c30: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8c40: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
8c50: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
8c60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8c70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
8c80: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
8c90: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
8ca0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
8cb0: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
8cc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8cd0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8ce0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
8cf0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
8d00: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
8d10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8d20: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
8d30: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
8d40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
8d50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8d60: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8d70: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
8d80: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8d90: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8da0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8db0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
8dc0: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
8dd0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
8de0: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
8df0: 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f  intf_int64(.  vo
8e00: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
8e10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8e20: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8e30: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8e40: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8e50: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8e60: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8e70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8e80: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8e90: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8ea0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8eb0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8ec0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
8ed0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33  sqlite_int64 a[3
8ee0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
8ef0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8f00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8f10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8f20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8f30: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8f40: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
8f50: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
8f60: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8f70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8f80: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
8f90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8fa0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 61 72 67  qlite3Atoi64(arg
8fb0: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 73  v[i], &a[i-2], s
8fc0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 61  qlite3Strlen30(a
8fd0: 72 67 76 5b 69 5d 29 2c 20 53 51 4c 49 54 45 5f  rgv[i]), SQLITE_
8fe0: 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20 20 54  UTF8) ){.      T
8ff0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9000: 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65 6e  interp, "argumen
9010: 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
9020: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 22   64-bit integer"
9030: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
9040: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9050: 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71    }.  }.  z = sq
9060: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9070: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9080: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9090: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
90a0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
90b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
90c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
90d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
90e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
90f0: 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54  _long FORMAT INT
9100: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
9110: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
9120: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
9130: 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20  ee long integer 
9140: 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54 68 69  arguments.   Thi
9150: 73 20 6d 69 67 68 74 20 62 65 20 74 68 65 0a 2a  s might be the.*
9160: 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  * same as sqlite
9170: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72  3_mprintf_int or
9180: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9190: 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64 69 6e  _int64, dependin
91a0: 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  g on.** platform
91b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
91c0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
91d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
91e0: 6e 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ng(.  void *NotU
91f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9200: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9210: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9220: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9230: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9240: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9260: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9270: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9280: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9290: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
92a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
92b0: 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74  nt i;.  long int
92c0: 20 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33   a[3];.  int b[3
92d0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
92e0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
92f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9310: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9320: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9330: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
9340: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
9350: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9360: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9370: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
9380: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
9390: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
93a0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d  , argv[i], &b[i-
93b0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
93c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d  _ERROR;.    a[i-
93d0: 32 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62  2] = (long int)b
93e0: 5b 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32  [i-2];.    a[i-2
93f0: 5d 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c  ] &= (((u64)1)<<
9400: 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29  (sizeof(int)*8))
9410: 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  -1;.  }.  z = sq
9420: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9430: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9440: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9460: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
9470: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
9480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9490: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
94a0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
94b0: 5f 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45  _str FORMAT INTE
94c0: 47 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49  GER INTEGER STRI
94d0: 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  NG.**.** Call mp
94e0: 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69  rintf with two i
94f0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
9500: 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20   and one string 
9510: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  argument.*/.stat
9520: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
9530: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
9540: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
9550: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9560: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9570: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9580: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9590: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
95a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
95b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
95c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
95d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
95e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
95f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9600: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
9610: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
9620: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
9630: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
9640: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
9650: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9660: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9670: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9680: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9690: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
96a0: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
96b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
96c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
96d0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
96e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
96f0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9700: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9710: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9720: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9730: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9740: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9750: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
9760: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
9770: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9780: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
9790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
97a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
97b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
97c0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
97d0: 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45  rintf_str INTEGE
97e0: 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  R FORMAT INTEGER
97f0: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9800: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9810: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9820: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9830: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9840: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9850: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
9860: 49 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  I sqlite3_snprin
9870: 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  tf_str(.  void *
9880: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9890: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
98a0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
98b0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
98c0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
98d0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
98e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
98f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
9900: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
9910: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9920: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9930: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9940: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
9950: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
9960: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 35  *z;.  if( argc<5
9970: 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20 20   || argc>6 ){.  
9980: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9990: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
99a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
99b0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
99c0: 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20 46  ,.       " INT F
99d0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53  ORMAT INT INT ?S
99e0: 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20  TRING?\"", 0);. 
99f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9a00: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
9a10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9a20: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29  , argv[1], &n) )
9a30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9a40: 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  R;.  if( n<0 ){.
9a50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 20  sult(interp, "N 
9a70: 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  must be non-nega
9a80: 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  tive", 0);.    r
9a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9aa0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20  .  }.  for(i=3; 
9ab0: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
9ac0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9ad0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ae0: 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72 6e  a[i-3]) ) return
9af0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9b00: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    z = sqlite3_ma
9b10: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73  lloc( n+1 );.  s
9b20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9b30: 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61  n, z, argv[2], a
9b40: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
9b50: 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55  4 ? argv[5] : NU
9b60: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
9b70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9b80: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9b90: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9ba0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9bb0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9bc0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
9bd0: 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  le FORMAT INTEGE
9be0: 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45  R INTEGER DOUBLE
9bf0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9c00: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
9c10: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
9c20: 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72  nd one double ar
9c30: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
9c40: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
9c50: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
9c60: 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  tf_double(.  voi
9c70: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9c80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9c90: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9ca0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9cb0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9cc0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9cd0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9ce0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9cf0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9d00: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9d10: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9d20: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9d30: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
9d40: 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  i;.  double r;. 
9d50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
9d60: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
9d70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9d80: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9d90: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9da0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
9db0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
9dc0: 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22  NT INT DOUBLE\""
9dd0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9de0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9df0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
9e00: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9e10: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9e20: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32   argv[i], &a[i-2
9e30: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9e40: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
9e50: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
9e60: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
9e70: 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &r) ) return TCL
9e80: 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
9e90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9ea0: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9eb0: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
9ec0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9ed0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
9ee0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9ef0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9f00: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9f10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9f20: 61 6c 65 64 20 46 4f 52 4d 41 54 20 44 4f 55 42  aled FORMAT DOUB
9f30: 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20  LE DOUBLE.**.** 
9f40: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9f50: 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c  h a single doubl
9f60: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
9f70: 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74 20   is the product 
9f80: 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72  of the.** two ar
9f90: 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62  guments given ab
9fa0: 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  ove.  This is us
9fb0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f  ed to generate o
9fc0: 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65  verflow and unde
9fd0: 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73  rflow.** doubles
9fe0: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68   to test that th
9ff0: 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ey are converted
a000: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74   properly..*/.st
a010: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
a020: 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d  TCLAPI sqlite3_m
a030: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20  printf_scaled(. 
a040: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
a050: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a060: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a070: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a080: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a090: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a0a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
a0b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a0c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a0d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
a0f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
a100: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
a110: 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a  .  double r[2];.
a120: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
a130: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
a140: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a150: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a160: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a170: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a180: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
a190: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22  DOUBLE DOUBLE\""
a1a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a1b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a1c0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
a1d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
a1e0: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
a1f0: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b  rp, argv[i], &r[
a200: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
a210: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a220: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a230: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30  ntf(argv[1], r[0
a240: 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  ]*r[1]);.  Tcl_A
a250: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a260: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
a270: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
a280: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a290: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
a2a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2b0: 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53  stronly FORMAT S
a2c0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
a2d0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
a2e0: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
a2f0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
a300: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
a310: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
a320: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
a330: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
a340: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
a350: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
a360: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
a370: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
a380: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
a390: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
a3a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
a3b0: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
a3c0: 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f  tf_stronly(.  vo
a3d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
a3e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a3f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
a440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
a460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
a470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
a480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
a490: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
a4a0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
a4b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a4c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a4d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a4e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a4f0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a500: 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20  RMAT STRING\"", 
a510: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a520: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a530: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a540: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67  ntf(argv[1], arg
a550: 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
a560: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a570: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
a580: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
a590: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a5a0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
a5b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
a5c0: 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48  xdouble FORMAT H
a5d0: 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  EX.**.** Call mp
a5e0: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a5f0: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a600: 65 6e 74 20 77 68 69 63 68 20 69 73 20 64 65 72  ent which is der
a610: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ived from the.**
a620: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63   hexadecimal enc
a630: 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45  oding of an IEEE
a640: 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
a650: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
a660: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
a670: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a  intf_hexdouble(.
a680: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a690: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a6a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a6b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a6c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a6d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a6e0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a6f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a700: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a710: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
a730: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a740: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
a750: 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a  *z;.  double r;.
a760: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
a770: 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f  1, x2;.  sqlite_
a780: 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20  uint64 d;.  if( 
a790: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
a7a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a7b0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
a7c0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a7d0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
a7e0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53        " FORMAT S
a7f0: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
a800: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a810: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73  OR;.  }.  if( ss
a820: 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25  canf(argv[2], "%
a830: 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26  08x%08x", &x2, &
a840: 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  x1)!=2 ){.    Tc
a850: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a860: 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75  nterp, "2nd argu
a870: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31  ment should be 1
a880: 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  6-characters of 
a890: 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  hex", 0);.    re
a8a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a8b0: 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20    }.  d = x2;.  
a8c0: 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31  d = (d<<32) + x1
a8d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26  ;.  memcpy(&r, &
a8e0: 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  d, sizeof(r));. 
a8f0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
a900: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29  intf(argv[1], r)
a910: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
a920: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
a930: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
a940: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
a950: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a960: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a970: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
a980: 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  che ?BOOLEAN?.**
a990: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
a9a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a9b0: 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69  RED_CACHE).stati
a9c0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
a9d0: 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  API test_enable_
a9e0: 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65 6e 74  shared(.  Client
a9f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
aa00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
aa10: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
aa20: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
aa30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
aa40: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
aa50: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
aa60: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
aa70: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
aa80: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
aa90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
aaa0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
aab0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
aac0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
aad0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
aae0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
aaf0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20  t enable;.  int 
ab00: 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ret = 0;..  if( 
ab10: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
ab20: 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
ab30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ab40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f  p, 1, objv, "?BO
ab50: 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65  OLEAN?");.    re
ab60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ab70: 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69    }.  ret = sqli
ab80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
ab90: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
aba0: 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d  ed;..  if( objc=
abb0: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  =2 ){.    if( Tc
abc0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
abd0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
abe0: 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b  [1], &enable) ){
abf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ac00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ac10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ac20: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
ac30: 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20  che(enable);.   
ac40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ac50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
ac60: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ac70: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
ac80: 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c  3ErrStr(rc), TCL
ac90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
aca0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
acb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63  ;.    }.  }.  Tc
acc0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
acd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
ace0: 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a  oleanObj(ret));.
acf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ad00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  .}.#endif..../*.
ad10: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
ad20: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
ad30: 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20 20 20  t_codes   DB    
ad40: 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74  BOOLEAN.**.*/.st
ad50: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
ad60: 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78 74 65  TCLAPI test_exte
ad70: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
ad80: 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
ad90: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
ada0: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
adb0: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
adc0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
add0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
ade0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
adf0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
ae00: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
ae10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
ae20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ae30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ae40: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
ae50: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
ae60: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
ae70: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
ae80: 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c  nt enable;.  sql
ae90: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
aea0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
aeb0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
aec0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
aed0: 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b  , "DB BOOLEAN");
aee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aef0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
af00: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
af10: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
af20: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
af30: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
af40: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
af50: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
af60: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
af70: 32 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72  2], &enable) ) r
af80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
af90: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  .  sqlite3_exten
afa0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
afb0: 28 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20  (db, enable);.  
afc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
afd0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
afe0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
aff0: 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73  n_number.**.*/.s
b000: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
b010: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 69 62  _TCLAPI test_lib
b020: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a  version_number(.
b030: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b040: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b050: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b060: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b070: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b080: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b090: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b0a0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b0b0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b0c0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b0e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b0f0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b100: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b110: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b120: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
b130: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b140: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b150: 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  bj(sqlite3_libve
b160: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29  rsion_number()))
b170: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
b180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
b190: 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  e: sqlite3_table
b1a0: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
b1b0: 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61   DB dbname tblna
b1c0: 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f  me colname.**.*/
b1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
b1e0: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74  TE_TCLAPI test_t
b1f0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
b200: 64 61 74 61 28 0a 20 20 43 6c 69 65 6e 74 44 61  data(.  ClientDa
b210: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
b220: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
b230: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
b240: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
b250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
b270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
b280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
b290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
b2a0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
b2b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
b2c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
b2d0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b2e0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
b2f0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
b300: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
b310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
b320: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b330: 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zTbl;.  const ch
b340: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20  ar *zCol;.  int 
b350: 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rc;.  Tcl_Obj *p
b360: 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  Ret;..  const ch
b370: 61 72 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20  ar *zDatatype;. 
b380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
b390: 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74  llseq;.  int not
b3a0: 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d  null;.  int prim
b3b0: 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75  arykey;.  int au
b3c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20  toincrement;..  
b3d0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
b3e0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
b3f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b400: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
b410: 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61  "DB dbname tblna
b420: 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20  me colname");.  
b430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b440: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
b450: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
b460: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b470: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
b480: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b490: 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f  OR;.  zDb = Tcl_
b4a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
b4b0: 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c  ]);.  zTbl = Tcl
b4c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b4d0: 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 6f 62  3]);.  zCol = ob
b4e0: 6a 63 3d 3d 35 20 3f 20 54 63 6c 5f 47 65 74 53  jc==5 ? Tcl_GetS
b4f0: 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 20 3a  tring(objv[4]) :
b500: 20 30 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65   0;..  if( strle
b510: 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20  n(zDb)==0 ) zDb 
b520: 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 0;..  rc = sql
b530: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
b540: 6e 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a  n_metadata(db, z
b550: 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20  Db, zTbl, zCol, 
b560: 0a 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70  .      &zDatatyp
b570: 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e  e, &zCollseq, &n
b580: 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79  otnull, &primary
b590: 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d  key, &autoincrem
b5a0: 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  ent);..  if( rc!
b5b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b5c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
b5e0: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
b5f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b600: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
b610: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
b620: 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
b630: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b640: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b650: 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74  StringObj(zDatat
b660: 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ype, -1));.  Tcl
b670: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b680: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
b690: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b6a0: 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a  zCollseq, -1));.
b6b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b6c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
b6d0: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
b6e0: 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54  j(notnull));.  T
b6f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b700: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b710: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70   Tcl_NewIntObj(p
b720: 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54  rimarykey));.  T
b730: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b740: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b750: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61   Tcl_NewIntObj(a
b760: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a  utoincrement));.
b770: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
b780: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
b790: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
b7a0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
b7b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
b7c0: 4c 4f 42 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  LOB..static int 
b7d0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 62 6c  SQLITE_TCLAPI bl
b7e0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
b7f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b800: 6e 74 65 72 70 2c 20 0a 20 20 54 63 6c 5f 4f 62  nterp, .  Tcl_Ob
b810: 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73 71 6c 69 74  j *pObj,.  sqlit
b820: 65 33 5f 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62  e3_blob **ppBlob
b830: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
b840: 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54   int n;..  z = T
b850: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
b860: 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20  Obj(pObj, &n);. 
b870: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
b880: 20 2a 70 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20   *ppBlob = 0;.  
b890: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
b8a0: 6f 74 55 73 65 64 3b 0a 20 20 20 20 54 63 6c 5f  otUsed;.    Tcl_
b8b0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
b8c0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
b8d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
b8e0: 20 20 0a 20 20 20 20 63 68 61 6e 6e 65 6c 20 3d    .    channel =
b8f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
b900: 69 6e 74 65 72 70 2c 20 7a 2c 20 26 6e 6f 74 55  interp, z, &notU
b910: 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 21 63  sed);.    if( !c
b920: 68 61 6e 6e 65 6c 20 29 20 72 65 74 75 72 6e 20  hannel ) return 
b930: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  TCL_ERROR;..    
b940: 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 6e 65  Tcl_Flush(channe
b950: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 65 6b  l);.    Tcl_Seek
b960: 28 63 68 61 6e 6e 65 6c 2c 20 30 2c 20 53 45 45  (channel, 0, SEE
b970: 4b 5f 53 45 54 29 3b 0a 0a 20 20 20 20 69 6e 73  K_SET);..    ins
b980: 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f  tanceData = Tcl_
b990: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
b9a0: 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b  ceData(channel);
b9b0: 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20 2a  .    *ppBlob = *
b9c0: 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a  ((sqlite3_blob *
b9d0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b  *)instanceData);
b9e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
b9f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
ba00: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
ba10: 50 49 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f  PI test_blob_reo
ba20: 70 65 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  pen(.  ClientDat
ba30: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
ba40: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
ba50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ba60: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ba70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ba80: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
ba90: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
baa0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
bab0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bac0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
bad0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
bae0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
baf0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
bb00: 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69  .  Tcl_WideInt i
bb10: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
bb20: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
bb30: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
bb40: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
bb50: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
bb60: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
bb70: 22 43 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29  "CHANNEL ROWID")
bb80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
bb90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
bba0: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
bbb0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
bbc0: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
bbd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bbe0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57  ;.  if( Tcl_GetW
bbf0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
bc00: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
bc10: 69 52 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e  iRowid) ) return
bc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
bc30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
bc40: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
bc50: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63  Rowid);.  if( rc
bc60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bc70: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
bc80: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
bc90: 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
bca0: 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  rc), TCL_VOLATIL
bcb0: 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  E);.  }..  retur
bcc0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
bcd0: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
bce0: 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ERROR);.}..#endi
bcf0: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
bd00: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
bd10: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48  ollation_v2 DB-H
bd20: 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50  ANDLE NAME CMP-P
bd30: 52 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a  ROC DEL-PROC.**.
bd40: 2a 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72  **   This Tcl pr
bd50: 6f 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  oc is used for t
bd60: 65 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72  esting the exper
bd70: 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c  imental.**   sql
bd80: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
bd90: 61 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72  ation_v2() inter
bda0: 66 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  face..*/.struct 
bdb0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b  TestCollationX {
bdc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
bdd0: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
bde0: 20 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62   *pCmp;.  Tcl_Ob
bdf0: 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65  j *pDel;.};.type
be00: 64 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43  def struct TestC
be10: 6f 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f  ollationX TestCo
be20: 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63  llationX;.static
be30: 20 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65   void testCreate
be40: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69  CollationDel(voi
be50: 64 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74  d *pCtx){.  Test
be60: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20  CollationX *p = 
be70: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
be80: 2a 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72  *)pCtx;..  int r
be90: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
bea0: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
beb0: 70 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pDel, TCL_EVAL_D
bec0: 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47  IRECT|TCL_EVAL_G
bed0: 4c 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63  LOBAL);.  if( rc
bee0: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
bef0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
bf00: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
bf10: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
bf20: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29  efCount(p->pCmp)
bf30: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
bf40: 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20  ount(p->pDel);. 
bf50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76   sqlite3_free((v
bf60: 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74  oid *)p);.}.stat
bf70: 69 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74  ic int testCreat
bf80: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20  eCollationCmp(. 
bf90: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
bfa0: 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73  nt nLeft,.  cons
bfb0: 74 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20  t void *zLeft,. 
bfc0: 20 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63   int nRight,.  c
bfd0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68  onst void *zRigh
bfe0: 74 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  t.){.  TestColla
bff0: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
c000: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
c010: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  x;.  Tcl_Obj *pS
c020: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c  cript = Tcl_Dupl
c030: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70  icateObj(p->pCmp
c040: 29 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20  );.  int iRes = 
c050: 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  0;..  Tcl_IncrRe
c060: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
c070: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c090: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0a0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c0b0: 29 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b  )zLeft, nLeft));
c0c0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c0d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c0e0: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0f0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c100: 29 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29  )zRight,nRight))
c110: 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  ;..  if( TCL_OK!
c120: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
c130: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
c140: 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  t, TCL_EVAL_DIRE
c150: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
c160: 41 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  AL).   || TCL_OK
c170: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
c180: 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54  Obj(p->interp, T
c190: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
c1a0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65  p->interp), &iRe
c1b0: 73 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f  s).  ){.    Tcl_
c1c0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
c1d0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
c1e0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c1f0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20  nt(pScript);..  
c200: 72 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73  return iRes;.}.s
c210: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
c220: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 72 65  _TCLAPI test_cre
c230: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c240: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
c250: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
c260: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
c270: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c280: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c290: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c2a0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c2b0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c2c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c2d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c2e0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c2f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c300: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c310: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c320: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
c330: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
c340: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
c350: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
c360: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c370: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c380: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e  jv, "DB-HANDLE N
c390: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
c3a0: 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74  -PROC");.    ret
c3b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c3c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
c3d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
c3e0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c3f0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
c400: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
c410: 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61    p = (TestColla
c420: 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f  tionX *)sqlite3_
c430: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65  malloc(sizeof(Te
c440: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a  stCollationX));.
c450: 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76    p->pCmp = objv
c460: 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d  [3];.  p->pDel =
c470: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69   objv[4];.  p->i
c480: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
c490: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c4a0: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
c4b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c4c0: 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20  p->pDel);..  rc 
c4d0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c4e0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
c4f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c500: 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20  objv[2]), 16, . 
c510: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20       (void *)p, 
c520: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c530: 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61  ionCmp, testCrea
c540: 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20  teCollationDel. 
c550: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c560: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
c570: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c580: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ult(interp, "sql
c590: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c5a0: 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20  ate_v2() failed 
c5b0: 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20  to detect ".    
c5c0: 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e    "an invalid en
c5d0: 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29  coding", (char*)
c5e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
c5f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c600: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
c610: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c620: 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  (db, Tcl_GetStri
c630: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c  ng(objv[2]), SQL
c640: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
c650: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
c660: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c670: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
c680: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
c690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a  .}../*.** USAGE:
c6b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c6c0: 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e  function_v2 DB N
c6d0: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57  AME NARG ENC ?SW
c6e0: 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76  ITCHES?.**.** Av
c6f0: 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73  ailable switches
c700: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66   are:.**.**   -f
c710: 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a  unc    SCRIPT.**
c720: 20 20 20 2d 73 74 65 70 20 20 20 20 53 43 52 49     -step    SCRI
c730: 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20  PT.**   -final  
c740: 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65   SCRIPT.**   -de
c750: 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a  stroy SCRIPT.*/.
c760: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
c770: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
c780: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c790: 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74 65 46  ;.struct CreateF
c7a0: 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63  unctionV2 {.  Tc
c7b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c7c0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75  ;.  Tcl_Obj *pFu
c7d0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
c7e0: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
c7f0: 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63  r function invoc
c800: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ation */.  Tcl_O
c810: 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20  bj *pStep;      
c820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
c830: 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74  ript for agg. st
c840: 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  ep invocation */
c850: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e  .  Tcl_Obj *pFin
c860: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
c870: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
c880: 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69   agg. finalizati
c890: 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  on invocation */
c8a0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73  .  Tcl_Obj *pDes
c8b0: 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20  troy;           
c8c0: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
c8d0: 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74   script */.};.st
c8e0: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e  atic void cf2Fun
c8f0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
c900: 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
c910: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
c920: 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69  **aArg){.}.stati
c930: 63 20 76 6f 69 64 20 63 66 32 53 74 65 70 28 73  c void cf2Step(s
c940: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c950: 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73  ctx, int nArg, s
c960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c970: 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  Arg){.}.static v
c980: 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c  oid cf2Final(sql
c990: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
c9a0: 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  x){.}.static voi
c9b0: 64 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69  d cf2Destroy(voi
c9c0: 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65  d *pUser){.  Cre
c9d0: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
c9e0: 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74 69   = (CreateFuncti
c9f0: 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20  onV2 *)pUser;.. 
ca00: 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26   if( p->interp &
ca10: 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b  & p->pDestroy ){
ca20: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63  .    int rc = Tc
ca30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
ca40: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72  nterp, p->pDestr
ca50: 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  oy, 0);.    if( 
ca60: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c  rc!=TCL_OK ) Tcl
ca70: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
ca80: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
ca90: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63  ..  if( p->pFunc
caa0: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
cab0: 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a  unt(p->pFunc); .
cac0: 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29    if( p->pStep )
cad0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
cae0: 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20  t(p->pStep); .  
caf0: 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20  if( p->pFinal ) 
cb00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cb10: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
cb20: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
cb30: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
cb40: 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b  nt(p->pDestroy);
cb50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65   .  sqlite3_free
cb60: 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  (p);.}.static in
cb70: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
cb80: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
cb90: 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e  tion_v2(.  Clien
cba0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
cbb0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
cbc0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
cbd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cbf0: 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20  he invoking TCL 
cc00: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
cc10: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
cc40: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
cc50: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
cc60: 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  []           /* 
cc70: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
cc80: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
cc90: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
cca0: 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e  har *zFunc;.  in
ccb0: 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e  t nArg;.  int en
ccc0: 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74  c;.  CreateFunct
ccd0: 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20  ionV2 *p;.  int 
cce0: 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  i;.  int rc;..  
ccf0: 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20  struct EncTable 
cd00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
cd10: 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20   *zEnc;.    int 
cd20: 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20  enc;.  } aEnc[] 
cd30: 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c  = {.    {"utf8",
cd40: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
cd50: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c  },.    {"utf16",
cd60: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20     SQLITE_UTF16 
cd70: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65  },.    {"utf16le
cd80: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
cd90: 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  E },.    {"utf16
cda0: 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  be", SQLITE_UTF1
cdb0: 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79  6BE },.    {"any
cdc0: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e  ",     SQLITE_AN
cdd0: 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30  Y },.    {"0", 0
cde0: 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f   }.  };..  if( o
cdf0: 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32  bjc<5 || (objc%2
ce00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )==0 ){.    Tcl_
ce10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ce20: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
ce30: 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20  B NAME NARG ENC 
ce40: 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20  SWITCHES...");. 
ce50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ce60: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
ce70: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ce80: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ce90: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
cea0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ceb0: 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20  RROR;.  zFunc = 
cec0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ced0: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
cee0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
cef0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
cf00: 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e   &nArg) ) return
cf10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
cf20: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
cf30: 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65  omObjStruct(inte
cf40: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e  rp, objv[4], aEn
cf50: 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30  c, sizeof(aEnc[0
cf60: 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  ]), .          "
cf70: 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65  encoding", 0, &e
cf80: 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  nc).  ){.    ret
cf90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cfa0: 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b   }.  enc = aEnc[
cfb0: 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d  enc].enc;..  p =
cfc0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
cfd0: 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e  sizeof(CreateFun
cfe0: 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73  ctionV2));.  ass
cff0: 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73  ert( p );.  mems
d000: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
d010: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
d020: 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  ));.  p->interp 
d030: 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72  = interp;..  for
d040: 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b  (i=5; i<objc; i+
d050: 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77  =2){.    int iSw
d060: 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20  itch;.    const 
d070: 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d  char *azSwitch[]
d080: 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73   = {"-func", "-s
d090: 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20  tep", "-final", 
d0a0: 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a  "-destroy", 0};.
d0b0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
d0c0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
d0d0: 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53  rp, objv[i], azS
d0e0: 77 69 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c  witch, "switch",
d0f0: 20 30 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b   0, &iSwitch) ){
d100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
d110: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ree(p);.      re
d120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d130: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
d140: 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20  h( iSwitch ){.  
d150: 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70      case 0: p->p
d160: 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Func = objv[i+1]
d170: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d180: 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70      case 1: p->p
d190: 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Step = objv[i+1]
d1a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d1b0: 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70      case 2: p->p
d1c0: 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31  Final = objv[i+1
d1d0: 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];     break;.  
d1e0: 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70      case 3: p->p
d1f0: 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69  Destroy = objv[i
d200: 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  +1];   break;.  
d210: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
d220: 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e  >pFunc ) p->pFun
d230: 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  c = Tcl_Duplicat
d240: 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20  eObj(p->pFunc); 
d250: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20  .  if( p->pStep 
d260: 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c  ) p->pStep = Tcl
d270: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
d280: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
d290: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70  p->pFinal ) p->p
d2a0: 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c  Final = Tcl_Dupl
d2b0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e  icateObj(p->pFin
d2c0: 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  al); .  if( p->p
d2d0: 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65  Destroy ) p->pDe
d2e0: 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c  stroy = Tcl_Dupl
d2f0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73  icateObj(p->pDes
d300: 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70  troy); ..  if( p
d310: 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e  ->pFunc ) Tcl_In
d320: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46  crRefCount(p->pF
d330: 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  unc); .  if( p->
d340: 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72  pStep ) Tcl_Incr
d350: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65  RefCount(p->pSte
d360: 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46  p); .  if( p->pF
d370: 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52  inal ) Tcl_IncrR
d380: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61  efCount(p->pFina
d390: 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44  l); .  if( p->pD
d3a0: 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63  estroy ) Tcl_Inc
d3b0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65  rRefCount(p->pDe
d3c0: 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d  stroy); ..  rc =
d3d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d3e0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
d3f0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
d400: 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20  , (void *)p, .  
d410: 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20      (p->pFunc ? 
d420: 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20  cf2Func : 0),.  
d430: 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20      (p->pStep ? 
d440: 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20  cf2Step : 0),.  
d450: 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f      (p->pFinal ?
d460: 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a   cf2Final : 0),.
d470: 20 20 20 20 20 20 63 66 32 44 65 73 74 72 6f 79        cf2Destroy
d480: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
d490: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4a0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
d4b0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
d4c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d4d0: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
d4e0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
d4f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d500: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
d510: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
d520: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
d530: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
d540: 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20   DB-HANDLE FILE 
d550: 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63  ?PROC?.*/.static
d560: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
d570: 50 49 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74  PI test_load_ext
d580: 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ension(.  Client
d590: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
d5a0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
d5b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d5c0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d5d0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d5e0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d5f0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d600: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d610: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d620: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d630: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d640: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d650: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d660: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
d670: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
d680: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
d690: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  rc;.  char *zDb;
d6a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
d6b0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20    char *zProc = 
d6c0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
d6d0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
d6e0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=4 && objc!=3 )
d6f0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
d700: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d710: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
d720: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29  LE FILE ?PROC?")
d730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d740: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
d750: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
d760: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46  g(objv[1]);.  zF
d770: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
d780: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
d790: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
d7a0: 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47     zProc = Tcl_G
d7b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
d7c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  );.  }..  /* Ext
d7d0: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
d7e0: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
d7f0: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
d800: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
d810: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
d820: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
d830: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
d840: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d850: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
d860: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
d870: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
d880: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d890: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
d8a0: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
d8b0: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
d8c0: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
d8d0: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
d8e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64   /* Call the und
d8f0: 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69  erlying C functi
d900: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
d910: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
d920: 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f  o .  ** TCL_ERRO
d930: 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65  R and load any e
d940: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f  rror string into
d950: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
d960: 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72  . If no .  ** er
d970: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d980: 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20  rc to TCL_OK..  
d990: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d9a0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
d9b0: 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49  SION.  rc = SQLI
d9c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72  TE_ERROR;.  zErr
d9d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
d9e0: 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f  tf("this build o
d9f0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
da00: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
da10: 0a 20 20 28 76 6f 69 64 29 7a 50 72 6f 63 3b 0a  .  (void)zProc;.
da20: 20 20 28 76 6f 69 64 29 7a 46 69 6c 65 3b 0a 23    (void)zFile;.#
da30: 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69  else.  rc = sqli
da40: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
da50: 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  on(db, zFile, zP
da60: 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e  roc, &zErr);.#en
da70: 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
da80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
da90: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
daa0: 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72  erp, zErr ? zErr
dab0: 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54   : "", TCL_VOLAT
dac0: 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  ILE);.    rc = T
dad0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  CL_ERROR;.  }els
dae0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  e{.    rc = TCL_
daf0: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
db00: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20  3_free(zErr);.. 
db10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
db20: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
db30: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
db40: 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e  extension DB-HAN
db50: 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61  DLE ONOFF.*/.sta
db60: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
db70: 43 4c 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c  CLAPI test_enabl
db80: 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74  e_load(.  Client
db90: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
dba0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
dbb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dbc0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
dbd0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
dbe0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
dbf0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
dc00: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
dc10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dc20: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
dc30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
dc40: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
dc50: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
dc60: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
dc70: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
dc80: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
dc90: 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f   *zDb;.  int ono
dca0: 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ff;..  if( objc!
dcb0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
dcc0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dcd0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
dce0: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a  HANDLE ONOFF");.
dcf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dd00: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
dd10: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
dd20: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  objv[1]);..  /* 
dd30: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
dd40: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
dd50: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
dd60: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
dd70: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
dd80: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
dd90: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
dda0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ddb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
ddc0: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
ddd0: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
dde0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ddf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
de00: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
de10: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
de20: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
de30: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
de40: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f  ..  /* Get the o
de50: 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a  noff parameter *
de60: 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  /.  if( Tcl_GetB
de70: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
de80: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
de90: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65  onoff) ){.    re
dea0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
deb0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
dec0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
ded0: 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70  ENSION.  Tcl_App
dee0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
def0: 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  , "this build om
df00: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
df10: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
df20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
df30: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  OR;.#else.  sqli
df40: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
df50: 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e  extension(db, on
df60: 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  off);.  return T
df70: 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  CL_OK;.#endif.}.
df80: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
df90: 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a  qlite_abort.**.*
dfa0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
dfb0: 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65  rocess immediate
dfc0: 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74  ly.  This is not
dfd0: 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77   a clean shutdow
dfe0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  n..** This comma
dff0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  nd is used to te
e000: 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61 62  st the recoverab
e010: 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61 62  ility of a datab
e020: 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76  ase in.** the ev
e030: 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d  ent of a program
e040: 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69   crash..*/.stati
e050: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
e060: 41 50 49 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  API sqlite_abort
e070: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
e080: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
e090: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
e0a0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
e0b0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
e0c0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
e0d0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
e0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e0f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e100: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
e110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e120: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
e130: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 64  ment */.){.#if d
e140: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
e150: 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68 69 73  .  /* We do this
e160: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20  , otherwise the 
e170: 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74 20 77  test will halt w
e180: 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65 73 73  ith a popup mess
e190: 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20 77 65  age.   * that we
e1a0: 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b 20 61   have to click a
e1b0: 77 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 74  way before the t
e1c0: 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  est will continu
e1d0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74 5f  e..   */.  _set_
e1e0: 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72 28 20  abort_behavior( 
e1f0: 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54 46  0, _CALL_REPORTF
e200: 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20  AULT );.#endif. 
e210: 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20 61 73   exit(255);.  as
e220: 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20  sert( interp==0 
e230: 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c  );   /* This wil
e240: 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f  l always fail */
e250: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
e260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
e270: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
e280: 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e   is a user-defin
e290: 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ed SQL function 
e2a0: 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a  whose purpose.**
e2b0: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20   is to test the 
e2c0: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
e2d0: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
e2e0: 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63  ic void testFunc
e2f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e300: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
e310: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
e320: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68  ue **argv){.  wh
e330: 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a  ile( argc>=2 ){.
e340: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e350: 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73  zArg0 = (char*)s
e360: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e370: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
e380: 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20  if( zArg0 ){.   
e390: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
e3a0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20  3StrICmp(zArg0, 
e3b0: 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  "int") ){.      
e3c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e3d0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
e3e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
e3f0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e400: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e410: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e420: 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20  "int64")==0 ){. 
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
e440: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
e450: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
e460: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
e470: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
e480: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e490: 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67  mp(zArg0,"string
e4a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e4b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e4c0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
e4d0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
e4e0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
e4f0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
e500: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
e510: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NT);.      }else
e520: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e530: 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c  Cmp(zArg0,"doubl
e540: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
e550: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e560: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
e570: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
e580: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b  ouble(argv[1]));
e590: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e5a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e5b0: 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30  zArg0,"null")==0
e5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e5d0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
e5e0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
e5f0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
e600: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
e610: 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20  value")==0 ){.  
e620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
e630: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
e640: 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33  xt, argv[sqlite3
e650: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
e660: 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1])]);.      }el
e670: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  se{.        goto
e680: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
e690: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e6a0: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
e6b0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
e6c0: 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72  rgc -= 2;.    ar
e6d0: 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  gv += 2;.  }.  r
e6e0: 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75  eturn;..error_ou
e6f0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  t:.  sqlite3_res
e700: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
e710: 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  t,"first argumen
e720: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
e730: 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74  of: ".      "int
e740: 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f   int64 string do
e750: 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22  uble null value"
e760: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
e770: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f  Usage:   sqlite_
e780: 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
e790: 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45  nction  DB  NAME
e7a0: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
e7b0: 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e  the test SQL fun
e7c0: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
e7d0: 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74  abase DB under t
e7e0: 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f  he name NAME..*/
e7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
e800: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72  TE_TCLAPI test_r
e810: 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20  egister_func(.  
e820: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
e830: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e840: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e850: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e860: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e870: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e880: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
e890: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e8a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e8b0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
e8c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
e8d0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
e8e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e8f0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
e900: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
e910: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e920: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
e930: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
e940: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
e950: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
e960: 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22  B FUNCTION-NAME"
e970: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
e980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
e990: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
e9a0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
e9b0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
e9c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
e9d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
e9e0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
e9f0: 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
ea00: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20  ITE_UTF8, 0, .  
ea10: 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c      testFunc, 0,
ea20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
ea30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ea40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ea50: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
ea60: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
ea70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ea80: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  }.  if( sqlite3T
ea90: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
eaa0: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
eab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
ead0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
eae0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
eaf0: 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46  e  STMT .**.** F
eb00: 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d  inalize a statem
eb10: 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
eb20: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
eb30: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 66 69 6e  _TCLAPI test_fin
eb40: 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20  alize(.  void * 
eb50: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
eb60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
eb70: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
eb80: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
eb90: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
eba0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
ebb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
ebc0: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20  te3 *db = 0;..  
ebd0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
ebe0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ebf0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
ec00: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
ec10: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
ec20: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
ec30: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
ec40: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
ec50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ec60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
ec70: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
ec80: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
ec90: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
eca0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
ecb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
ecc0: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
ecd0: 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62     db = StmtToDb
ece0: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
ecf0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
ed00: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54  lize(pStmt);.  T
ed10: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ed20: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
ed30: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
ed40: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
ed50: 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65   db && sqlite3Te
ed60: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
ed70: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
ed80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ed90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
eda0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
edb0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
edc0: 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20  tus  STMT  CODE 
edd0: 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a   RESETFLAG.**.**
ede0: 20 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Get the value o
edf0: 66 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74  f a status count
ee00: 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d  er from a statem
ee10: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
ee20: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
ee30: 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
ee40: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
ee50: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
ee60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ee70: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
ee80: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ee90: 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75  ].){.  int iValu
eea0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d  e;.  int i, op =
eeb0: 20 30 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20   0, resetFlag;. 
eec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
eed0: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Name;.  sqlite3_
eee0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
eef0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
ef00: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
ef10: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ef20: 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70   int op;.  } aOp
ef30: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
ef40: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ef50: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20  FULLSCAN_STEP", 
ef60: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ef70: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
ef80: 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  P   },.    { "SQ
ef90: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
efa0: 53 4f 52 54 22 2c 20 20 20 20 20 20 20 20 20 20  SORT",          
efb0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
efc0: 54 55 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20  TUS_SORT        
efd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
efe0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
eff0: 41 55 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20  AUTOINDEX",     
f000: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f010: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20  TUS_AUTOINDEX   
f020: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f030: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f040: 56 4d 5f 53 54 45 50 22 2c 20 20 20 20 20 20 20  VM_STEP",       
f050: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f060: 54 55 53 5f 56 4d 5f 53 54 45 50 20 20 20 20 20  TUS_VM_STEP     
f070: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66      },.  };.  if
f080: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
f090: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f0a0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
f0b0: 76 2c 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54  v, "STMT PARAMET
f0c0: 45 52 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a  ER RESETFLAG");.
f0d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f0e0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
f0f0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
f100: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f110: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
f120: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
f130: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70  TCL_ERROR;.  zOp
f140: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
f150: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
f160: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
f170: 79 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29  ySize(aOp); i++)
f180: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
f190: 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  (aOp[i].zName, z
f1a0: 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  OpName)==0 ){.  
f1b0: 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e      op = aOp[i].
f1c0: 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
f1d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f1e0: 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f   i>=ArraySize(aO
f1f0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  p) ){.    if( Tc
f200: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f210: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
f220: 20 26 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54   &op) ) return T
f230: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f240: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
f250: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
f260: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65  , objv[3], &rese
f270: 74 46 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20  tFlag) ) return 
f280: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61  TCL_ERROR;.  iVa
f290: 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  lue = sqlite3_st
f2a0: 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c  mt_status(pStmt,
f2b0: 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b   op, resetFlag);
f2c0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
f2d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
f2e0: 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65  NewIntObj(iValue
f2f0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
f300: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
f310: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f320: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a  T_SCANSTATUS./*.
f330: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f340: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f350: 75 73 20 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73  us STMT IDX.*/.s
f360: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
f370: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d  _TCLAPI test_stm
f380: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 0a 20 20  t_scanstatus(.  
f390: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f3a0: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
f3b0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
f3c0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
f3d0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
f3e0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
f3f0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
f400: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
f410: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ent */.  int idx
f420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f430: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
f440: 6e 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 0a  nd argument */..
f450: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
f460: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
f470: 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 73  r *zExplain;.  s
f480: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f  qlite3_int64 nLo
f490: 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  op;.  sqlite3_in
f4a0: 74 36 34 20 6e 56 69 73 69 74 3b 0a 20 20 64 6f  t64 nVisit;.  do
f4b0: 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 69 6e 74  uble rEst;.  int
f4c0: 20 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   res;..  if( obj
f4d0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f4e0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f4f0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
f500: 54 4d 54 20 49 44 58 22 29 3b 0a 20 20 20 20 72  TMT IDX");.    r
f510: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f520: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
f530: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
f540: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
f550: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
f560: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f570: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
f580: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
f590: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
f5a0: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
f5b0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65 73 20  L_ERROR;..  res 
f5c0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
f5d0: 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c  canstatus(pStmt,
f5e0: 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41   idx, SQLITE_SCA
f5f0: 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
f600: 69 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20 20 69  id*)&nLoop);.  i
f610: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
f620: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
f630: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
f640: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f650: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f660: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
f670: 6e 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c 20 2d  ngObj("nLoop", -
f680: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f690: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f6a0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f6b0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 4c 6f  ewWideIntObj(nLo
f6c0: 6f 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  op));.    sqlite
f6d0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f6e0: 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51  s(pStmt, idx, SQ
f6f0: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56  LITE_SCANSTAT_NV
f700: 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56  ISIT, (void*)&nV
f710: 69 73 69 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  isit);.    Tcl_L
f720: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f730: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f740: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
f750: 56 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a 20 20  Visit", -1));.  
f760: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f770: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f780: 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  et, Tcl_NewWideI
f790: 6e 74 4f 62 6a 28 6e 56 69 73 69 74 29 29 3b 0a  ntObj(nVisit));.
f7a0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f7b0: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f7c0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f7d0: 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f  CANSTAT_EST, (vo
f7e0: 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20  id*)&rEst);.    
f7f0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f800: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f810: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f820: 62 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29 29 3b  bj("nEst", -1));
f830: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f840: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f850: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 44 6f   pRet, Tcl_NewDo
f860: 75 62 6c 65 4f 62 6a 28 72 45 73 74 29 29 3b 0a  ubleObj(rEst));.
f870: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f880: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f890: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f8a0: 43 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20 28 76  CANSTAT_NAME, (v
f8b0: 6f 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a 20 20  oid*)&zName);.  
f8c0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f8d0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f8e0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f8f0: 67 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20 2d 31  gObj("zName", -1
f900: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
f910: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
f920: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
f930: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65  wStringObj(zName
f940: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  , -1));.    sqli
f950: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
f960: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
f970: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
f980: 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29  EXPLAIN, (void*)
f990: 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  &zExplain);.    
f9a0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f9b0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f9c0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f9d0: 62 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c 20 2d  bj("zExplain", -
f9e0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f9f0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
fa00: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
fa10: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 78 70  ewStringObj(zExp
fa20: 6c 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20 20 20  lain, -1));.    
fa30: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
fa40: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
fa50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
fa60: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
fa70: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  erp);.  }.  retu
fa80: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
fa90: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
faa0: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fab0: 74 75 73 5f 72 65 73 65 74 20 20 53 54 4d 54 0a  tus_reset  STMT.
fac0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
fad0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
fae0: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
faf0: 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a  _reset(.  void *
fb00: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
fb10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fb20: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
fb30: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
fb40: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
fb50: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
fb60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fb70: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f  irst argument */
fb80: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
fb90: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
fba0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fbb0: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
fbc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fbd0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
fbe0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
fbf0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
fc00: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
fc10: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
fc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
fc30: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
fc40: 74 61 74 75 73 5f 72 65 73 65 74 28 70 53 74 6d  tatus_reset(pStm
fc50: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
fc60: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
fc70: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fc80: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
fc90: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
fca0: 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 0a 2a  _config_sqllog.*
fcb0: 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 53 51  *.** Zero the SQ
fcc0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
fcd0: 4f 47 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  OG configuration
fce0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
fcf0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
fd00: 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 28  t_config_sqllog(
fd10: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
fd20: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
fd30: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
fd40: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
fd50: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
fd60: 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  ){.  if( objc!=1
fd70: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
fd80: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fd90: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
fda0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fdb0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
fdc0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
fdd0: 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 2c 20  _CONFIG_SQLLOG, 
fde0: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
fdf0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
fe00: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 76  ../*.** Usage: v
fe10: 66 73 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 5f  fs_current_time_
fe20: 69 6e 74 36 34 0a 2a 2a 0a 2a 2a 20 52 65 74 75  int64.**.** Retu
fe30: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  rn the value ret
fe40: 75 72 6e 65 64 20 62 79 20 74 68 65 20 64 65 66  urned by the def
fe50: 61 75 6c 74 20 56 46 53 27 73 20 78 43 75 72 72  ault VFS's xCurr
fe60: 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 6d 65 74  entTimeInt64 met
fe70: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
fe80: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
fe90: 20 76 66 73 43 75 72 72 65 6e 74 54 69 6d 65 49   vfsCurrentTimeI
fea0: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
feb0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
fec0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
fed0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
fee0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
fef0: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 36 34 20 74 3b  jv[].){.  i64 t;
ff00: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
ff10: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
ff20: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
ff30: 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
ff40: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
ff50: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
ff60: 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75  v, "");.    retu
ff70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ff80: 7d 0a 20 20 70 56 66 73 2d 3e 78 43 75 72 72 65  }.  pVfs->xCurre
ff90: 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
ffa0: 2c 20 26 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  , &t);.  Tcl_Set
ffb0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
ffc0: 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
ffd0: 4f 62 6a 28 74 29 29 3b 0a 20 20 72 65 74 75 72  Obj(t));.  retur
ffe0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
fff0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10000 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
10010 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
10020 73 6e 61 70 73 68 6f 74 5f 67 65 74 20 44 42 20  snapshot_get DB 
10030 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63  DBNAME.*/.static
10040 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
10050 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74  PI test_snapshot
10060 5f 67 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _get(.  void * c
10070 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10080 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10090 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
100a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
100b0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  jv[].){.  int rc
100c0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
100d0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
100e0 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
100f0 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 20 3d 20  ot *pSnapshot = 
10100 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
10110 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
10120 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10130 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
10140 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  BNAME");.    ret
10150 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10160 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
10170 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
10180 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10190 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
101a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
101b0 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
101c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
101d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
101e0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 64 62  _snapshot_get(db
101f0 2c 20 7a 4e 61 6d 65 2c 20 26 70 53 6e 61 70 73  , zName, &pSnaps
10200 68 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  hot);.  if( rc!=
10210 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10220 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10230 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10240 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
10250 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d  e3ErrName(rc), -
10260 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  1));.    return 
10270 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
10280 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  se{.    char zBu
10290 66 5b 31 30 30 5d 3b 0a 20 20 20 20 69 66 28 20  f[100];.    if( 
102a0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
102b0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
102c0 2c 20 7a 42 75 66 2c 20 70 53 6e 61 70 73 68 6f  , zBuf, pSnapsho
102d0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
102e0 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 53  ERROR;.    Tcl_S
102f0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
10300 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
10310 67 4f 62 6a 28 7a 42 75 66 2c 20 2d 31 29 29 3b  gObj(zBuf, -1));
10320 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
10330 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
10340 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
10350 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66  SNAPSHOT */..#if
10360 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10370 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
10380 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
10390 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 20 44 42  snapshot_open DB
103a0 20 44 42 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54   DBNAME SNAPSHOT
103b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
103c0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
103d0 74 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28  t_snapshot_open(
103e0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
103f0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
10400 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
10410 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
10420 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
10430 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
10440 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
10450 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
10460 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
10470 53 6e 61 70 73 68 6f 74 3b 0a 0a 20 20 69 66 28  Snapshot;..  if(
10480 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
10490 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
104a0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
104b0 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53 4e 41  , "DB DBNAME SNA
104c0 50 53 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74  PSHOT");.    ret
104d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
104e0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
104f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
10500 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10510 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
10520 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10530 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
10540 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
10550 0a 20 20 70 53 6e 61 70 73 68 6f 74 20 3d 20 28  .  pSnapshot = (
10560 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10570 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78  *)sqlite3TestTex
10580 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74  tToPtr(Tcl_GetSt
10590 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 29 3b 0a  ring(objv[3]));.
105a0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
105b0 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 64 62  snapshot_open(db
105c0 2c 20 7a 4e 61 6d 65 2c 20 70 53 6e 61 70 73 68  , zName, pSnapsh
105d0 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ot);.  if( rc!=S
105e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
105f0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
10600 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
10610 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65  StringObj(sqlite
10620 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31  3ErrName(rc), -1
10630 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ));.    return T
10640 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10650 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
10660 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
10670 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
10680 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c  T */..#ifdef SQL
10690 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53  ITE_ENABLE_SNAPS
106a0 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  HOT./*.** Usage:
106b0 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
106c0 74 5f 66 72 65 65 20 53 4e 41 50 53 48 4f 54 0a  t_free SNAPSHOT.
106d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
106e0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
106f0 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 0a  _snapshot_free(.
10700 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
10710 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
10720 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
10730 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
10740 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
10750 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  {.  sqlite3_snap
10760 73 68 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 3b  shot *pSnapshot;
10770 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
10780 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
10790 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
107a0 2c 20 6f 62 6a 76 2c 20 22 53 4e 41 50 53 48 4f  , objv, "SNAPSHO
107b0 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  T");.    return 
107c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
107d0 20 70 53 6e 61 70 73 68 6f 74 20 3d 20 28 73 71   pSnapshot = (sq
107e0 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29  lite3_snapshot*)
107f0 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
10800 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69  oPtr(Tcl_GetStri
10810 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20  ng(objv[1]));.  
10820 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10830 5f 66 72 65 65 28 70 53 6e 61 70 73 68 6f 74 29  _free(pSnapshot)
10840 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
10850 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
10860 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
10870 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66  PSHOT */..#ifdef
10880 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10890 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73  NAPSHOT./*.** Us
108a0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61  age: sqlite3_sna
108b0 70 73 68 6f 74 5f 63 6d 70 20 53 4e 41 50 53 48  pshot_cmp SNAPSH
108c0 4f 54 31 20 53 4e 41 50 53 48 4f 54 32 0a 2a 2f  OT1 SNAPSHOT2.*/
108d0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
108e0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
108f0 6e 61 70 73 68 6f 74 5f 63 6d 70 28 0a 20 20 76  napshot_cmp(.  v
10900 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10910 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
10920 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
10930 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
10940 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
10950 20 69 6e 74 20 72 65 73 3b 0a 20 20 73 71 6c 69   int res;.  sqli
10960 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 31  te3_snapshot *p1
10970 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  ;.  sqlite3_snap
10980 73 68 6f 74 20 2a 70 32 3b 0a 20 20 69 66 28 20  shot *p2;.  if( 
10990 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
109a0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
109b0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
109c0 20 22 53 4e 41 50 53 48 4f 54 31 20 53 4e 41 50   "SNAPSHOT1 SNAP
109d0 53 48 4f 54 32 22 29 3b 0a 20 20 20 20 72 65 74  SHOT2");.    ret
109e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
109f0 20 7d 0a 20 20 70 31 20 3d 20 28 73 71 6c 69 74   }.  p1 = (sqlit
10a00 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c  e3_snapshot*)sql
10a10 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74  ite3TestTextToPt
10a20 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  r(Tcl_GetString(
10a30 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 70 32 20  objv[1]));.  p2 
10a40 3d 20 28 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  = (sqlite3_snaps
10a50 68 6f 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74  hot*)sqlite3Test
10a60 54 65 78 74 54 6f 50 74 72 28 54 63 6c 5f 47 65  TextToPtr(Tcl_Ge
10a70 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
10a80 29 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c 69 74  );.  res = sqlit
10a90 65 33 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28  e3_snapshot_cmp(
10aa0 70 31 2c 20 70 32 29 3b 0a 20 20 54 63 6c 5f 53  p1, p2);.  Tcl_S
10ab0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
10ac0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
10ad0 6a 28 72 65 73 29 29 3b 0a 20 20 72 65 74 75 72  j(res));.  retur
10ae0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
10af0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41  if /* SQLITE_ENA
10b00 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a  BLE_SNAPSHOT */.
10b10 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
10b20 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74  qlite3_next_stmt
10b30 20 20 44 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a    DB  STMT.**.**
10b40 20 52 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74   Return the next
10b50 20 73 74 61 74 6d 65 6e 74 20 69 6e 20 73 65 71   statment in seq
10b60 75 65 6e 63 65 20 61 66 74 65 72 20 53 54 4d 54  uence after STMT
10b70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10b80 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
10b90 73 74 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20  st_next_stmt(.  
10ba0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10bb0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10bc0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10bd0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10be0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10bf0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
10c00 70 53 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33  pStmt;.  sqlite3
10c10 20 2a 64 62 20 3d 20 30 3b 0a 20 20 63 68 61 72   *db = 0;.  char
10c20 20 7a 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66   zBuf[50];..  if
10c30 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
10c40 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
10c50 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
10c60 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
10c70 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
10c80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
10c90 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
10ca0 2c 20 22 20 44 42 20 53 54 4d 54 22 2c 20 30 29  , " DB STMT", 0)
10cb0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10cc0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
10cd0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
10ce0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
10cf0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10d00 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
10d10 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67  L_ERROR;.  if( g
10d20 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
10d30 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
10d40 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70  ing(objv[2]), &p
10d50 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
10d60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d  CL_ERROR;.  pStm
10d70 74 20 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  t = sqlite3_next
10d80 5f 73 74 6d 74 28 64 62 2c 20 70 53 74 6d 74 29  _stmt(db, pStmt)
10d90 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ;.  if( pStmt ){
10da0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
10db0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
10dc0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
10dd0 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
10de0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
10df0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10e00 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
10e10 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
10e20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10e30 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
10e40 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20  _stmt_readonly  
10e50 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
10e60 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 69  n true if STMT i
10e70 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
10e80 20 6f 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   or a pointer to
10e90 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
10ea0 74 68 61 74 20 69 73 20 67 75 61 72 61 6e 74 65  that is guarante
10eb0 65 64 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20  ed to leave the 
10ec0 64 61 74 61 62 61 73 65 20 75 6e 6d 6f 64 69 66  database unmodif
10ed0 69 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ied..*/.static i
10ee0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
10ef0 20 74 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f   test_stmt_reado
10f00 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  nly(.  void * cl
10f10 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
10f20 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
10f30 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
10f40 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10f50 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
10f60 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
10f70 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
10f80 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
10f90 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
10fa0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
10fb0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
10fc0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
10fd0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10fe0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
10ff0 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
11000 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11010 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
11020 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
11030 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
11040 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
11050 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
11060 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
11070 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64  qlite3_stmt_read
11080 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54  only(pStmt);.  T
11090 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
110a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
110b0 6f 6f 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a  ooleanObj(rc));.
110c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
110d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
110e0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62    sqlite3_stmt_b
110f0 75 73 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  usy  STMT.**.** 
11100 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 53  Return true if S
11110 54 4d 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c  TMT is a non-NUL
11120 4c 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  L pointer to a s
11130 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74  tatement.** that
11140 20 68 61 73 20 62 65 65 6e 20 73 74 65 70 70 65   has been steppe
11150 64 20 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d  d but not to com
11160 70 6c 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  pletion..*/.stat
11170 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
11180 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74 5f 62  LAPI test_stmt_b
11190 75 73 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  usy(.  void * cl
111a0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
111b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
111c0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
111d0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
111e0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
111f0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
11200 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
11210 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
11220 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
11230 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
11240 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
11250 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
11260 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
11270 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
11280 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
11290 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
112a0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
112b0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
112c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
112d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
112e0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
112f0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
11300 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
11310 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
11320 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
11330 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
11340 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65  anObj(rc));.  re
11350 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
11360 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 75 73  /*.** Usage:  us
11370 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20  es_stmt_journal 
11380 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
11390 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20  rn true if STMT 
113a0 75 73 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74  uses a statement
113b0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
113c0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
113d0 43 4c 41 50 49 20 75 73 65 73 5f 73 74 6d 74 5f  CLAPI uses_stmt_
113e0 6a 6f 75 72 6e 61 6c 28 0a 20 20 76 6f 69 64 20  journal(.  void 
113f0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
11400 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11410 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11420 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11430 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
11440 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
11450 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
11460 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
11470 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
11480 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
11490 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
114a0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
114b0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
114c0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22  [0], 0), " STMT"
114d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
114e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
114f0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
11500 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
11510 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11520 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
11530 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11540 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
11550 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29  _readonly(pStmt)
11560 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
11570 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
11580 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28  _NewBooleanObj((
11590 28 56 64 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e  (Vdbe *)pStmt)->
115a0 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 29  usesStmtJournal)
115b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
115c0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73  OK;.}.../*.** Us
115d0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65  age:  sqlite3_re
115e0 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a  set  STMT .**.**
115f0 20 52 65 73 65 74 20 61 20 73 74 61 74 65 6d 65   Reset a stateme
11600 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  nt handle..*/.st
11610 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
11620 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 73 65  TCLAPI test_rese
11630 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
11640 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
11650 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
11660 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
11670 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
11680 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
11690 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
116a0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
116b0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
116c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
116d0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
116e0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
116f0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
11700 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
11710 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c  objv[0], 0), " <
11720 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20  STMT>", 0);.    
11730 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11740 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
11750 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
11760 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
11770 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
11780 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
11790 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
117a0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
117b0 74 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d  tmt);.  if( pStm
117c0 74 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74  t && sqlite3Test
117d0 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
117e0 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
117f0 20 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75   rc) ){.    retu
11800 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
11810 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  }.  Tcl_SetResul
11820 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
11830 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
11840 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
11850 2f 2a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  /*.  if( rc ){. 
11860 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11870 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65  ROR;.  }.*/.  re
11880 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
11890 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
118a0 6c 69 74 65 33 5f 65 78 70 69 72 65 64 20 53 54  lite3_expired ST
118b0 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  MT .**.** Return
118c0 20 54 52 55 45 20 69 66 20 61 20 72 65 63 6f 6d   TRUE if a recom
118d0 70 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  pilation of the 
118e0 73 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 63  statement is rec
118f0 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61  ommended..*/.sta
11900 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
11910 43 4c 41 50 49 20 74 65 73 74 5f 65 78 70 69 72  CLAPI test_expir
11920 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
11930 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
11940 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
11950 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
11960 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
11970 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
11980 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
11990 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73  ATED.  sqlite3_s
119a0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66  tmt *pStmt;.  if
119b0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
119c0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
119d0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
119e0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
119f0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
11a00 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
11a10 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
11a20 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b  , " <STMT>", 0);
11a30 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11a40 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
11a50 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
11a60 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
11a70 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
11a80 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
11a90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
11aa0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
11ab0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
11ac0 6f 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33  oleanObj(sqlite3
11ad0 5f 65 78 70 69 72 65 64 28 70 53 74 6d 74 29 29  _expired(pStmt))
11ae0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75  );.#endif.  retu
11af0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
11b00 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
11b10 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  te3_transfer_bin
11b20 64 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20 54  dings FROMSTMT T
11b30 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e  OSTMT.**.** Tran
11b40 73 66 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67  sfer all binding
11b50 73 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20  s from FROMSTMT 
11b60 6f 76 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a  over to TOSTMT.*
11b70 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
11b80 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
11b90 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20  transfer_bind(. 
11ba0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
11bb0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
11bc0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
11bd0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
11be0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
11bf0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
11c00 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
11c10 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11c20 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b  pStmt1, *pStmt2;
11c30 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
11c40 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11c50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11c60 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
11c70 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
11c80 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
11c90 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
11ca0 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54  ], 0), " FROM-ST
11cb0 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b  MT TO-STMT", 0);
11cc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
11cd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
11ce0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
11cf0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
11d00 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
11d10 26 70 53 74 6d 74 31 29 29 20 72 65 74 75 72 6e  &pStmt1)) return
11d20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
11d30 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
11d40 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11d50 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
11d60 20 26 70 53 74 6d 74 32 29 29 20 72 65 74 75 72   &pStmt2)) retur
11d70 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
11d80 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
11d90 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63  interp, .     Tc
11da0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
11db0 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e  te3_transfer_bin
11dc0 64 69 6e 67 73 28 70 53 74 6d 74 31 2c 70 53 74  dings(pStmt1,pSt
11dd0 6d 74 32 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20  mt2)));.#endif. 
11de0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11df0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
11e00 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
11e10 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e   DB.**.** Return
11e20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
11e30 68 61 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74  hanges made to t
11e40 68 65 20 64 61 74 61 62 61 73 65 20 62 79 20 74  he database by t
11e50 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65  he last SQL.** e
11e60 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  xecution..*/.sta
11e70 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
11e80 43 4c 41 50 49 20 74 65 73 74 5f 63 68 61 6e 67  CLAPI test_chang
11e90 65 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  es(.  void * cli
11ea0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
11eb0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
11ec0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
11ed0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
11ee0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
11ef0 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  *db;.  if( objc!
11f00 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
11f10 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
11f20 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
11f30 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
11f40 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
11f50 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
11f60 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
11f70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11f80 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
11f90 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
11fa0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11fb0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
11fc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11fd0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
11fe0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
11ff0 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
12000 33 5f 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b  3_changes(db)));
12010 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
12030 69 73 20 74 68 65 20 22 73 74 61 74 69 63 5f 62  is the "static_b
12040 69 6e 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20  ind_value" that 
12050 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f  variables are bo
12060 75 6e 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74  und to when.** t
12070 68 65 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f  he FLAG option o
12080 66 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69  f sqlite3_bind i
12090 73 20 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74  s "static".*/.st
120a0 61 74 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74  atic char *sqlit
120b0 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61  e_static_bind_va
120c0 6c 75 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  lue = 0;.static 
120d0 69 6e 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69  int sqlite_stati
120e0 63 5f 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30  c_bind_nbyte = 0
120f0 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  ;../*.** Usage: 
12100 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56   sqlite3_bind  V
12110 4d 20 20 49 44 58 20 20 56 41 4c 55 45 20 20 46  M  IDX  VALUE  F
12120 4c 41 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20  LAGS.**.** Sets 
12130 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
12140 20 49 44 58 2d 74 68 20 6f 63 63 75 72 72 65 6e   IDX-th occurren
12150 63 65 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65  ce of "?" in the
12160 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a   original SQL.**
12170 20 73 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20   string.  VALUE 
12180 69 73 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  is the new value
12190 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75  .  If FLAGS=="nu
121a0 6c 6c 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69  ll" then VALUE i
121b0 73 0a 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64  s.** ignored and
121c0 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65   the value is se
121d0 74 20 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46  t to NULL.  If F
121e0 4c 41 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74  LAGS=="static" t
121f0 68 65 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  hen.** the value
12200 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
12210 61 6c 75 65 20 6f 66 20 61 20 73 74 61 74 69 63  alue of a static
12220 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a   variable named.
12230 2a 2a 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69  ** "sqlite_stati
12240 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20  c_bind_value".  
12250 49 66 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61  If FLAGS=="norma
12260 6c 22 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a  l" then a copy.*
12270 2a 20 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69  * of the VALUE i
12280 73 20 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47  s made.  If FLAG
12290 53 3d 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e  S=="blob10" then
122a0 20 61 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f   a VALUE is igno
122b0 72 65 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62  red.** an a 10-b
122c0 79 74 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30  yte blob "abc\00
122d0 30 78 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69  0xyz\000pq" is i
122e0 6e 73 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  nserted..*/.stat
122f0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
12300 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 28 0a  LAPI test_bind(.
12310 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
12320 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
12330 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
12340 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
12350 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
12360 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
12370 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
12380 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
12390 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
123a0 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
123b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
123c0 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
123d0 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
123e0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
123f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
12400 69 64 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21  idx;.  if( argc!
12410 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
12420 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12430 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
12440 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
12450 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
12460 20 20 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45    " VM IDX VALUE
12470 20 28 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f   (null|static|no
12480 72 6d 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20  rmal)\"", 0);.  
12490 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
124a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
124b0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
124c0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70  erp, argv[1], &p
124d0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
124e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
124f0 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72  Tcl_GetInt(inter
12500 70 2c 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78  p, argv[2], &idx
12510 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12520 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63  RROR;.  if( strc
12530 6d 70 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c  mp(argv[4],"null
12540 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  ")==0 ){.    rc 
12550 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
12560 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
12570 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
12580 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
12590 74 69 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  tic")==0 ){.    
125a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
125b0 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64  d_text(pStmt, id
125c0 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63  x, sqlite_static
125d0 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c  _bind_value, -1,
125e0 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
125f0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c   strcmp(argv[4],
12600 22 73 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29  "static-nbytes")
12610 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
12620 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
12630 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71  t(pStmt, idx, sq
12640 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
12650 5f 76 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20  _value,.        
12660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
12680 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
12690 64 5f 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d  d_nbyte, 0);.  }
126a0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
126b0 61 72 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22  argv[4],"normal"
126c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
126d0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
126e0 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61  xt(pStmt, idx, a
126f0 72 67 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[3], -1, SQLI
12700 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
12710 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
12720 70 28 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31  p(argv[4],"blob1
12730 30 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  0")==0 ){.    rc
12740 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
12750 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
12760 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30   "abc\000xyz\000
12770 70 71 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f  pq", 10, SQLITE_
12780 53 54 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65  STATIC);.  }else
12790 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
127a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
127b0 34 74 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  4th argument sho
127c0 75 6c 64 20 62 65 20 22 0a 20 20 20 20 20 20 20  uld be ".       
127d0 20 22 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22   "\"null\" or \"
127e0 73 74 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f  static\" or \"no
127f0 72 6d 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20  rmal\"", 0);.   
12800 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12810 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  R;.  }.  if( sql
12820 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
12830 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
12840 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
12850 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12860 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
12870 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a   char zBuf[50];.
12880 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
12890 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
128a0 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22  ), zBuf, "(%d) "
128b0 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
128c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
128d0 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
128e0 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
128f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
12900 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
12910 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
12920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
12930 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55  IT_UTF16./*.** U
12940 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
12950 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20  ollate <db ptr> 
12960 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
12970 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
12980 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12990 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
129a0 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
129b0 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ts the correct c
129c0 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
129d0 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68  ence callback wh
129e0 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
129f0 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
12a00 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
12a10 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
12a20 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
12a30 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
12a40 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63   registers the c
12a50 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
12a60 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  e "test_collate"
12a70 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73  .** with databas
12a80 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54  e handle <db>. T
12a90 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
12aa0 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73  nt must be a lis
12ab0 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f  t of three.** bo
12ac0 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66  olean values. If
12ad0 20 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72   the first is tr
12ae0 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
12af0 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  on of test_colla
12b00 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65  te is.** registe
12b10 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
12b20 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  f the second is 
12b30 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
12b40 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
12b50 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69  r.** UTF-16le, i
12b60 66 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74  f the third is t
12b70 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
12b80 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
12b90 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75  able..** Previou
12ba0 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65  s versions of te
12bb0 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64  st_collate are d
12bc0 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
12bd0 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
12be0 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ence test_collat
12bf0 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  e is implemented
12c00 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a   by calling the.
12c10 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  ** following TCL
12c20 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
12c30 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c   "test_collate <
12c40 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e  enc> <lhs> <rhs>
12c50 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73  ".**.** The <lhs
12c60 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20  > and <rhs> are 
12c70 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62  the two values b
12c80 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65  eing compared, e
12c90 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e  ncoded in UTF-8.
12ca0 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61  .** The <enc> pa
12cb0 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
12cc0 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63  ncoding of the c
12cd0 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
12ce0 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65  n that.** SQLite
12cf0 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c   selected to cal
12d00 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20  l. The TCL test 
12d10 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74  script implement
12d20 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63  s the.** "test_c
12d30 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a  ollate" proc..**
12d40 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
12d50 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72  is will only wor
12d60 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 72  k with one inter
12d70 70 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65  preter at a time
12d80 2c 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65  , as the.** inte
12d90 72 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73  rp pointer to us
12da0 65 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e  e when evaluatin
12db0 67 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74  g the TCL script
12dc0 20 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a   is stored in.**
12dd0 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74   pTestCollateInt
12de0 65 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54  erp..*/.static T
12df0 63 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74  cl_Interp* pTest
12e00 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73  CollateInterp;.s
12e10 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
12e20 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76  ollate_func(.  v
12e30 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e  oid *pCtx, .  in
12e40 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64  t nA, const void
12e50 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20   *zA,.  int nB, 
12e60 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29  const void *zB.)
12e70 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  {.  Tcl_Interp *
12e80 69 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65  i = pTestCollate
12e90 49 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e  Interp;.  int en
12ea0 63 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50 54 52  cin = SQLITE_PTR
12eb0 5f 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20  _TO_INT(pCtx);. 
12ec0 20 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20   int res;.  int 
12ed0 6e 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  n;..  sqlite3_va
12ee0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c  lue *pVal;.  Tcl
12ef0 5f 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20  _Obj *pX;..  pX 
12f00 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
12f10 62 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  bj("test_collate
12f20 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e  ", -1);.  Tcl_In
12f30 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
12f40 0a 20 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e  .  switch( encin
12f50 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
12f60 49 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20  ITE_UTF8:.      
12f70 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
12f80 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63  dElement(i,pX,Tc
12f90 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
12fa0 55 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20  UTF-8",-1));.   
12fb0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
12fc0 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  se SQLITE_UTF16L
12fd0 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73  E:.      Tcl_Lis
12fe0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
12ff0 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74  t(i,pX,Tcl_NewSt
13000 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c  ringObj("UTF-16L
13010 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62  E",-1));.      b
13020 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53  reak;.    case S
13030 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20  QLITE_UTF16BE:. 
13040 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
13050 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
13060 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  pX,Tcl_NewString
13070 4f 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d  Obj("UTF-16BE",-
13080 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  1));.      break
13090 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
130a0 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a       assert(0);.
130b0 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 65    }..  sqlite3Be
130c0 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
130d0 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
130e0 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
130f0 20 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20    if( pVal ){.  
13100 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
13110 74 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a  tStr(pVal, nA, z
13120 41 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45  A, encin, SQLITE
13130 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20  _STATIC);.    n 
13140 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
13150 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20  bytes(pVal);.   
13160 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13170 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a  ndElement(i,pX,.
13180 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53          Tcl_NewS
13190 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
131a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
131b0 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20  xt(pVal),n));.  
131c0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
131d0 74 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a  tStr(pVal, nB, z
131e0 42 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45  B, encin, SQLITE
131f0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20  _STATIC);.    n 
13200 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
13210 62 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20  bytes(pVal);.   
13220 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13230 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a  ndElement(i,pX,.
13240 20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53          Tcl_NewS
13250 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29  tringObj((char*)
13260 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
13270 78 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20  xt(pVal),n));.  
13280 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
13290 65 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20  ee(pVal);.  }.  
132a0 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
132b0 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c  Malloc();..  Tcl
132c0 5f 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58  _EvalObjEx(i, pX
132d0 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72  , 0);.  Tcl_Decr
132e0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
132f0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
13300 6a 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52  j(i, Tcl_GetObjR
13310 65 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b  esult(i), &res);
13320 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d  .  return res;.}
13330 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
13340 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
13350 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a  ollate(.  void *
13360 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
13370 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13380 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
13390 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
133a0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
133b0 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76  te3 *db;.  int v
133c0 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al;.  sqlite3_va
133d0 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74  lue *pVal;.  int
133e0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
133f0 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=5 ) goto bad_a
13400 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c  rgs;.  pTestColl
13410 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65  ateInterp = inte
13420 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50  rp;.  if( getDbP
13430 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
13440 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
13450 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
13460 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
13470 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54  .  if( TCL_OK!=T
13480 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
13490 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
134a0 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65  v[2], &val) ) re
134b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
134c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
134d0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
134e0 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74  db, "test_collat
134f0 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  e", SQLITE_UTF8,
13500 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69   .          (voi
13510 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c  d *)SQLITE_UTF8,
13520 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74   val?test_collat
13530 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28  e_func:0);.  if(
13540 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13550 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64  {.    const void
13560 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69 66   *zUtf16;.    if
13570 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65  ( TCL_OK!=Tcl_Ge
13580 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
13590 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
135a0 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
135b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72  TCL_ERROR;.    r
135c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
135d0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
135e0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c   "test_collate",
135f0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
13600 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 76   .            (v
13610 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46  oid *)SQLITE_UTF
13620 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63  16LE, val?test_c
13630 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a  ollate_func:0);.
13640 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d      if( TCL_OK!=
13650 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
13660 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
13670 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[4], &val) ) r
13680 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13690 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28 20  ..#if 0.    if( 
136a0 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
136b0 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73  ail>0 ){.      s
136c0 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61  qlite3_iMallocFa
136d0 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  il++;.    }.#end
136e0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  if.    sqlite3_m
136f0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
13700 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20  utex);.    pVal 
13710 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
13720 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74  w(db);.    sqlit
13730 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
13740 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f  al, -1, "test_co
13750 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
13760 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  TF8, SQLITE_STAT
13770 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20  IC);.    zUtf16 
13780 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65  = sqlite3ValueTe
13790 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f  xt(pVal, SQLITE_
137a0 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
137b0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
137c0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20  Failed ){.      
137d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
137e0 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
137f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13800 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
13810 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20  n16(db, zUtf16, 
13820 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
13830 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64  .          (void
13840 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42   *)SQLITE_UTF16B
13850 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c  E, val?test_coll
13860 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20  ate_func:0);.   
13870 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61   }.    sqlite3Va
13880 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
13890 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
138a0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
138b0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  );.  }.  if( sql
138c0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
138d0 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
138e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
138f0 4f 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63 21  OR;.  .  if( rc!
13900 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13910 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
13920 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
13930 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
13940 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
13950 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
13960 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62  eturn TCL_OK;..b
13970 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41  ad_args:.  Tcl_A
13980 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
13990 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
139a0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
139b0 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  ,.      Tcl_GetS
139c0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
139d0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e  v[0], 0), " <DB>
139e0 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
139f0 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29  > <utf16be>", 0)
13a00 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ;.  return TCL_E
13a10 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  RROR;.}../*.** U
13a20 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 75  sage: add_test_u
13a30 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 20  tf16bin_collate 
13a40 3c 64 62 20 70 74 72 3e 0a 2a 2a 0a 2a 2a 20 41  <db ptr>.**.** A
13a50 64 64 20 61 20 75 74 66 2d 31 36 20 63 6f 6c 6c  dd a utf-16 coll
13a60 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e  ation sequence n
13a70 61 6d 65 64 20 22 75 74 66 31 36 62 69 6e 22 20  amed "utf16bin" 
13a80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  to the database.
13a90 2a 2a 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20  ** handle. This 
13aa0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
13ab0 63 65 20 63 6f 6d 70 61 72 65 73 20 61 72 67 75  ce compares argu
13ac0 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 73 61 6d  ments in the sam
13ad0 65 20 77 61 79 20 61 73 20 74 68 65 0a 2a 2a 20  e way as the.** 
13ae0 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
13af0 6f 6e 20 22 62 69 6e 61 72 79 22 2e 0a 2a 2f 0a  on "binary"..*/.
13b00 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
13b10 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65  utf16bin_collate
13b20 5f 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70  _func(.  void *p
13b30 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20  Ctx, .  int nA, 
13b40 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a  const void *zA,.
13b50 20 20 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20    int nB, const 
13b60 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 69 6e  void *zB.){.  in
13b70 74 20 6e 43 6d 70 20 3d 20 28 6e 41 3e 6e 42 20  t nCmp = (nA>nB 
13b80 3f 20 6e 42 20 3a 20 6e 41 29 3b 0a 20 20 69 6e  ? nB : nA);.  in
13b90 74 20 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a  t res = memcmp(z
13ba0 41 2c 20 7a 42 2c 20 6e 43 6d 70 29 3b 0a 20 20  A, zB, nCmp);.  
13bb0 69 66 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73  if( res==0 ) res
13bc0 20 3d 20 6e 41 20 2d 20 6e 42 3b 0a 20 20 72 65   = nA - nB;.  re
13bd0 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74  turn res;.}.stat
13be0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
13bf0 4c 41 50 49 20 74 65 73 74 5f 75 74 66 31 36 62  LAPI test_utf16b
13c00 69 6e 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f  in_collate(.  vo
13c10 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
13c20 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13c30 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
13c40 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
13c50 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
13c60 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
13c70 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
13c80 6a 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64  jc!=2 ) goto bad
13c90 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74  _args;.  if( get
13ca0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
13cb0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
13cc0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
13cd0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
13ce0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
13cf0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
13d00 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 62 69  ion(db, "utf16bi
13d10 6e 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  n", SQLITE_UTF16
13d20 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74  , 0, .      test
13d30 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74  _utf16bin_collat
13d40 65 5f 66 75 6e 63 0a 20 20 29 3b 0a 20 20 69 66  e_func.  );.  if
13d50 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
13d60 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
13d70 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
13d80 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
13d90 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61  n TCL_OK;..bad_a
13da0 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67  rgs:.  Tcl_Wrong
13db0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
13dc0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
13dd0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
13de0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  OR;.}../*.** Whe
13df0 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20  n the collation 
13e00 6e 65 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20  needed callback 
13e10 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f  is invoked, reco
13e20 72 64 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a  rd the name of .
13e30 2a 2a 20 74 68 65 20 72 65 71 75 65 73 74 65 64  ** the requested
13e40 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
13e50 69 6f 6e 20 68 65 72 65 2e 20 20 54 68 65 20 72  ion here.  The r
13e60 65 63 6f 72 64 65 64 20 6e 61 6d 65 20 69 73 20  ecorded name is 
13e70 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54  linked.** to a T
13e80 43 4c 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20  CL variable and 
13e90 75 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72  used to make sur
13ea0 65 20 74 68 61 74 20 74 68 65 20 72 65 71 75 65  e that the reque
13eb0 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a  sted collation.*
13ec0 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72 72 65 63  * name is correc
13ed0 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  t..*/.static cha
13ee0 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  r zNeededCollati
13ef0 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74 69 63 20  on[200];.static 
13f00 63 68 61 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f  char *pzNeededCo
13f10 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65  llation = zNeede
13f20 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a  dCollation;.../*
13f30 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20  .** Called when 
13f40 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
13f50 65 6e 63 65 20 69 73 20 6e 65 65 64 65 64 2e 20  ence is needed. 
13f60 20 52 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   Registered usin
13f70 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  g.** sqlite3_col
13f80 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
13f90 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  )..*/.static voi
13fa0 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  d test_collate_n
13fb0 65 65 64 65 64 5f 63 62 28 0a 20 20 76 6f 69 64  eeded_cb(.  void
13fc0 20 2a 70 43 74 78 2c 20 0a 20 20 73 71 6c 69 74   *pCtx, .  sqlit
13fd0 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54  e3 *db,.  int eT
13fe0 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20  extRep,.  const 
13ff0 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20  void *pName.){. 
14000 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 64   int enc = ENC(d
14010 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  b);.  int i;.  c
14020 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20  har *z;.  for(z 
14030 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20  = (char*)pName, 
14040 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b  i=0; *z || z[1];
14050 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a   z++){.    if( *
14060 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  z ) zNeededColla
14070 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a  tion[i++] = *z;.
14080 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c    }.  zNeededCol
14090 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20  lation[i] = 0;. 
140a0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
140b0 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20  collation(.     
140c0 20 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61   db, "test_colla
140d0 74 65 22 2c 20 45 4e 43 28 64 62 29 2c 20 53 51  te", ENC(db), SQ
140e0 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
140f0 65 6e 63 29 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  enc), test_colla
14100 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a  te_func);.}../*.
14110 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65  ** Usage: add_te
14120 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
14130 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69  d DB.*/.static i
14140 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
14150 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
14160 65 64 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63  eded(.  void * c
14170 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
14180 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
14190 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
141a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
141b0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
141c0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
141d0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
141e0 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b  ) goto bad_args;
141f0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
14200 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
14210 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
14220 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
14230 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
14240 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  c = sqlite3_coll
14250 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64  ation_needed16(d
14260 62 2c 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61  b, 0, test_colla
14270 74 65 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20  te_needed_cb);. 
14280 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f   zNeededCollatio
14290 6e 5b 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20  n[0] = 0;.  if( 
142a0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
142b0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
142c0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
142d0 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
142e0 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
142f0 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  s:.  Tcl_WrongNu
14300 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
14310 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
14320 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14330 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
14340 64 3a 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65  d:   add_alignme
14350 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
14360 6e 73 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64  ns  DB.**.** Add
14370 20 74 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69   two new collati
14380 6e 67 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20  ng sequences to 
14390 74 68 65 20 64 61 74 61 62 61 73 65 20 44 42 0a  the database DB.
143a0 2a 2a 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f  **.**     utf16_
143b0 61 6c 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75  aligned.**     u
143c0 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a  tf16_unaligned.*
143d0 2a 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74  *.** Both collat
143e0 69 6e 67 20 73 65 71 75 65 6e 63 65 73 20 75 73  ing sequences us
143f0 65 20 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20  e the same sort 
14400 6f 72 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e  order as BINARY.
14410 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66  .** The only dif
14420 66 65 72 65 6e 63 65 20 69 73 20 74 68 61 74 20  ference is that 
14430 74 68 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65  the utf16_aligne
14440 64 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73  d collating.** s
14450 65 71 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61  equence is decla
14460 72 65 64 20 77 69 74 68 20 74 68 65 20 53 51 4c  red with the SQL
14470 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
14480 44 20 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20  D flag..** Both 
14490 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
144a0 6f 6e 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  ons increment th
144b0 65 20 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31  e unaligned utf1
144c0 36 20 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65  6 counter.** whe
144d0 6e 65 76 65 72 20 74 68 65 79 20 73 65 65 20 61  never they see a
144e0 20 73 74 72 69 6e 67 20 74 68 61 74 20 62 65 67   string that beg
144f0 69 6e 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79  ins on an odd by
14500 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a  te boundary..*/.
14510 73 74 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69  static int unali
14520 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
14530 74 65 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20  ter = 0;.static 
14540 69 6e 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c  int alignmentCol
14550 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  lFunc(.  void *N
14560 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
14570 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
14580 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
14590 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
145a0 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
145b0 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65  rc, n;.  n = nKe
145c0 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31  y1<nKey2 ? nKey1
145d0 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20   : nKey2;.  if( 
145e0 6e 4b 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31  nKey1>0 && 1==(1
145f0 26 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f  &(SQLITE_PTR_TO_
14600 49 4e 54 28 70 4b 65 79 31 29 29 29 20 29 20 75  INT(pKey1))) ) u
14610 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f  naligned_string_
14620 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28  counter++;.  if(
14630 20 6e 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28   nKey2>0 && 1==(
14640 31 26 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f  1&(SQLITE_PTR_TO
14650 5f 49 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20  _INT(pKey2))) ) 
14660 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
14670 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63  _counter++;.  rc
14680 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c   = memcmp(pKey1,
14690 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66   pKey2, n);.  if
146a0 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( rc==0 ){.    r
146b0 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79  c = nKey1 - nKey
146c0 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
146d0 72 63 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  rc;.}.static int
146e0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 61   SQLITE_TCLAPI a
146f0 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73  dd_alignment_tes
14700 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20  t_collations(.  
14710 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
14720 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
14730 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
14740 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
14750 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
14760 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
14770 20 69 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a   if( objc>=2 ){.
14780 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
14790 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
147a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
147b0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
147c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
147d0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
147e0 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
147f0 75 74 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22  utf16_unaligned"
14800 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20  , SQLITE_UTF16, 
14810 0a 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67  .        0, alig
14820 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a  nmentCollFunc);.
14830 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
14840 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
14850 20 22 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22   "utf16_aligned"
14860 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  , SQLITE_UTF16_A
14870 4c 49 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20  LIGNED, .       
14880 20 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c   0, alignmentCol
14890 6c 46 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65  lFunc);.  }.  re
148a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
148b0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
148c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
148d0 5f 55 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a  _UTF16) */../*.*
148e0 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73  * Usage: add_tes
148f0 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70  t_function <db p
14900 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31  tr> <utf8> <utf1
14910 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a  6le> <utf16be>.*
14920 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
14930 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  on is used to te
14940 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20 73  st that SQLite s
14950 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72 65  elects the corre
14960 63 74 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74  ct user.** funct
14970 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65  ion callback whe
14980 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69  n multiple versi
14990 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65  ons (for differe
149a0 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  nt text encoding
149b0 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61  s).** are availa
149c0 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69  ble..**.** Calli
149d0 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
149e0 72 65 67 69 73 74 65 72 73 20 75 70 20 74 6f 20  registers up to 
149f0 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f  three versions o
14a00 66 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  f the user funct
14a10 69 6f 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e  ion.** "test_fun
14a20 63 74 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61  ction" with data
14a30 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e  base handle <db>
14a40 2e 20 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  .  If the second
14a50 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20   argument is.** 
14a60 74 72 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72  true, then a ver
14a70 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e  sion of test_fun
14a80 63 74 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65  ction is registe
14a90 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
14aa0 66 20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69  f the.** third i
14ab0 73 20 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f  s true, a versio
14ac0 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64 20  n is registered 
14ad0 66 6f 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66  for UTF-16le, if
14ae0 20 74 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a   the fourth is.*
14af0 2a 20 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36  * true, a UTF-16
14b00 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76  be version is av
14b10 61 69 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f  ailable.  Previo
14b20 75 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a  us versions of.*
14b30 2a 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20  * test_function 
14b40 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
14b50 2a 2a 20 54 68 65 20 75 73 65 72 20 66 75 6e 63  ** The user func
14b60 74 69 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e  tion is implemen
14b70 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74  ted by calling t
14b80 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  he following TCL
14b90 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
14ba0 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20   "test_function 
14bb0 3c 65 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a  <enc> <arg>".**.
14bc0 2a 2a 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69  ** Where <enc> i
14bd0 73 20 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20  s one of UTF-8, 
14be0 55 54 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31  UTF-16LE or UTF1
14bf0 36 42 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69  6BE, and <arg> i
14c00 73 20 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20  s the.** single 
14c10 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
14c20 74 6f 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  to the SQL funct
14c30 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72  ion. The value r
14c40 65 74 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68  eturned by.** th
14c50 65 20 54 43 4c 20 73 63 72 69 70 74 20 69 73 20  e TCL script is 
14c60 75 73 65 64 20 61 73 20 74 68 65 20 72 65 74 75  used as the retu
14c70 72 6e 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  rn value of the 
14c80 53 51 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74  SQL function. It
14c90 0a 2a 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f  .** is passed to
14ca0 20 53 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54   SQLite using UT
14cb0 46 2d 31 36 42 45 20 66 6f 72 20 61 20 55 54 46  F-16BE for a UTF
14cc0 2d 38 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  -8 test_function
14cd0 28 29 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72  (), UTF-8.** for
14ce0 20 61 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74   a UTF-16LE test
14cf0 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64  _function(), and
14d00 20 55 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e   UTF-16LE for an
14d10 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
14d20 74 68 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20  that.** prefers 
14d30 55 54 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66  UTF-16BE..*/.#if
14d40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
14d50 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f  _UTF16.static vo
14d60 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
14d70 5f 75 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33  _utf8(.  sqlite3
14d80 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
14d90 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
14da0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
14db0 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
14dc0 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
14dd0 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
14de0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
14df0 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
14e00 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
14e10 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
14e20 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
14e30 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
14e40 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
14e50 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
14e60 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
14e70 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
14e80 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
14e90 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
14ea0 62 6a 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29  bj("UTF-8", -1))
14eb0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
14ec0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
14ed0 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
14ee0 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14ef0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
14f00 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
14f10 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
14f20 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
14f30 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
14f40 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
14f50 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
14f60 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54  ult_text(pCtx, T
14f70 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
14f80 6c 74 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20  lt(interp), -1, 
14f90 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
14fa0 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
14fb0 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
14fc0 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
14fd0 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
14fe0 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
14ff0 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
15000 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
15010 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
15020 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
15030 5f 74 65 78 74 31 36 62 65 28 70 43 74 78 2c 20  _text16be(pCtx, 
15040 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
15050 78 74 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20  xt16be(pVal),.  
15060 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
15070 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
15080 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
15090 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  al);.}.static vo
150a0 69 64 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  id test_function
150b0 5f 75 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69  _utf16le(.  sqli
150c0 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
150d0 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  x, .  int nArg,.
150e0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
150f0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f  **argv.){.  Tcl_
15100 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a  Interp *interp;.
15110 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20    Tcl_Obj *pX;. 
15120 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
15130 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d  pVal;.  interp =
15140 20 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73   (Tcl_Interp *)s
15150 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61  qlite3_user_data
15160 28 70 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54  (pCtx);.  pX = T
15170 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
15180 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
15190 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
151a0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20  RefCount(pX);.  
151b0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
151c0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
151d0 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69   pX, Tcl_NewStri
151e0 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
151f0 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  , -1));.  Tcl_Li
15200 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
15210 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a  nt(interp, pX, .
15220 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
15230 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
15240 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
15250 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b  (argv[0]), -1));
15260 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78  .  Tcl_EvalObjEx
15270 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b  (interp, pX, 0);
15280 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  .  Tcl_DecrRefCo
15290 75 6e 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20  unt(pX);.  pVal 
152a0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
152b0 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
152c0 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
152d0 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69   -1, Tcl_GetStri
152e0 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  ngResult(interp)
152f0 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f  , .      SQLITE_
15300 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
15310 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  TIC);.  sqlite3_
15320 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
15330 2c 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ,(char*)sqlite3_
15340 76 61 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29  value_text(pVal)
15350 2c 2d 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53  ,-1,SQLITE_TRANS
15360 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
15370 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b  ValueFree(pVal);
15380 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  .}.static void t
15390 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66  est_function_utf
153a0 31 36 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f  16be(.  sqlite3_
153b0 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a  context *pCtx, .
153c0 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71    int nArg,.  sq
153d0 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72  lite3_value **ar
153e0 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65  gv.){.  Tcl_Inte
153f0 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63  rp *interp;.  Tc
15400 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c  l_Obj *pX;.  sql
15410 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
15420 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63  ;.  interp = (Tc
15430 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74  l_Interp *)sqlit
15440 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74  e3_user_data(pCt
15450 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e  x);.  pX = Tcl_N
15460 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73  ewStringObj("tes
15470 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29  t_function", -1)
15480 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
15490 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f  ount(pX);.  Tcl_
154a0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
154b0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c  ment(interp, pX,
154c0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
154d0 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31  j("UTF-16BE", -1
154e0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
154f0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
15500 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20  nterp, pX, .    
15510 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f    Tcl_NewStringO
15520 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65  bj((char*)sqlite
15530 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
15540 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54  v[0]), -1));.  T
15550 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74  cl_EvalObjEx(int
15560 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54  erp, pX, 0);.  T
15570 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
15580 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71  pX);.  pVal = sq
15590 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29  lite3ValueNew(0)
155a0 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
155b0 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c  SetStr(pVal, -1,
155c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65   Tcl_GetStringRe
155d0 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20  sult(interp), . 
155e0 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38       SQLITE_UTF8
155f0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
15600 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
15610 6c 74 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20  lt_text16(pCtx, 
15620 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
15630 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20  xt16le(pVal),.  
15640 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54      -1, SQLITE_T
15650 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c  RANSIENT);.  sql
15660 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
15670 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74  16be(pCtx, sqlit
15680 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c  e3_value_text16l
15690 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d  e(pVal),.      -
156a0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
156b0 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ENT);.  sqlite3_
156c0 72 65 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28  result_text16le(
156d0 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61  pCtx, sqlite3_va
156e0 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61  lue_text16le(pVa
156f0 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51  l),.      -1, SQ
15700 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
15710 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46  .  sqlite3ValueF
15720 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e  ree(pVal);.}.#en
15730 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
15740 49 54 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74  IT_UTF16 */.stat
15750 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
15760 4c 41 50 49 20 74 65 73 74 5f 66 75 6e 63 74 69  LAPI test_functi
15770 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  on(.  void * cli
15780 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
15790 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
157a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
157b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
157c0 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
157d0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
157e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
157f0 20 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28   int val;..  if(
15800 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20   objc!=5 ) goto 
15810 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20  bad_args;.  if( 
15820 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
15830 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
15840 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
15850 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15860 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c  RROR;..  if( TCL
15870 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
15880 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
15890 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c  p, objv[2], &val
158a0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
158b0 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
158c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
158d0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
158e0 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
158f0 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
15900 46 38 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  F8, .        int
15910 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
15920 6f 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a  on_utf8, 0, 0);.
15930 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b    }.  if( TCL_OK
15940 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  !=Tcl_GetBoolean
15950 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
15960 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
15970 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
15980 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a  R;.  if( val ){.
15990 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
159a0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
159b0 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c  "test_function",
159c0 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36   1, SQLITE_UTF16
159d0 4c 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74  LE, .        int
159e0 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69  erp, test_functi
159f0 6f 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30  on_utf16le, 0, 0
15a00 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c  );.  }.  if( TCL
15a10 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c  _OK!=Tcl_GetBool
15a20 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
15a30 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c  p, objv[4], &val
15a40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15a50 52 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20  RROR;.  if( val 
15a60 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  ){.    sqlite3_c
15a70 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
15a80 62 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  b, "test_functio
15a90 6e 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54  n", 1, SQLITE_UT
15aa0 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20  F16BE, .        
15ab0 69 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e  interp, test_fun
15ac0 63 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30  ction_utf16be, 0
15ad0 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  , 0);.  }..  ret
15ae0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f  urn TCL_OK;.bad_
15af0 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65  args:.  Tcl_Appe
15b00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
15b10 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
15b20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
15b30 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
15b40 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
15b50 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75  ], 0), " <DB> <u
15b60 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c  tf8> <utf16le> <
15b70 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23  utf16be>", 0);.#
15b80 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
15b90 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
15ba0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15bb0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
15bc0 3a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  :         sqlite
15bd0 33 5f 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65  3_test_errstr <e
15be0 72 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54  rr code>.**.** T
15bf0 65 73 74 20 74 68 61 74 20 74 68 65 20 65 6e 67  est that the eng
15c00 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74  lish language st
15c10 72 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73  ring equivalents
15c20 20 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f   for sqlite erro
15c30 72 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73  r codes.** are s
15c40 61 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74  ane. The paramet
15c50 65 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72  er is an integer
15c60 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e   representing an
15c70 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f   sqlite error co
15c80 64 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c  de..** The resul
15c90 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74  t is a list of t
15ca0 77 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65  wo elements, the
15cb0 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
15cc0 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a  tation of the.**
15cd0 20 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20   error code and 
15ce0 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67  the english lang
15cf0 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
15d00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
15d10 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
15d20 73 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69  st_errstr(.  voi
15d30 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
15d40 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
15d50 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
15d60 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
15d70 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63  ST objv[].){.  c
15d80 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e  har *zCode;.  in
15d90 74 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  t i;.  if( objc!
15da0 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
15db0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
15dc0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72  p, 1, objv, "<er
15dd0 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d  ror code>");.  }
15de0 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f  ..  zCode = Tcl_
15df0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
15e00 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
15e10 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <200; i++){.    
15e20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74 31  if( 0==strcmp(t1
15e30 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43  ErrorName(i), zC
15e40 6f 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20  ode) ) break;.  
15e50 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  }.  Tcl_SetResul
15e60 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
15e70 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  *)sqlite3ErrStr(
15e80 69 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  i), 0);.  return
15e90 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
15ea0 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65 61  * Usage:    brea
15eb0 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69  kpoint.**.** Thi
15ec0 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73  s routine exists
15ed0 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65   for one purpose
15ee0 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20   - to provide a 
15ef0 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a  place to put a.*
15f00 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74  * breakpoint wit
15f10 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20 62  h GDB that can b
15f20 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69 6e  e triggered usin
15f30 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65  g TCL code.  The
15f40 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73   use.** for this
15f50 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74 69   is when a parti
15f60 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73  cular test fails
15f70 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31 34   on (say) the 14
15f80 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a  85th iteration..
15f90 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65  ** In the TCL te
15fa0 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63 61  st script, we ca
15fb0 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20  n add code like 
15fc0 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  this:.**.**     
15fd0 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72  if {$i==1485} br
15fe0 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54  eakpoint.**.** T
15ff0 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74  hen run testfixt
16000 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75 67  ure in the debug
16010 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72  ger and wait for
16020 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20   the breakpoint 
16030 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65  to.** fire.  The
16040 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65  n additional bre
16050 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20  akpoints can be 
16060 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77  set to trace dow
16070 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74  n the bug..*/.st
16080 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
16090 54 43 4c 41 50 49 20 74 65 73 74 5f 62 72 65 61  TCLAPI test_brea
160a0 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  kpoint(.  void *
160b0 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
160c0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
160d0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
160e0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
160f0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
16100 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
16110 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
16120 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
16130 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
16140 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
16150 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
16160 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
16170 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
16180 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  ;         /* Do 
16190 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a  nothing */.}../*
161a0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
161b0 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  ite3_bind_zerobl
161c0 6f 62 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a  ob  STMT IDX N.*
161d0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
161e0 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
161f0 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20  lob interface.  
16200 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
16210 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
16220 20 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65   IDX is the inde
16230 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
16240 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
16250 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
16260 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
16270 73 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d  s a N-byte zero-
16280 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74  filled BLOB to t
16290 68 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  he wildcard..*/.
162a0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
162b0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69  E_TCLAPI test_bi
162c0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76  nd_zeroblob(.  v
162d0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
162e0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
162f0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16300 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16310 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
16320 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
16330 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
16340 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20  .  int n;.  int 
16350 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
16360 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
16370 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
16380 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d  p, 1, objv, "STM
16390 54 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72  T IDX N");.    r
163a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
163b0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
163c0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
163d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
163e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
163f0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
16400 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
16410 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
16420 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
16430 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
16440 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16450 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16460 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
16470 5d 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20  ], &n) ) return 
16480 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
16490 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
164a0 7a 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20  zeroblob(pStmt, 
164b0 69 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73  idx, n);.  if( s
164c0 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64  qlite3TestErrCod
164d0 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f  e(interp, StmtTo
164e0 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29  Db(pStmt), rc) )
164f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16500 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  R;.  if( rc!=SQL
16510 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16520 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16530 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43    }..  return TC
16540 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
16550 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
16560 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20  bind_zeroblob64 
16570 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a   STMT IDX N.**.*
16580 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
16590 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
165a0 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  64 interface.  S
165b0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
165c0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
165d0 49 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78  IDX is the index
165e0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
165f0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
16600 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
16610 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
16620 20 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66   a N-byte zero-f
16630 69 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68  illed BLOB to th
16640 65 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73  e wildcard..*/.s
16650 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
16660 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e  _TCLAPI test_bin
16670 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 28 0a 20 20  d_zeroblob64(.  
16680 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
16690 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
166a0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
166b0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
166c0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
166d0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
166e0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
166f0 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20  ;.  Tcl_WideInt 
16700 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  n;.  int rc;..  
16710 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
16720 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
16730 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
16740 62 6a 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e  bjv, "STMT IDX N
16750 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
16760 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
16770 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
16780 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
16790 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
167a0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
167b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
167c0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
167d0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
167e0 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
167f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16800 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
16810 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  WideIntFromObj(i
16820 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
16830 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &n) ) return TCL
16840 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
16850 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
16860 6f 62 6c 6f 62 36 34 28 70 53 74 6d 74 2c 20 69  oblob64(pStmt, i
16870 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71  dx, n);.  if( sq
16880 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
16890 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
168a0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
168b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
168c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
168d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
168e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
168f0 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72  terp, sqlite3Err
16900 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
16910 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
16920 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
16930 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
16940 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
16950 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54  te3_bind_int  ST
16960 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  MT N VALUE.**.**
16970 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
16980 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72  3_bind_int inter
16990 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
169a0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
169b0 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
169c0 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
169d0 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
169e0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
169f0 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
16a00 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20   binds a 32-bit 
16a10 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
16a20 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
16a30 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
16a40 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
16a50 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69  _bind_int(.  voi
16a60 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
16a70 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
16a80 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
16a90 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
16aa0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
16ab0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
16ac0 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
16ad0 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e   int value;.  in
16ae0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
16af0 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
16b00 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16b10 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
16b20 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
16b30 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
16b40 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
16b50 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
16b60 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29  TMT N VALUE", 0)
16b70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
16b80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
16b90 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
16ba0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
16bb0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16bc0 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
16bd0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16be0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
16bf0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16c00 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
16c10 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16c20 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
16c30 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16c40 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65   objv[3], &value
16c50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16c60 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
16c70 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
16c80 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
16c90 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
16ca0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
16cb0 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
16cc0 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
16cd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
16ce0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16cf0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
16d00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
16d10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
16d20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
16d30 20 20 20 69 6e 74 61 72 72 61 79 5f 61 64 64 72     intarray_addr
16d40 20 20 49 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a    INT  ....**.**
16d50 20 52 65 74 75 72 6e 20 74 68 65 20 61 64 64 72   Return the addr
16d60 65 73 73 20 6f 66 20 61 20 43 2d 6c 61 6e 67 75  ess of a C-langu
16d70 61 67 65 20 61 72 72 61 79 20 6f 66 20 33 32 2d  age array of 32-
16d80 62 69 74 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a  bit integers..**
16d90 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  .** Space to hol
16da0 64 20 74 68 65 20 61 72 72 61 79 20 69 73 20 6f  d the array is o
16db0 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
16dc0 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74 68 69  loc().  Call thi
16dd0 73 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 63 65  s procedure once
16de0 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72 67 75  .** with no argu
16df0 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 74  ments in order t
16e00 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
16e10 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20  .  Each call to 
16e20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a 2a  this procedure.*
16e30 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68 65  * overwrites the
16e40 20 70 72 65 76 69 6f 75 73 20 61 72 72 61 79 2e   previous array.
16e50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
16e60 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
16e70 74 5f 69 6e 74 61 72 72 61 79 5f 61 64 64 72 28  t_intarray_addr(
16e80 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
16e90 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
16ea0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
16eb0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
16ec0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
16ed0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
16ee0 61 74 69 63 20 69 6e 74 20 2a 70 20 3d 20 30 3b  atic int *p = 0;
16ef0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
16f00 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20  (p);.  p = 0;.  
16f10 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20  if( objc>1 ){.  
16f20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    p = sqlite3_ma
16f30 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30  lloc( sizeof(p[0
16f40 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20  ])*(objc-1) );. 
16f50 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65     if( p==0 ) re
16f60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16f70 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f      for(i=0; i<o
16f80 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  bjc-1; i++){.   
16f90 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
16fa0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
16fb0 20 6f 62 6a 76 5b 31 2b 69 5d 2c 20 26 70 5b 69   objv[1+i], &p[i
16fc0 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ]) ){.        sq
16fd0 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20  lite3_free(p);. 
16fe0 20 20 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20         p = 0;.  
16ff0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
17000 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
17010 20 20 20 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63      }.  }  .  Tc
17020 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
17030 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
17040 64 65 49 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65  deIntObj((sqlite
17050 33 5f 69 6e 74 36 34 29 70 29 29 3b 0a 20 20 72  3_int64)p));.  r
17060 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
17070 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 69  /*.** Usage:   i
17080 6e 74 61 72 72 61 79 5f 61 64 64 72 20 20 49 4e  ntarray_addr  IN
17090 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  T  ....**.** Ret
170a0 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20  urn the address 
170b0 6f 66 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20  of a C-language 
170c0 61 72 72 61 79 20 6f 66 20 33 32 2d 62 69 74 20  array of 32-bit 
170d0 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  integers..**.** 
170e0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68  Space to hold th
170f0 65 20 61 72 72 61 79 20 69 73 20 6f 62 74 61 69  e array is obtai
17100 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
17110 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72  ).  Call this pr
17120 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20  ocedure once.** 
17130 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
17140 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65  s in order to re
17150 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45  lease memory.  E
17160 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  ach call to this
17170 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76   procedure.** ov
17180 65 72 77 72 69 74 65 73 20 74 68 65 20 70 72 65  erwrites the pre
17190 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a  vious array..*/.
171a0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
171b0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69 6e  E_TCLAPI test_in
171c0 74 36 34 61 72 72 61 79 5f 61 64 64 72 28 0a 20  t64array_addr(. 
171d0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
171e0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
171f0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17200 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17210 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17220 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74  .  int i;.  stat
17230 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
17240 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69   *p = 0;..  sqli
17250 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70  te3_free(p);.  p
17260 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63   = 0;.  if( objc
17270 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71  >1 ){.    p = sq
17280 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69  lite3_malloc( si
17290 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63  zeof(p[0])*(objc
172a0 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  -1) );.    if( p
172b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ==0 ) return TCL
172c0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28  _ERROR;.    for(
172d0 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69  i=0; i<objc-1; i
172e0 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57  ++){.      Tcl_W
172f0 69 64 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20  ideInt v;.      
17300 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
17310 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
17320 2c 20 6f 62 6a 76 5b 31 2b 69 5d 2c 20 26 76 29  , objv[1+i], &v)
17330 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
17340 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
17350 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
17360 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17370 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
17380 20 20 20 20 70 5b 69 5d 20 3d 20 76 3b 0a 20 20      p[i] = v;.  
17390 20 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f    }.  }  .  Tcl_
173a0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
173b0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
173c0 49 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f  IntObj((sqlite3_
173d0 69 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65 74  int64)p));.  ret
173e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
173f0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 64 6f 75  .** Usage:   dou
17400 62 6c 65 61 72 72 61 79 5f 61 64 64 72 20 20 49  blearray_addr  I
17410 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65  NT  ....**.** Re
17420 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73 73  turn the address
17430 20 6f 66 20 61 20 43 2d 6c 61 6e 67 75 61 67 65   of a C-language
17440 20 61 72 72 61 79 20 6f 66 20 64 6f 75 62 6c 65   array of double
17450 73 2e 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74  s..**.** Space t
17460 6f 20 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79  o hold the array
17470 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
17480 6d 20 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c  m malloc().  Cal
17490 6c 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65  l this procedure
174a0 20 6f 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f   once.** with no
174b0 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72   arguments in or
174c0 64 65 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d  der to release m
174d0 65 6d 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c  emory.  Each cal
174e0 6c 20 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64  l to this proced
174f0 75 72 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65  ure.** overwrite
17500 73 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 61  s the previous a
17510 72 72 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rray..*/.static 
17520 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
17530 49 20 74 65 73 74 5f 64 6f 75 62 6c 65 61 72 72  I test_doublearr
17540 61 79 5f 61 64 64 72 28 0a 20 20 76 6f 69 64 20  ay_addr(.  void 
17550 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
17560 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17570 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17580 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
17590 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
175a0 20 69 3b 0a 20 20 73 74 61 74 69 63 20 64 6f 75   i;.  static dou
175b0 62 6c 65 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 73  ble *p = 0;..  s
175c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a  qlite3_free(p);.
175d0 20 20 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f    p = 0;.  if( o
175e0 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d  bjc>1 ){.    p =
175f0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
17600 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f   sizeof(p[0])*(o
17610 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20 20 69 66  bjc-1) );.    if
17620 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
17630 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66  TCL_ERROR;.    f
17640 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31  or(i=0; i<objc-1
17650 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
17660 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46  ( Tcl_GetDoubleF
17670 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
17680 62 6a 76 5b 31 2b 69 5d 2c 20 26 70 5b 69 5d 29  bjv[1+i], &p[i])
17690 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
176a0 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
176b0 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
176c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
176d0 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
176e0 20 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f    }.  }  .  Tcl_
176f0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
17700 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
17710 49 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f  IntObj((sqlite3_
17720 69 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65 74  int64)p));.  ret
17730 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
17740 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65 78  .** Usage:   tex
17750 74 61 72 72 61 79 5f 61 64 64 72 20 20 54 45 58  tarray_addr  TEX
17760 54 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  T ....**.** Retu
17770 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
17780 66 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61  f a C-language a
17790 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e  rray of strings.
177a0 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
177b0 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 69  hold the array i
177c0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
177d0 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20  malloc().  Call 
177e0 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f  this procedure o
177f0 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61  nce.** with no a
17800 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65  rguments in orde
17810 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  r to release mem
17820 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20  ory.  Each call 
17830 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  to this procedur
17840 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  e.** overwrites 
17850 74 68 65 20 70 72 65 76 69 6f 75 73 20 61 72 72  the previous arr
17860 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
17870 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
17880 74 65 73 74 5f 74 65 78 74 61 72 72 61 79 5f 61  test_textarray_a
17890 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ddr(.  void * cl
178a0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
178b0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
178c0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
178d0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
178e0 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  v[].){.  int i;.
178f0 20 20 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d    static int n =
17900 20 30 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61   0;.  static cha
17910 72 20 2a 2a 70 20 3d 20 30 3b 0a 0a 20 20 66 6f  r **p = 0;..  fo
17920 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
17930 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 5b   sqlite3_free(p[
17940 69 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  i]);.  sqlite3_f
17950 72 65 65 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b  ree(p);.  p = 0;
17960 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b  .  if( objc>1 ){
17970 0a 20 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33  .    p = sqlite3
17980 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  _malloc( sizeof(
17990 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29  p[0])*(objc-1) )
179a0 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29  ;.    if( p==0 )
179b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
179c0 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  R;.    for(i=0; 
179d0 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a  i<objc-1; i++){.
179e0 20 20 20 20 20 20 70 5b 69 5d 20 3d 20 73 71 6c        p[i] = sql
179f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
17a00 22 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  ", Tcl_GetString
17a10 28 6f 62 6a 76 5b 31 2b 69 5d 29 29 3b 0a 20 20  (objv[1+i]));.  
17a20 20 20 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 6f 62    }.  }.  n = ob
17a30 6a 63 2d 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  jc-1;.  Tcl_SetO
17a40 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
17a50 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
17a60 62 6a 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  bj((sqlite3_int6
17a70 34 29 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  4)p));.  return 
17a80 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
17a90 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
17aa0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53  e3_bind_int64  S
17ab0 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TMT N VALUE.**.*
17ac0 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
17ad0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e  e3_bind_int64 in
17ae0 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69  terface.  STMT i
17af0 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  s a prepared sta
17b00 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20  tement..** N is 
17b10 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77  the index of a w
17b20 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20 70  ildcard in the p
17b30 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
17b40 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  t.  This command
17b50 0a 2a 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62  .** binds a 64-b
17b60 69 74 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45  it integer VALUE
17b70 20 74 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72   to that wildcar
17b80 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
17b90 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
17ba0 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a  est_bind_int64(.
17bb0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17bc0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17bd0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17be0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17bf0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17c00 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
17c10 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69   *pStmt;.  int i
17c20 64 78 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e  dx;.  Tcl_WideIn
17c30 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  t value;.  int r
17c40 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
17c50 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
17c60 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
17c70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
17c80 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
17c90 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
17ca0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
17cb0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
17cc0 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
17cd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
17ce0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
17cf0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
17d00 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
17d10 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
17d20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
17d30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
17d40 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
17d50 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
17d60 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
17d70 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17d80 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49  if( Tcl_GetWideI
17d90 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
17da0 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75  , objv[3], &valu
17db0 65 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  e) ) return TCL_
17dc0 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
17dd0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
17de0 34 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  4(pStmt, idx, va
17df0 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
17e00 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
17e10 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
17e20 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
17e30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17e40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
17e60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17e70 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
17e80 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
17e90 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
17ea0 6e 64 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20  nd_double  STMT 
17eb0 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65  N VALUE.**.** Te
17ec0 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
17ed0 69 6e 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72  ind_double inter
17ee0 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61  face.  STMT is a
17ef0 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d   prepared statem
17f00 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65  ent..** N is the
17f10 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64   index of a wild
17f20 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65 70  card in the prep
17f30 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20  ared statement. 
17f40 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a   This command.**
17f50 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20   binds a 64-bit 
17f60 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f  integer VALUE to
17f70 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a   that wildcard..
17f80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
17f90 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
17fa0 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20  _bind_double(.  
17fb0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
17fc0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
17fd0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
17fe0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
17ff0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
18000 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
18010 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
18020 3b 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65  ;.  double value
18030 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   = 0;.  int rc;.
18040 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
18050 61 6c 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  al;.  int i;.  s
18060 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
18070 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ct {.    const c
18080 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
18090 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73  /* Name of the s
180a0 70 65 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20  pecial floating 
180b0 70 6f 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20  point value */. 
180c0 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20     unsigned int 
180d0 69 55 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70  iUpper;   /* Upp
180e0 65 72 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20  er 32 bits */.  
180f0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69    unsigned int i
18100 4c 6f 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65  Lower;   /* Lowe
18110 72 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d  r 32 bits */.  }
18120 20 61 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20   aSpecialFp[] = 
18130 7b 0a 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20  {.    {  "NaN", 
18140 20 20 20 20 20 30 78 37 66 66 66 66 66 66 66 2c       0x7fffffff,
18150 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20   0xffffffff },. 
18160 20 20 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20     {  "SNaN",   
18170 20 20 30 78 37 66 66 37 66 66 66 66 2c 20 30 78    0x7ff7ffff, 0x
18180 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20  ffffffff },.    
18190 7b 20 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30  {  "-NaN",     0
181a0 78 66 66 66 66 66 66 66 66 2c 20 30 78 66 66 66  xffffffff, 0xfff
181b0 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20  fffff },.    {  
181c0 22 2d 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66  "-SNaN",    0xff
181d0 66 37 66 66 66 66 2c 20 30 78 66 66 66 66 66 66  f7ffff, 0xffffff
181e0 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49  ff },.    {  "+I
181f0 6e 66 22 2c 20 20 20 20 20 30 78 37 66 66 30 30  nf",     0x7ff00
18200 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20  000, 0x00000000 
18210 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22  },.    {  "-Inf"
18220 2c 20 20 20 20 20 30 78 66 66 66 30 30 30 30 30  ,     0xfff00000
18230 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a  , 0x00000000 },.
18240 20 20 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22      {  "Epsilon"
18250 2c 20 20 30 78 30 30 30 30 30 30 30 30 2c 20 30  ,  0x00000000, 0
18260 78 30 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20  x00000001 },.   
18270 20 7b 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20   {  "-Epsilon", 
18280 30 78 38 30 30 30 30 30 30 30 2c 20 30 78 30 30  0x80000000, 0x00
18290 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20  000001 },.    { 
182a0 20 22 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37   "NaN0",     0x7
182b0 66 66 38 30 30 30 30 2c 20 30 78 30 30 30 30 30  ff80000, 0x00000
182c0 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  000 },.    {  "-
182d0 4e 61 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38  NaN0",    0xfff8
182e0 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30 30  0000, 0x00000000
182f0 20 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20   },.  };..  if( 
18300 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
18310 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
18320 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
18330 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
18340 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
18350 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
18360 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
18370 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
18380 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
18390 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
183a0 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
183b0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
183c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
183d0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
183e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
183f0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
18400 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
18410 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
18420 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18430 4f 52 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63  OR;..  /* Interc
18440 65 70 74 20 74 68 65 20 73 74 72 69 6e 67 20 22  ept the string "
18450 4e 61 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74  NaN" and generat
18460 65 20 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f  e a NaN value fo
18470 72 20 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f  r it..  ** All o
18480 74 68 65 72 20 73 74 72 69 6e 67 73 20 61 72 65  ther strings are
18490 20 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20   passed through 
184a0 74 6f 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65  to Tcl_GetDouble
184b0 46 72 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20  FromObj()..  ** 
184c0 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
184d0 6d 4f 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e  mObj() should un
184e0 64 65 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62  derstand "NaN" b
184f0 75 74 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73  ut some versions
18500 0a 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20  .  ** contain a 
18510 62 75 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c  bug..  */.  zVal
18520 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
18530 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72  (objv[3]);.  for
18540 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61  (i=0; i<sizeof(a
18550 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f  SpecialFp)/sizeo
18560 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29  f(aSpecialFp[0])
18570 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
18580 73 74 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46  strcmp(aSpecialF
18590 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c  p[i].zName, zVal
185a0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
185b0 6c 69 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a  lite3_uint64 x;.
185c0 20 20 20 20 20 20 78 20 3d 20 61 53 70 65 63 69        x = aSpeci
185d0 61 6c 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a  alFp[i].iUpper;.
185e0 20 20 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a        x <<= 32;.
185f0 20 20 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63        x |= aSpec
18600 69 61 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b  ialFp[i].iLower;
18610 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
18620 69 7a 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20  izeof(value)==8 
18630 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
18640 20 73 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b   sizeof(x)==8 );
18650 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76  .      memcpy(&v
18660 61 6c 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20  alue, &x, 8);.  
18670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18680 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69  .  }.  if( i>=si
18690 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29  zeof(aSpecialFp)
186a0 2f 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c  /sizeof(aSpecial
186b0 46 70 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20  Fp[0]) &&.      
186c0 20 20 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65     Tcl_GetDouble
186d0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
186e0 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
186f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
18700 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
18710 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e  rc = sqlite3_bin
18720 64 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20  d_double(pStmt, 
18730 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69  idx, value);.  i
18740 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
18750 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
18760 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
18770 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
18780 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
18790 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
187a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
187b0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
187c0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
187d0 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69  ** Usage:   sqli
187e0 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53  te3_bind_null  S
187f0 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  TMT N.**.** Test
18800 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
18810 64 5f 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65  d_null interface
18820 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
18830 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
18840 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64  .** N is the ind
18850 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64  ex of a wildcard
18860 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64   in the prepared
18870 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69   statement.  Thi
18880 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e  s command.** bin
18890 64 73 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65  ds a NULL to the
188a0 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
188b0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
188c0 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
188d0 5f 6e 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20  _null(.  void * 
188e0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
188f0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18900 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18910 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18920 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18930 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
18940 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
18950 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
18960 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
18970 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18980 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
18990 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
189a0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
189b0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
189c0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
189d0 4d 54 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72  MT N", 0);.    r
189e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
189f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
18a00 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
18a10 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
18a20 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
18a30 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
18a40 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
18a50 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
18a60 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
18a70 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54  &idx) ) return T
18a80 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
18a90 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e  = sqlite3_bind_n
18aa0 75 6c 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b  ull(pStmt, idx);
18ab0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
18ac0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
18ad0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
18ae0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
18af0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
18b00 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18b10 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
18b20 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
18b30 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
18b40 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
18b50 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
18b60 74 20 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47  t  STMT N STRING
18b70 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
18b80 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
18b90 6e 64 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63  nd_text interfac
18ba0 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
18bb0 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
18bc0 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
18bd0 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
18be0 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
18bf0 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
18c00 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
18c10 6e 64 73 20 61 20 55 54 46 2d 38 20 73 74 72 69  nds a UTF-8 stri
18c20 6e 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65  ng STRING to the
18c30 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20   wildcard.  The 
18c40 73 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20  string is BYTES 
18c50 62 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a  bytes.** long..*
18c60 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
18c70 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
18c80 62 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69  bind_text(.  voi
18c90 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
18ca0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
18cb0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
18cc0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
18cd0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
18ce0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
18cf0 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
18d00 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68   int bytes;.  ch
18d10 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ar *value;.  int
18d20 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
18d30 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
18d40 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
18d50 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
18d60 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
18d70 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
18d80 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
18d90 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54  bjv[0], 0), " ST
18da0 4d 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53  MT N VALUE BYTES
18db0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
18dc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18dd0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
18de0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18df0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18e00 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
18e10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
18e20 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
18e30 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
18e40 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78  p, objv[2], &idx
18e50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18e60 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20  RROR;.  value = 
18e70 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79  (char*)Tcl_GetBy
18e80 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f  teArrayFromObj(o
18e90 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b  bjv[3], &bytes);
18ea0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
18eb0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
18ec0 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
18ed0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
18ee0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
18ef0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
18f00 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
18f10 65 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45  e, bytes, SQLITE
18f20 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69  _TRANSIENT);.  i
18f30 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
18f40 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
18f50 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
18f60 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
18f70 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
18f80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f90 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
18fa0 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
18fb0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
18fc0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
18fd0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
18fe0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
18ff0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
19000 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
19010 78 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53  xt16 ?-static? S
19020 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54  TMT N STRING BYT
19030 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  ES.**.** Test th
19040 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74  e sqlite3_bind_t
19050 65 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e  ext16 interface.
19060 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
19070 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
19080 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
19090 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
190a0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
190b0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
190c0 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
190d0 73 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e  s a UTF-16 strin
190e0 67 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20  g STRING to the 
190f0 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73  wildcard.  The s
19100 74 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62  tring is BYTES b
19110 79 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f  ytes.** long..*/
19120 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
19130 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
19140 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f  ind_text16(.  vo
19150 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
19160 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
19170 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
19180 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
19190 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
191a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
191b0 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65  T_UTF16.  sqlite
191c0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
191d0 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20   int idx;.  int 
191e0 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76  bytes;.  char *v
191f0 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
19200 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28  .  void (*xDel)(
19210 76 6f 69 64 2a 29 20 3d 20 28 6f 62 6a 63 3d 3d  void*) = (objc==
19220 36 3f 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3a  6?SQLITE_STATIC:
19230 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
19240 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53  );.  Tcl_Obj *oS
19250 74 6d 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62  tmt    = objv[ob
19260 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a  jc-4];.  Tcl_Obj
19270 20 2a 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a   *oN       = obj
19280 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c  v[objc-3];.  Tcl
19290 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d  _Obj *oString  =
192a0 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20   objv[objc-2];. 
192b0 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73   Tcl_Obj *oBytes
192c0 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31     = objv[objc-1
192d0 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
192e0 35 20 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20  5 && objc!=6){. 
192f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
19300 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
19310 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
19320 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
19330 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
19340 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
19350 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c  0), " STMT N VAL
19360 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  UE BYTES", 0);. 
19370 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19380 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
19390 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
193a0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
193b0 72 69 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70 53  ring(oStmt), &pS
193c0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
193d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
193e0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
193f0 28 69 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64  (interp, oN, &id
19400 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
19410 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d  ERROR;.  value =
19420 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42   (char*)Tcl_GetB
19430 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28  yteArrayFromObj(
19440 6f 53 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69  oString, 0);.  i
19450 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
19460 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79  mObj(interp, oBy
19470 74 65 73 2c 20 26 62 79 74 65 73 29 20 29 20 72  tes, &bytes) ) r
19480 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19490 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
194a0 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74  _bind_text16(pSt
194b0 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a  mt, idx, (void *
194c0 29 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78  )value, bytes, x
194d0 44 65 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Del);.  if( sqli
194e0 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
194f0 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
19500 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
19510 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
19520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19530 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
19540 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19550 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
19560 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
19570 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19580 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  ;.  }..#endif /*
19590 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
195a0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
195b0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
195c0 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
195d0 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61  _bind_blob ?-sta
195e0 74 69 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41  tic? STMT N DATA
195f0 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73   BYTES.**.** Tes
19600 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
19610 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63  nd_blob interfac
19620 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
19630 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
19640 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
19650 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
19660 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
19670 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
19680 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
19690 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68  nds a BLOB to th
196a0 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65  e wildcard.  The
196b0 20 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62   BLOB is BYTES b
196c0 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f  ytes in size..*/
196d0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
196e0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
196f0 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  ind_blob(.  void
19700 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
19710 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
19720 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
19730 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
19740 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
19750 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
19760 74 3b 0a 20 20 69 6e 74 20 6c 65 6e 2c 20 69 64  t;.  int len, id
19770 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  x;.  int bytes;.
19780 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20    char *value;. 
19790 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
197a0 65 33 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79  e3_destructor_ty
197b0 70 65 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d  pe xDestructor =
197c0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
197d0 54 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  T;..  if( objc!=
197e0 35 20 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a  5 && objc!=6 ){.
197f0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
19800 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
19810 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
19820 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
19830 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
19840 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
19850 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41   0), " STMT N DA
19860 54 41 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20  TA BYTES", 0);. 
19870 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19880 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
19890 6f 62 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78  objc==6 ){.    x
198a0 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c  Destructor = SQL
198b0 49 54 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20  ITE_STATIC;.    
198c0 6f 62 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69  objv++;.  }..  i
198d0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
198e0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
198f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
19900 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
19910 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19920 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
19930 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
19940 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
19950 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19960 0a 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61  ..  value = (cha
19970 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
19980 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
19990 33 5d 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  3], &len);.  if(
199a0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
199b0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
199c0 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
199d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
199e0 0a 20 20 69 66 28 20 62 79 74 65 73 3e 6c 65 6e  .  if( bytes>len
199f0 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
19a00 66 5b 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69  f[200];.    sqli
19a10 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
19a20 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
19a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
19a40 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20 75 73        "cannot us
19a50 65 20 25 64 20 62 6c 6f 62 20 62 79 74 65 73 2c  e %d blob bytes,
19a60 20 68 61 76 65 20 25 64 22 2c 20 62 79 74 65 73   have %d", bytes
19a70 2c 20 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f  , len);.    Tcl_
19a80 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
19a90 65 72 70 2c 20 7a 42 75 66 2c 20 2d 31 29 3b 0a  erp, zBuf, -1);.
19aa0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19ab0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  RROR;.  }..  rc 
19ac0 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62  = sqlite3_bind_b
19ad0 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  lob(pStmt, idx, 
19ae0 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44  value, bytes, xD
19af0 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66  estructor);.  if
19b00 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
19b10 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
19b20 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
19b30 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
19b40 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
19b50 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19b60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19b70 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  R;.  }..  return
19b80 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
19b90 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
19ba0 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  e3_bind_paramete
19bb0 72 5f 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a  r_count  STMT.**
19bc0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
19bd0 75 6d 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72  umber of wildcar
19be0 64 73 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20  ds in the given 
19bf0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74  statement..*/.st
19c00 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
19c10 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
19c20 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74  _parameter_count
19c30 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
19c40 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
19c50 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
19c60 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
19c70 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
19c80 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
19c90 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
19ca0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
19cb0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
19cc0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
19cd0 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20  v, "STMT");.    
19ce0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19cf0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
19d00 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
19d10 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
19d20 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
19d30 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
19d40 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
19d50 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
19d60 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
19d70 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
19d80 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74  ameter_count(pSt
19d90 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  mt)));.  return 
19da0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19db0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
19dc0 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
19dd0 5f 6e 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a  _name  STMT  N.*
19de0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19df0 6e 61 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20  name of the Nth 
19e00 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66  wildcard.  The f
19e10 69 72 73 74 20 77 69 6c 64 63 61 72 64 20 69 73  irst wildcard is
19e20 20 31 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20   1..** An empty 
19e30 73 74 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e  string is return
19e40 65 64 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f  ed if N is out o
19e50 66 20 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68  f range or if th
19e60 65 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73  e wildcard.** is
19e70 20 6e 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74   nameless..*/.st
19e80 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
19e90 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
19ea0 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
19eb0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
19ec0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19ed0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19ee0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19ef0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19f00 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
19f10 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
19f20 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  i;..  if( objc!=
19f30 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
19f40 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
19f50 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
19f60 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   N");.    return
19f70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
19f80 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
19f90 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
19fa0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
19fb0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
19fc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19fd0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
19fe0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
19ff0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20   objv[2], &i) ) 
1a000 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a010 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1a020 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
1a030 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
1a040 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64  Obj(sqlite3_bind
1a050 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
1a060 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29  pStmt,i),-1).  )
1a070 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1a080 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1a090 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
1a0a0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
1a0b0 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a  x  STMT  NAME.**
1a0c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
1a0d0 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64  ndex of the wild
1a0e0 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45  card called NAME
1a0f0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
1a100 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75  here is.** no su
1a110 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  ch wildcard..*/.
1a120 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1a130 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69  E_TCLAPI test_bi
1a140 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64  nd_parameter_ind
1a150 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ex(.  void * cli
1a160 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a170 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a180 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1a190 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1a1a0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1a1b0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
1a1c0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1a1d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1a1e0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1a1f0 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22  bjv, "STMT NAME"
1a200 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1a210 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1a220 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1a230 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1a240 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1a250 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1a260 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a270 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1a280 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54  (interp, .     T
1a290 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20  cl_NewIntObj(.  
1a2a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1a2b0 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
1a2c0 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53  x(pStmt,Tcl_GetS
1a2d0 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a  tring(objv[2])).
1a2e0 20 20 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65       ).  );.  re
1a2f0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a300 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1a310 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
1a320 64 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f  dings STMT.**.*/
1a330 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1a340 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
1a350 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20  lear_bindings(. 
1a360 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1a370 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1a380 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1a390 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1a3a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1a3b0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1a3c0 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f  *pStmt;..  if( o
1a3d0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
1a3e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
1a3f0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
1a400 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74  "STMT");.    ret
1a410 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a420 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
1a430 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1a440 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a450 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1a460 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a470 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  OR;.  Tcl_SetObj
1a480 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1a490 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c  cl_NewIntObj(sql
1a4a0 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
1a4b0 6e 67 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20  ngs(pStmt)));.  
1a4c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a4d0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1a4e0 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d   sqlite3_sleep M
1a4f0 49 4c 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73  ILLISECONDS.*/.s
1a500 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1a510 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6c 65  _TCLAPI test_sle
1a520 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ep(.  void * cli
1a530 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1a540 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1a550 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1a560 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1a570 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a  [].){.  int ms;.
1a580 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1a590 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1a5a0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1a5b0 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
1a5c0 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74  CONDS");.    ret
1a5d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1a5e0 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
1a5f0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1a600 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29  p, objv[1], &ms)
1a610 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
1a620 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1a630 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1a640 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1a650 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73  IntObj(sqlite3_s
1a660 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65  leep(ms)));.  re
1a670 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a680 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1a690 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
1a6a0 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rcode DB.**.** R
1a6b0 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67  eturn the string
1a6c0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
1a6d0 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
1a6e0 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
1a6f0 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
1a700 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52  e.g. "SQLITE_ERR
1a710 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  OR"..*/.static i
1a720 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1a730 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65   test_ex_errcode
1a740 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1a750 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1a760 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1a770 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1a780 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1a790 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1a7a0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
1a7b0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1a7c0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1a7d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1a7e0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1a7f0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1a800 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1a810 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
1a820 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a830 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1a840 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1a850 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1a860 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1a870 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1a880 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1a890 3d 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  = sqlite3_extend
1a8a0 65 64 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  ed_errcode(db);.
1a8b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1a8c0 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1a8d0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1a8e0 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
1a8f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
1a900 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1a910 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a  3_errcode DB.**.
1a920 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 73 74  ** Return the st
1a930 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74  ring representat
1a940 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
1a950 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a  recent sqlite3_*
1a960 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f   API.** error co
1a970 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45  de. e.g. "SQLITE
1a980 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74  _ERROR"..*/.stat
1a990 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1a9a0 4c 41 50 49 20 74 65 73 74 5f 65 72 72 63 6f 64  LAPI test_errcod
1a9b0 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1a9c0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1a9d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1a9e0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1a9f0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1aa00 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
1aa10 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
1aa20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1aa30 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1aa40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1aa50 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1aa60 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1aa70 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1aa80 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22  (objv[0]), " DB"
1aa90 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1aaa0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1aab0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1aac0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1aad0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1aae0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1aaf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1ab00 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
1ab10 64 65 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70  de(db);.  Tcl_Ap
1ab20 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ab30 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
1ab40 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a  orName(rc), 0);.
1ab50 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1ab60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1ab70 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
1ab80 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  g DB.**.** Retur
1ab90 6e 73 20 74 68 65 20 55 54 46 2d 38 20 72 65 70  ns the UTF-8 rep
1aba0 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  resentation of t
1abb0 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  he error message
1abc0 20 73 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a   string for the.
1abd0 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73  ** most recent s
1abe0 71 6c 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c  qlite3_* API cal
1abf0 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  l..*/.static int
1ac00 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1ac10 65 73 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f  est_errmsg(.  vo
1ac20 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1ac30 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1ac40 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1ac50 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1ac60 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1ac70 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1ac80 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
1ac90 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1aca0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1acb0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1acc0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1acd0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1ace0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1acf0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1ad00 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1ad10 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1ad20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1ad30 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1ad40 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1ad50 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1ad60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1ad70 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
1ad80 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54  _errmsg(db);.  T
1ad90 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1ada0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53  interp, Tcl_NewS
1adb0 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d  tringObj(zErr, -
1adc0 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1));.  return TC
1add0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ade0 73 61 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72  sage:   test_err
1adf0 6d 73 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52  msg16 DB.**.** R
1ae00 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31  eturns the UTF-1
1ae10 36 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  6 representation
1ae20 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
1ae30 73 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72  ssage string for
1ae40 20 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63   the.** most rec
1ae50 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50  ent sqlite3_* AP
1ae60 49 20 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20  I call. This is 
1ae70 61 20 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a  a byte array obj
1ae80 65 63 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a  ect at the TCL .
1ae90 2a 2a 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74  ** level, and it
1aea0 20 69 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78   includes the 0x
1aeb0 30 30 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74  00 0x00 terminat
1aec0 6f 72 20 62 79 74 65 73 20 61 74 20 74 68 65 20  or bytes at the 
1aed0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54  end of the.** UT
1aee0 46 2d 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  F-16 string..*/.
1aef0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1af00 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 72  E_TCLAPI test_er
1af10 72 6d 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a  rmsg16(.  void *
1af20 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1af30 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1af40 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1af50 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1af60 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1af70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1af80 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
1af90 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
1afa0 2a 7a 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63  *zErr;.  const c
1afb0 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79  har *z;.  int by
1afc0 74 65 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  tes = 0;..  if( 
1afd0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1afe0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1aff0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1b000 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1b010 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1b020 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1b030 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b  [0]), " DB", 0);
1b040 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b050 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1b060 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1b070 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1b080 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1b090 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1b0a0 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d  ERROR;..  zErr =
1b0b0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31   sqlite3_errmsg1
1b0c0 36 28 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72  6(db);.  if( zEr
1b0d0 72 20 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72  r ){.    z = zEr
1b0e0 72 3b 0a 20 20 20 20 66 6f 72 28 62 79 74 65 73  r;.    for(bytes
1b0f0 3d 30 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20  =0; z[bytes] || 
1b100 7a 5b 62 79 74 65 73 2b 31 5d 3b 20 62 79 74 65  z[bytes+1]; byte
1b110 73 2b 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63  s+=2){}.  }.  Tc
1b120 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1b130 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79  nterp, Tcl_NewBy
1b140 74 65 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c  teArrayObj(zErr,
1b150 20 62 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66   bytes));.#endif
1b160 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1b170 55 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72  UTF16 */.  retur
1b180 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b190 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1b1a0 33 5f 70 72 65 70 61 72 65 20 44 42 20 73 71 6c  3_prepare DB sql
1b1b0 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f   bytes ?tailvar?
1b1c0 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75  .**.** Compile u
1b1d0 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74  p to <bytes> byt
1b1e0 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69  es of the suppli
1b1f0 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73  ed SQL string <s
1b200 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74  ql> using.** dat
1b210 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42  abase handle <DB
1b220 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  >. The parameter
1b230 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68   <tailval> is th
1b240 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62  e name of a glob
1b250 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  al.** variable t
1b260 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  hat is set to th
1b270 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e  e unused portion
1b280 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e   of <sql> (if an
1b290 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61  y). A.** STMT ha
1b2a0 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64  ndle is returned
1b2b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b2c0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1b2d0 73 74 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f  st_prepare(.  vo
1b2e0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1b2f0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1b300 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1b310 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1b320 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1b330 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1b340 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
1b350 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
1b360 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
1b370 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  l = 0;.  sqlite3
1b380 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
1b390 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30  ;.  char zBuf[50
1b3a0 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  ];.  int rc;..  
1b3b0 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
1b3c0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
1b3d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b3e0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1b3f0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1b400 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1b410 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b420 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
1b430 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20  tes ?tailvar?", 
1b440 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b450 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1b460 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1b470 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1b480 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1b490 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1b4a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
1b4b0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1b4c0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
1b4d0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1b4e0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1b4f0 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1b500 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b510 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1b520 70 72 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c  prepare(db, zSql
1b530 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1b540 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
1b550 6c 20 3a 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65  l : 0);.  Tcl_Re
1b560 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
1b570 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1b580 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
1b590 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
1b5a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b5b0 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20 6f    if( zTail && o
1b5c0 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66  bjc>=5 ){.    if
1b5d0 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20  ( bytes>=0 ){.  
1b5e0 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65      bytes = byte
1b5f0 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d  s - (int)(zTail-
1b600 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zSql);.    }.   
1b610 20 69 66 28 20 28 69 6e 74 29 73 74 72 6c 65 6e   if( (int)strlen
1b620 28 7a 54 61 69 6c 29 3c 62 79 74 65 73 20 29 7b  (zTail)<bytes ){
1b630 0a 20 20 20 20 20 20 62 79 74 65 73 20 3d 20 28  .      bytes = (
1b640 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c  int)strlen(zTail
1b650 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
1b660 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
1b670 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20  rp, objv[4], 0, 
1b680 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
1b690 28 7a 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20  (zTail, bytes), 
1b6a0 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
1b6b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1b6c0 20 20 20 61 73 73 65 72 74 28 20 70 53 74 6d 74     assert( pStmt
1b6d0 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
1b6e0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
1b6f0 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
1b700 22 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20  "(%d) ", rc);.  
1b710 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b720 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1b730 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1b740 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  db), 0);.    ret
1b750 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b760 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
1b770 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1b780 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1b790 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1b7a0 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
1b7b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1b7c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1b7d0 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  lt(interp, zBuf,
1b7e0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
1b7f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1b800 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1b810 33 5f 70 72 65 70 61 72 65 5f 76 32 20 44 42 20  3_prepare_v2 DB 
1b820 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76  sql bytes ?tailv
1b830 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c  ar?.**.** Compil
1b840 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20  e up to <bytes> 
1b850 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70  bytes of the sup
1b860 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67  plied SQL string
1b870 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20   <sql> using.** 
1b880 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
1b890 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65  <DB>. The parame
1b8a0 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73  ter <tailval> is
1b8b0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67   the name of a g
1b8c0 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  lobal.** variabl
1b8d0 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f  e that is set to
1b8e0 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74   the unused port
1b8f0 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66  ion of <sql> (if
1b900 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54   any). A.** STMT
1b910 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72   handle is retur
1b920 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
1b930 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1b940 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32   test_prepare_v2
1b950 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b960 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b970 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b980 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b990 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b9a0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
1b9b0 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
1b9c0 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a  *zSql;.  char *z
1b9d0 43 6f 70 79 20 3d 20 30 3b 20 20 20 20 20 20 20  Copy = 0;       
1b9e0 20 20 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c           /* mall
1b9f0 6f 63 28 29 20 63 6f 70 79 20 6f 66 20 7a 53 71  oc() copy of zSq
1ba00 6c 20 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65 73  l */.  int bytes
1ba10 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1ba20 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  zTail = 0;.  sql
1ba30 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1ba40 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
1ba50 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b  f[50];.  int rc;
1ba60 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
1ba70 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
1ba80 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ba90 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1baa0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1bab0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1bac0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1bad0 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71  bjv[0]), " DB sq
1bae0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 22  l bytes tailvar"
1baf0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1bb00 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1bb10 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1bb20 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1bb30 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1bb40 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1bb50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
1bb60 71 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  ql = Tcl_GetStri
1bb70 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
1bb80 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1bb90 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1bba0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
1bbb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bbc0 3b 0a 0a 20 20 2f 2a 20 49 6e 73 74 65 61 64 20  ;..  /* Instead 
1bbd0 6f 66 20 75 73 69 6e 67 20 7a 53 71 6c 20 64 69  of using zSql di
1bbe0 72 65 63 74 6c 79 2c 20 6d 61 6b 65 20 61 20 63  rectly, make a c
1bbf0 6f 70 79 20 69 6e 74 6f 20 61 20 62 75 66 66 65  opy into a buffe
1bc00 72 20 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20  r obtained.  ** 
1bc10 64 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 6d 61  directly from ma
1bc20 6c 6c 6f 63 28 29 2e 20 54 68 65 20 69 64 65 61  lloc(). The idea
1bc30 20 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65   is to make it e
1bc40 61 73 69 65 72 20 66 6f 72 20 76 61 6c 67 72 69  asier for valgri
1bc50 6e 64 0a 20 20 2a 2a 20 74 6f 20 73 70 6f 74 20  nd.  ** to spot 
1bc60 62 75 66 66 65 72 20 6f 76 65 72 72 65 61 64 73  buffer overreads
1bc70 2e 20 20 2a 2f 0a 20 20 69 66 28 20 62 79 74 65  .  */.  if( byte
1bc80 73 3e 3d 30 20 29 7b 0a 20 20 20 20 7a 43 6f 70  s>=0 ){.    zCop
1bc90 79 20 3d 20 6d 61 6c 6c 6f 63 28 62 79 74 65 73  y = malloc(bytes
1bca0 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43  );.    memcpy(zC
1bcb0 6f 70 79 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73  opy, zSql, bytes
1bcc0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1bcd0 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  int n = (int)str
1bce0 6c 65 6e 28 7a 53 71 6c 29 20 2b 20 31 3b 0a 20  len(zSql) + 1;. 
1bcf0 20 20 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f     zCopy = mallo
1bd00 63 28 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  c(n);.    memcpy
1bd10 28 7a 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 6e 29  (zCopy, zSql, n)
1bd20 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1bd30 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1bd40 64 62 2c 20 7a 43 6f 70 79 2c 20 62 79 74 65 73  db, zCopy, bytes
1bd50 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d  , &pStmt, objc>=
1bd60 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b  5 ? &zTail : 0);
1bd70 0a 20 20 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a  .  free(zCopy);.
1bd80 20 20 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b    zTail = &zSql[
1bd90 28 7a 54 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d  (zTail - zCopy)]
1bda0 3b 0a 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d  ;..  assert(rc==
1bdb0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74  SQLITE_OK || pSt
1bdc0 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65  mt==0);.  Tcl_Re
1bdd0 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
1bde0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1bdf0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
1be00 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
1be10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1be20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1be30 5f 4f 4b 20 26 26 20 7a 54 61 69 6c 20 26 26 20  _OK && zTail && 
1be40 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69  objc>=5 ){.    i
1be50 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20  f( bytes>=0 ){. 
1be60 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74       bytes = byt
1be70 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c  es - (int)(zTail
1be80 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  -zSql);.    }.  
1be90 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
1bea0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1beb0 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  , 0, Tcl_NewStri
1bec0 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74  ngObj(zTail, byt
1bed0 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  es), 0);.  }.  i
1bee0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1bef0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
1bf00 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
1bf10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
1bf20 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
1bf30 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63  Buf, "(%d) ", rc
1bf40 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
1bf50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1bf60 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72  zBuf, sqlite3_er
1bf70 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
1bf80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1bf90 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  OR;.  }..  if( p
1bfa0 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
1bfb0 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
1bfc0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
1bfd0 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
1bfe0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bff0 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
1c000 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1c010 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
1c020 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1c030 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1c040 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74  qlite3_prepare_t
1c050 6b 74 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20  kt3134 DB.**.** 
1c060 47 65 6e 65 72 61 74 65 20 61 20 70 72 65 70 61  Generate a prepa
1c070 72 65 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f  red statement fo
1c080 72 20 61 20 7a 65 72 6f 2d 62 79 74 65 20 73 74  r a zero-byte st
1c090 72 69 6e 67 20 61 73 20 61 20 74 65 73 74 0a 2a  ring as a test.*
1c0a0 2a 20 66 6f 72 20 74 69 63 6b 65 74 20 23 33 31  * for ticket #31
1c0b0 33 34 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20  34.  The string 
1c0c0 73 68 6f 75 6c 64 20 62 65 20 70 72 65 63 65 64  should be preced
1c0d0 65 64 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74  ed by a zero byt
1c0e0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1c0f0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1c100 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
1c110 31 33 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  134(.  void * cl
1c120 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1c130 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1c140 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1c150 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1c160 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1c170 20 2a 64 62 3b 0a 20 20 73 74 61 74 69 63 20 63   *db;.  static c
1c180 6f 6e 73 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d  onst char zSql[]
1c190 20 3d 20 22 5c 30 30 30 53 45 4c 45 43 54 20 31   = "\000SELECT 1
1c1a0 22 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ";.  sqlite3_stm
1c1b0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1c1c0 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
1c1d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
1c1e0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1c1f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1c200 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1c210 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1c220 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1c230 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1c240 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62  [0]), " DB sql b
1c250 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30  ytes tailvar", 0
1c260 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c270 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1c280 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1c290 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1c2a0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1c2b0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1c2c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1c2d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1c2e0 76 32 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c  v2(db, &zSql[1],
1c2f0 20 30 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a   0, &pStmt, 0);.
1c300 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c    assert(rc==SQL
1c310 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d  ITE_OK || pStmt=
1c320 3d 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  =0);.  if( sqlit
1c330 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1c340 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
1c350 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c360 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1c370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
1c380 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
1c390 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
1c3a0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
1c3b0 66 29 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20  f), zBuf, "(%d) 
1c3c0 22 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f  ", rc);.    Tcl_
1c3d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c3e0 65 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74  erp, zBuf, sqlit
1c3f0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
1c400 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c410 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c420 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1c430 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1c440 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1c450 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
1c460 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1c470 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
1c480 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c490 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
1c4a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1c4b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1c4c0 67 65 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ge: sqlite3_prep
1c4d0 61 72 65 31 36 20 44 42 20 73 71 6c 20 62 79 74  are16 DB sql byt
1c4e0 65 73 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a  es tailvar.**.**
1c4f0 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
1c500 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
1c510 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
1c520 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
1c530 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
1c540 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
1c550 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
1c560 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
1c570 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
1c580 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
1c590 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
1c5a0 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
1c5b0 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
1c5c0 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
1c5d0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1c5e0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1c5f0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72 65  _TCLAPI test_pre
1c600 70 61 72 65 31 36 28 0a 20 20 76 6f 69 64 20 2a  pare16(.  void *
1c610 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1c620 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c630 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1c640 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1c650 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1c660 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1c670 46 31 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  F16.  sqlite3 *d
1c680 62 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  b;.  const void 
1c690 2a 7a 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76  *zSql;.  const v
1c6a0 6f 69 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a  oid *zTail = 0;.
1c6b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c    Tcl_Obj *pTail
1c6c0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1c6d0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
1c6e0 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
1c6f0 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ; .  int rc;.  i
1c700 6e 74 20 62 79 74 65 73 3b 20 20 20 20 20 20 20  nt bytes;       
1c710 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c720 69 6e 74 65 67 65 72 20 73 70 65 63 69 66 69 65  integer specifie
1c730 64 20 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20  d as arg 3 */.  
1c740 69 6e 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20  int objlen;     
1c750 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
1c760 20 62 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67   byte-array leng
1c770 74 68 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a  th of arg 2 */..
1c780 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
1c790 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1c7a0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c7b0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1c7c0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1c7d0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1c7e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c7f0 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1c800 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22  bytes ?tailvar?"
1c810 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1c820 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1c830 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
1c840 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c850 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c860 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
1c870 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53   TCL_ERROR;.  zS
1c880 71 6c 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  ql = Tcl_GetByte
1c890 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1c8a0 76 5b 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a  v[2], &objlen);.
1c8b0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
1c8c0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
1c8d0 6f 62 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29  objv[3], &bytes)
1c8e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c8f0 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
1c900 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 28 64  ite3_prepare16(d
1c910 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
1c920 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
1c930 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
1c940 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1c950 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1c960 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
1c970 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1c980 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1c990 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c9a0 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35  }..  if( objc>=5
1c9b0 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69   ){.    if( zTai
1c9c0 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  l ){.      objle
1c9d0 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e  n = objlen - (in
1c9e0 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28  t)((u8 *)zTail-(
1c9f0 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20  u8 *)zSql);.    
1ca00 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a  }else{.      obj
1ca10 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  len = 0;.    }. 
1ca20 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e     pTail = Tcl_N
1ca30 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
1ca40 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c  u8 *)zTail, objl
1ca50 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  en);.    Tcl_Inc
1ca60 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
1ca70 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  ;.    Tcl_ObjSet
1ca80 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
1ca90 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20  v[4], 0, pTail, 
1caa0 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  0);.    Tcl_Decr
1cab0 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
1cac0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1cad0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1cae0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1caf0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1cb00 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1cb10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1cb20 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64    }.  Tcl_Append
1cb30 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1cb40 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20  Buf, 0);.#endif 
1cb50 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1cb60 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1cb70 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1cb80 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1cb90 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20 44 42  _prepare16_v2 DB
1cba0 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
1cbb0 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  var?.**.** Compi
1cbc0 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e  le up to <bytes>
1cbd0 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 73 75   bytes of the su
1cbe0 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e  pplied SQL strin
1cbf0 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a  g <sql> using.**
1cc00 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
1cc10 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d   <DB>. The param
1cc20 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69  eter <tailval> i
1cc30 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
1cc40 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62  global.** variab
1cc50 6c 65 20 74 68 61 74 20 69 73 20 73 65 74 20 74  le that is set t
1cc60 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72  o the unused por
1cc70 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69  tion of <sql> (i
1cc80 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d  f any). A.** STM
1cc90 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75  T handle is retu
1cca0 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1ccb0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1ccc0 49 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36  I test_prepare16
1ccd0 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  _v2(.  void * cl
1cce0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1ccf0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1cd00 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1cd10 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1cd20 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
1cd30 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1cd40 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1cd50 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53    const void *zS
1cd60 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ql;.  const void
1cd70 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54   *zTail = 0;.  T
1cd80 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20  cl_Obj *pTail = 
1cd90 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
1cda0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1cdb0 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a  char zBuf[50]; .
1cdc0 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1cdd0 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20 20  bytes;          
1cde0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74        /* The int
1cdf0 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20 61  eger specified a
1ce00 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74  s arg 3 */.  int
1ce10 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20   objlen;        
1ce20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79         /* The by
1ce30 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20  te-array length 
1ce40 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69  of arg 2 */..  i
1ce50 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62  f( objc!=5 && ob
1ce60 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
1ce70 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1ce80 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1ce90 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1cea0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1ceb0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1cec0 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
1ced0 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30  es ?tailvar?", 0
1cee0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1cef0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1cf00 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1cf10 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1cf20 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1cf30 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1cf40 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20  L_ERROR;.  zSql 
1cf50 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  = Tcl_GetByteArr
1cf60 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32  ayFromObj(objv[2
1cf70 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69  ], &objlen);.  i
1cf80 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1cf90 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1cfa0 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20  v[3], &bytes) ) 
1cfb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1cfc0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
1cfd0 33 5f 70 72 65 70 61 72 65 31 36 5f 76 32 28 64  3_prepare16_v2(d
1cfe0 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20  b, zSql, bytes, 
1cff0 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
1d000 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
1d010 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1d020 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
1d030 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
1d040 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1d050 28 20 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75  ( rc ){.    retu
1d060 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d070 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35  }..  if( objc>=5
1d080 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69   ){.    if( zTai
1d090 6c 20 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  l ){.      objle
1d0a0 6e 20 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e  n = objlen - (in
1d0b0 74 29 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28  t)((u8 *)zTail-(
1d0c0 75 38 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20  u8 *)zSql);.    
1d0d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a  }else{.      obj
1d0e0 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  len = 0;.    }. 
1d0f0 20 20 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e     pTail = Tcl_N
1d100 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28  ewByteArrayObj((
1d110 75 38 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c  u8 *)zTail, objl
1d120 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63  en);.    Tcl_Inc
1d130 72 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29  rRefCount(pTail)
1d140 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74  ;.    Tcl_ObjSet
1d150 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a  Var2(interp, obj
1d160 76 5b 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20  v[4], 0, pTail, 
1d170 30 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72  0);.    Tcl_Decr
1d180 52 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b  RefCount(pTail);
1d190 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d  .  }..  if( pStm
1d1a0 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  t ){.    if( sql
1d1b0 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1d1c0 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1d1d0 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65  Buf, pStmt) ) re
1d1e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d1f0 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64    }.  Tcl_Append
1d200 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1d210 42 75 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20  Buf, 0);.#endif 
1d220 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1d230 54 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e  TF16 */.  return
1d240 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d250 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d260 5f 6f 70 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f  _open filename ?
1d270 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f  options-list?.*/
1d280 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1d290 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6f  TE_TCLAPI test_o
1d2a0 70 65 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  pen(.  void * cl
1d2b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1d2c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1d2d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1d2e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1d2f0 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  v[].){.  const c
1d300 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
1d310 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1d320 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b   char zBuf[100];
1d330 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
1d340 26 26 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  && objc!=2 && ob
1d350 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=1 ){.    Tcl
1d360 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d370 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1d380 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1d390 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1d3a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1d3b0 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f  ]), " filename o
1d3c0 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29  ptions-list", 0)
1d3d0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1d3e0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a  _ERROR;.  }..  z
1d3f0 46 69 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e  Filename = objc>
1d400 31 20 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  1 ? Tcl_GetStrin
1d410 67 28 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a  g(objv[1]) : 0;.
1d420 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a    sqlite3_open(z
1d430 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a  Filename, &db);.
1d440 20 20 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33    .  if( sqlite3
1d450 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1d460 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1d470 20 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43   db) ) return TC
1d480 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41  L_ERROR;.  Tcl_A
1d490 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d4a0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1d4b0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1d4c0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1d4d0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46  qlite3_open_v2 F
1d4e0 49 4c 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46  ILENAME FLAGS VF
1d4f0 53 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  S.*/.static int 
1d500 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1d510 73 74 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f  st_open_v2(.  vo
1d520 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1d530 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1d540 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1d550 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1d560 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1d570 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1d580 65 6e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63  ename;.  const c
1d590 68 61 72 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74  har *zVfs;.  int
1d5a0 20 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71   flags = 0;.  sq
1d5b0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
1d5c0 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66   rc;.  char zBuf
1d5d0 5b 31 30 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46  [100];..  int nF
1d5e0 6c 61 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  lag;.  Tcl_Obj *
1d5f0 2a 61 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69  *apFlag;.  int i
1d600 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
1d610 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1d620 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1d630 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e   1, objv, "FILEN
1d640 41 4d 45 20 46 4c 41 47 53 20 56 46 53 22 29 3b  AME FLAGS VFS");
1d650 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d660 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69  ERROR;.  }.  zFi
1d670 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
1d680 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
1d690 0a 20 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65  .  zVfs = Tcl_Ge
1d6a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
1d6b0 3b 0a 20 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d  ;.  if( zVfs[0]=
1d6c0 3d 30 78 30 30 20 29 20 7a 56 66 73 20 3d 20 30  =0x00 ) zVfs = 0
1d6d0 3b 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69  ;..  rc = Tcl_Li
1d6e0 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
1d6f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
1d700 2c 20 26 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61  , &nFlag, &apFla
1d710 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43  g);.  if( rc!=TC
1d720 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
1d730 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
1d740 46 6c 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Flag; i++){.    
1d750 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 20 20 73  int iFlag;.    s
1d760 74 72 75 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b  truct OpenFlag {
1d770 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1d780 72 20 2a 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20  r *zFlag;.      
1d790 69 6e 74 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20  int flag;.    } 
1d7a0 61 46 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20  aFlag[] = {.    
1d7b0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1d7c0 5f 52 45 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49  _READONLY", SQLI
1d7d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
1d7e0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d7f0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1d800 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE", SQLITE_OPEN
1d810 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 0a 20 20  _READWRITE },.  
1d820 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1d830 45 4e 5f 43 52 45 41 54 45 22 2c 20 53 51 4c 49  EN_CREATE", SQLI
1d840 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d  TE_OPEN_CREATE }
1d850 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1d860 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
1d870 4c 4f 53 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  LOSE", SQLITE_OP
1d880 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1d890 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d8a0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
1d8b0 56 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  VE", SQLITE_OPEN
1d8c0 5f 45 58 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20  _EXCLUSIVE },.  
1d8d0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1d8e0 45 4e 5f 41 55 54 4f 50 52 4f 58 59 22 2c 20 53  EN_AUTOPROXY", S
1d8f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50  QLITE_OPEN_AUTOP
1d900 52 4f 58 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ROXY },.      { 
1d910 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  "SQLITE_OPEN_MAI
1d920 4e 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50  N_DB", SQLITE_OP
1d930 45 4e 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20  EN_MAIN_DB },.  
1d940 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1d950 45 4e 5f 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c  EN_TEMP_DB", SQL
1d960 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42  ITE_OPEN_TEMP_DB
1d970 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d980 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45  ITE_OPEN_TRANSIE
1d990 4e 54 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f  NT_DB", SQLITE_O
1d9a0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
1d9b0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1d9c0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
1d9d0 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  URNAL", SQLITE_O
1d9e0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
1d9f0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1da00 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
1da10 55 52 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f  URNAL", SQLITE_O
1da20 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c  PEN_TEMP_JOURNAL
1da30 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1da40 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
1da50 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1da60 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a  N_SUBJOURNAL },.
1da70 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1da80 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
1da90 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1daa0 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1dab0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1dac0 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
1dad0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e  ", SQLITE_OPEN_N
1dae0 4f 4d 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20  OMUTEX },.      
1daf0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46  { "SQLITE_OPEN_F
1db00 55 4c 4c 4d 55 54 45 58 22 2c 20 53 51 4c 49 54  ULLMUTEX", SQLIT
1db10 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
1db20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1db30 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
1db40 41 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50  ACHE", SQLITE_OP
1db50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d  EN_SHAREDCACHE }
1db60 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1db70 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
1db80 43 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  CHE", SQLITE_OPE
1db90 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
1dba0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1dbb0 45 5f 4f 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c  E_OPEN_WAL", SQL
1dbc0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a  ITE_OPEN_WAL },.
1dbd0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1dbe0 4f 50 45 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54  OPEN_URI", SQLIT
1dbf0 45 5f 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20  E_OPEN_URI },.  
1dc00 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
1dc10 20 7d 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c   };.    rc = Tcl
1dc20 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a  _GetIndexFromObj
1dc30 53 74 72 75 63 74 28 69 6e 74 65 72 70 2c 20 61  Struct(interp, a
1dc40 70 46 6c 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c  pFlag[i], aFlag,
1dc50 20 73 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d   sizeof(aFlag[0]
1dc60 29 2c 20 0a 20 20 20 20 20 20 20 20 22 66 6c 61  ), .        "fla
1dc70 67 22 2c 20 30 2c 20 26 69 46 6c 61 67 0a 20 20  g", 0, &iFlag.  
1dc80 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21    );.    if( rc!
1dc90 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e  =TCL_OK ) return
1dca0 20 72 63 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c   rc;.    flags |
1dcb0 3d 20 61 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66  = aFlag[iFlag].f
1dcc0 6c 61 67 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  lag;.  }..  rc =
1dcd0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
1dce0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c  (zFilename, &db,
1dcf0 20 66 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20   flags, zVfs);. 
1dd00 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1dd10 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1dd20 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29  nterp, zBuf, db)
1dd30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1dd40 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  ROR;.  Tcl_Appen
1dd50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1dd60 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
1dd70 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1dd80 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1dd90 65 33 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61  e3_open16 filena
1dda0 6d 65 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74  me options.*/.st
1ddb0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1ddc0 54 43 4c 41 50 49 20 74 65 73 74 5f 6f 70 65 6e  TCLAPI test_open
1ddd0 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
1dde0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1ddf0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1de00 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1de10 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1de20 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  [].){.#ifndef SQ
1de30 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
1de40 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46    const void *zF
1de50 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74  ilename;.  sqlit
1de60 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a  e3 *db;.  char z
1de70 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28  Buf[100];..  if(
1de80 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1de90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1dea0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1deb0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1dec0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1ded0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1dee0 76 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d  v[0]), " filenam
1def0 65 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c  e options-list",
1df00 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1df10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1df20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63    zFilename = Tc
1df30 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72  l_GetByteArrayFr
1df40 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30  omObj(objv[1], 0
1df50 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  );.  sqlite3_ope
1df60 6e 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  n16(zFilename, &
1df70 64 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71  db);.  .  if( sq
1df80 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1df90 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1dfa0 7a 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75  zBuf, db) ) retu
1dfb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dfc0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1dfd0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1dfe0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1dff0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
1e000 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  /.  return TCL_O
1e010 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1e020 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c  e: sqlite3_compl
1e030 65 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74  ete16 <UTF-16 st
1e040 72 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ring>.**.** Retu
1e050 72 6e 20 31 20 69 66 20 74 68 65 20 73 75 70 70  rn 1 if the supp
1e060 6c 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73  lied argument is
1e070 20 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20   a complete SQL 
1e080 73 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65  statement, or ze
1e090 72 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e  ro.** otherwise.
1e0a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1e0b0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1e0c0 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20  t_complete16(.  
1e0d0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1e0e0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1e0f0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1e100 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1e110 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1e120 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1e130 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
1e140 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
1e150 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1e160 29 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a  ).  char *zBuf;.
1e170 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1e180 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1e190 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1e1a0 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36  , objv, "<utf-16
1e1b0 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74   sql>");.    ret
1e1c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e1d0 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63 68   }..  zBuf = (ch
1e1e0 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41  ar*)Tcl_GetByteA
1e1f0 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
1e200 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  [1], 0);.  Tcl_S
1e210 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1e220 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1e230 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  j(sqlite3_comple
1e240 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65  te16(zBuf)));.#e
1e250 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1e260 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20  MIT_COMPLETE && 
1e270 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1e280 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1e290 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1e2a0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74  sage: sqlite3_st
1e2b0 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64  ep STMT.**.** Ad
1e2c0 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d  vance the statem
1e2d0 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ent to the next 
1e2e0 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
1e2f0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
1e300 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20 76 6f   test_step(.  vo
1e310 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1e320 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e330 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1e340 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1e350 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1e360 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1e370 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  tmt;.  int rc;..
1e380 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1e390 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1e3a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1e3b0 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1e3c0 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1e3d0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1e3e0 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1e3f0 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
1e400 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1e410 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1e420 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1e430 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1e440 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1e450 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1e460 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1e470 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
1e480 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21 3d 53  ..  /* if( rc!=S
1e490 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20 72 63  QLITE_DONE && rc
1e4a0 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 20 72  !=SQLITE_ROW ) r
1e4b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1e4c0 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52 65 73   */.  Tcl_SetRes
1e4d0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
1e4e0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
1e4f0 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
1e500 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61  n TCL_OK;.}..sta
1e510 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1e520 43 4c 41 50 49 20 74 65 73 74 5f 73 71 6c 28 0a  CLAPI test_sql(.
1e530 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1e540 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1e550 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1e560 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1e570 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1e580 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1e590 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
1e5a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1e5b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1e5c0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1e5d0 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
1e5e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e5f0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1e600 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1e610 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1e620 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1e630 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e640 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52  RROR;.  Tcl_SetR
1e650 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1e660 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 73 71  har *)sqlite3_sq
1e670 6c 28 70 53 74 6d 74 29 2c 20 54 43 4c 5f 56 4f  l(pStmt), TCL_VO
1e680 4c 41 54 49 4c 45 29 3b 0a 20 20 72 65 74 75 72  LATILE);.  retur
1e690 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74  n TCL_OK;.}.stat
1e6a0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1e6b0 4c 41 50 49 20 74 65 73 74 5f 65 78 5f 73 71 6c  LAPI test_ex_sql
1e6c0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1e6d0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1e6e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e6f0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1e700 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1e710 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1e720 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61  mt *pStmt;.  cha
1e730 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  r *z;..  if( obj
1e740 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1e750 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1e760 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1e770 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
1e780 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1e790 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1e7a0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1e7b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1e7c0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1e7d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1e7e0 52 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  R;.  z = sqlite3
1e7f0 5f 65 78 70 61 6e 64 65 64 5f 73 71 6c 28 70 53  _expanded_sql(pS
1e800 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  tmt);.  Tcl_SetR
1e810 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
1e820 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a   TCL_VOLATILE);.
1e830 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1e840 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1e850 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1e860 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1e870 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d 54 20 0a 2a  mn_count STMT .*
1e880 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
1e890 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
1e8a0 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
1e8b0 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20  e sql statement 
1e8c0 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  STMT..*/.static 
1e8d0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
1e8e0 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f  I test_column_co
1e8f0 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  unt(.  void * cl
1e900 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1e910 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1e920 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1e930 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1e940 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1e950 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1e960 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1e970 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1e980 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1e990 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1e9a0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1e9b0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1e9c0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1e9d0 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1e9e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e9f0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1ea00 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1ea10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1ea20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1ea30 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1ea40 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
1ea50 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1ea60 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1ea70 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c  tObj(sqlite3_col
1ea80 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
1ea90 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1eaa0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1eab0 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1eac0 75 6d 6e 5f 74 79 70 65 20 53 54 4d 54 20 63 6f  umn_type STMT co
1ead0 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
1eae0 6e 20 74 68 65 20 74 79 70 65 20 6f 66 20 74 68  n the type of th
1eaf0 65 20 64 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e  e data in column
1eb00 20 27 63 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65   'column' of the
1eb10 20 63 75 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f   current row..*/
1eb20 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1eb30 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63  TE_TCLAPI test_c
1eb40 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f  olumn_type(.  vo
1eb50 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1eb60 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1eb70 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1eb80 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1eb90 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1eba0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1ebb0 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1ebc0 20 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28    int tp;..  if(
1ebd0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1ebe0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1ebf0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1ec00 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1ec10 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1ec20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1ec30 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1ec40 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1ec50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ec60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1ec70 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1ec80 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1ec90 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1eca0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1ecb0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1ecc0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1ecd0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1ece0 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1ecf0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20  CL_ERROR;..  tp 
1ed00 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1ed10 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c  _type(pStmt, col
1ed20 29 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70 20  );.  switch( tp 
1ed30 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1ed40 54 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20  TE_INTEGER: .   
1ed50 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1ed60 28 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45  (interp, "INTEGE
1ed70 52 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  R", TCL_STATIC);
1ed80 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1ed90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
1eda0 55 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  ULL:.      Tcl_S
1edb0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1edc0 20 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41   "NULL", TCL_STA
1edd0 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1ede0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
1edf0 49 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20  ITE_FLOAT:.     
1ee00 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1ee10 6e 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20  nterp, "FLOAT", 
1ee20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20  TCL_STATIC); .  
1ee30 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1ee40 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
1ee50 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
1ee60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45  sult(interp, "TE
1ee70 58 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  XT", TCL_STATIC)
1ee80 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ; .      break;.
1ee90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1eea0 42 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f  BLOB:.      Tcl_
1eeb0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1eec0 2c 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54  , "BLOB", TCL_ST
1eed0 41 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72  ATIC); .      br
1eee0 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
1eef0 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  :.      assert(0
1ef00 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1ef10 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1ef20 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1ef30 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54  _column_int64 ST
1ef40 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1ef50 52 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20  Return the data 
1ef60 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d  in column 'colum
1ef70 6e 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  n' of the curren
1ef80 74 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e  t row cast as an
1ef90 0a 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74  .** wide (64-bit
1efa0 29 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  ) integer..*/.st
1efb0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1efc0 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 75  TCLAPI test_colu
1efd0 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  mn_int64(.  void
1efe0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1eff0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f000 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1f010 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1f020 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1f030 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1f040 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1f050 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28  i64 iVal;..  if(
1f060 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1f070 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1f080 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1f090 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1f0a0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1f0b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1f0c0 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1f0d0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1f0e0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f0f0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1f100 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1f110 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1f120 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1f130 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1f140 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1f150 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1f160 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1f170 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1f180 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61  CL_ERROR;..  iVa
1f190 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1f1a0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
1f1b0 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
1f1c0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1f1d0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
1f1e0 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(iVal));.  ret
1f1f0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f200 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1f210 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  te3_column_blob 
1f220 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
1f230 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1f240 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c  _TCLAPI test_col
1f250 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64  umn_blob(.  void
1f260 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1f270 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1f280 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1f290 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1f2a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1f2b0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1f2c0 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 0a 20  t;.  int col;.. 
1f2d0 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f 6e 73   int len;.  cons
1f2e0 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b 0a 0a  t void *pBlob;..
1f2f0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
1f300 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1f310 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1f320 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1f330 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1f340 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1f350 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54  g(objv[0]), " ST
1f360 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a  MT column", 0);.
1f370 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1f380 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1f390 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1f3a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1f3b0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1f3c0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1f3d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1f3e0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1f3f0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1f400 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74  [2], &col) ) ret
1f410 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1f420 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65 33 5f    len = sqlite3_
1f430 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
1f440 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42 6c 6f  mt, col);.  pBlo
1f450 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
1f460 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 63  mn_blob(pStmt, c
1f470 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ol);.  Tcl_SetOb
1f480 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1f490 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79  Tcl_NewByteArray
1f4a0 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e 29 29  Obj(pBlob, len))
1f4b0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1f4c0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1f4d0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1f4e0 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20 63 6f  n_double STMT co
1f4f0 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lumn.**.** Retur
1f500 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  n the data in co
1f510 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
1f520 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
1f530 20 63 61 73 74 20 61 73 20 61 20 64 6f 75 62 6c   cast as a doubl
1f540 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1f550 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1f560 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c  est_column_doubl
1f570 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  e(.  void * clie
1f580 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1f590 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1f5a0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1f5b0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1f5c0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
1f5d0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
1f5e0 74 20 63 6f 6c 3b 0a 20 20 64 6f 75 62 6c 65 20  t col;.  double 
1f5f0 72 56 61 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  rVal;..  if( obj
1f600 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1f610 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1f620 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1f630 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1f640 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1f650 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1f660 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  ), " STMT column
1f670 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1f680 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f690 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
1f6a0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
1f6b0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1f6c0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
1f6d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f6e0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
1f6f0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1f700 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c  p, objv[2], &col
1f710 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f720 52 52 4f 52 3b 0a 0a 20 20 72 56 61 6c 20 3d 20  RROR;..  rVal = 
1f730 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1f740 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 63 6f 6c  ouble(pStmt, col
1f750 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
1f760 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1f770 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62 6a 28 72  l_NewDoubleObj(r
1f780 56 61 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  Val));.  return 
1f790 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1f7a0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1f7b0 64 61 74 61 5f 63 6f 75 6e 74 20 53 54 4d 54 20  data_count STMT 
1f7c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1f7d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
1f7e0 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62 79 20  mns returned by 
1f7f0 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  the sql statemen
1f800 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69  t STMT..*/.stati
1f810 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
1f820 41 50 49 20 74 65 73 74 5f 64 61 74 61 5f 63 6f  API test_data_co
1f830 75 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  unt(.  void * cl
1f840 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1f850 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1f860 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1f870 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1f880 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1f890 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1f8a0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1f8b0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1f8c0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1f8d0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1f8e0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1f8f0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1f900 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1f910 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1f920 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1f930 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1f940 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1f950 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1f960 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1f970 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1f980 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63  TCL_ERROR;..  Tc
1f990 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1f9a0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1f9b0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 64 61 74  tObj(sqlite3_dat
1f9c0 61 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29  a_count(pStmt)))
1f9d0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1f9e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1f9f0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1fa00 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
1fa10 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1fa20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1fa30 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
1fa40 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1fa50 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1fa60 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
1fa70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1fa80 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1fa90 74 5f 73 74 6d 74 5f 75 74 66 38 28 0a 20 20 76  t_stmt_utf8(.  v
1faa0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1fab0 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ,        /* Poin
1fac0 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
1fad0 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
1fae0 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20 20 54 63 6c   invoke */.  Tcl
1faf0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1fb00 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1fb10 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1fb20 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1fb30 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1fb40 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 63 6f 6e 73   int col;.  cons
1fb50 74 20 63 68 61 72 20 2a 28 2a 78 46 75 6e 63 29  t char *(*xFunc)
1fb60 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
1fb70 69 6e 74 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68  int);.  const ch
1fb80 61 72 20 2a 7a 52 65 74 3b 0a 0a 20 20 78 46 75  ar *zRet;..  xFu
1fb90 6e 63 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  nc = (const char
1fba0 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74   *(*)(sqlite3_st
1fbb0 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74  mt*, int))client
1fbc0 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Data;.  if( objc
1fbd0 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1fbe0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1fbf0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1fc00 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1fc10 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1fc20 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1fc30 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1fc40 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1fc50 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1fc60 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1fc70 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1fc80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1fc90 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1fca0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1fcb0 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1fcc0 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1fcd0 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1fce0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1fcf0 52 4f 52 3b 0a 20 20 7a 52 65 74 20 3d 20 78 46  ROR;.  zRet = xF
1fd00 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  unc(pStmt, col);
1fd10 0a 20 20 69 66 28 20 7a 52 65 74 20 29 7b 0a 20  .  if( zRet ){. 
1fd20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
1fd30 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1fd40 29 7a 52 65 74 2c 20 30 29 3b 0a 20 20 7d 0a 20  )zRet, 0);.  }. 
1fd50 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1fd60 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  }..static int SQ
1fd70 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1fd80 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
1fd90 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1fda0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1fdb0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1fdc0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1fdd0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1fde0 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
1fdf0 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
1fe00 44 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  D.  int rc;.  if
1fe10 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
1fe20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1fe30 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1fe40 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75  v, "");.    retu
1fe50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1fe60 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1fe70 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28  _global_recover(
1fe80 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
1fe90 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
1fea0 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
1feb0 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
1fec0 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1fed0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1fee0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1fef0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d  _column_text STM
1ff00 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1ff10 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1ff20 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54  lumn_decltype ST
1ff30 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1ff40 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1ff50 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20  olumn_name STMT 
1ff60 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
1ff70 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1ff80 50 49 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  PI test_stmt_utf
1ff90 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  16(.  void * cli
1ffa0 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20  entData,     /* 
1ffb0 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
1ffc0 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
1ffd0 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a  o be invoked */.
1ffe0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1fff0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
20000 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
20010 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
20020 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20030 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33  _UTF16.  sqlite3
20040 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
20050 69 6e 74 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f  int col;.  Tcl_O
20060 62 6a 20 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73  bj *pRet;.  cons
20070 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b  t void *zName16;
20080 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28  .  const void *(
20090 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
200a0 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20  stmt*, int);..  
200b0 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76  xFunc = (const v
200c0 6f 69 64 20 2a 28 2a 29 28 73 71 6c 69 74 65 33  oid *(*)(sqlite3
200d0 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
200e0 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
200f0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
20100 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
20110 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
20120 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
20130 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
20140 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
20150 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
20160 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
20170 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
20180 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
20190 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
201a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
201b0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
201c0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
201d0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
201e0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
201f0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
20200 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
20210 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65  _ERROR;..  zName
20220 31 36 20 3d 20 78 46 75 6e 63 28 70 53 74 6d 74  16 = xFunc(pStmt
20230 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e  , col);.  if( zN
20240 61 6d 65 31 36 20 29 7b 0a 20 20 20 20 69 6e 74  ame16 ){.    int
20250 20 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   n;.    const ch
20260 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b  ar *z = zName16;
20270 0a 20 20 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b  .    for(n=0; z[
20280 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b  n] || z[n+1]; n+
20290 3d 32 29 7b 7d 0a 20 20 20 20 70 52 65 74 20 3d  =2){}.    pRet =
202a0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
202b0 79 4f 62 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b  yObj(zName16, n+
202c0 32 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  2);.    Tcl_SetO
202d0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
202e0 20 70 52 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64   pRet);.  }.#end
202f0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
20300 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65  T_UTF16 */..  re
20310 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
20320 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
20330 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20  ite3_column_int 
20340 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a  STMT column.**.*
20350 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
20360 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54  _column_bytes ST
20370 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
20380 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
20390 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 53 54  olumn_bytes16 ST
203a0 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a  MT column.**.*/.
203b0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
203c0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74  E_TCLAPI test_st
203d0 6d 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  mt_int(.  void *
203e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
203f0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51  /* Pointer to SQ
20400 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f  Lite API functio
20410 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
20420 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
20430 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
20440 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
20450 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
20460 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20470 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
20480 3b 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  ;.  int (*xFunc)
20490 28 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20  (sqlite3_stmt*, 
204a0 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d  int);..  xFunc =
204b0 20 28 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65   (int (*)(sqlite
204c0 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c  3_stmt*, int))cl
204d0 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20  ientData;.  if( 
204e0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
204f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
20500 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
20510 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
20520 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
20530 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
20540 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
20550 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
20560 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20570 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
20580 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
20590 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
205a0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
205b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
205c0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
205d0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
205e0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
205f0 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
20600 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f  L_ERROR;..  Tcl_
20610 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
20620 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
20630 62 6a 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20  bj(xFunc(pStmt, 
20640 63 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  col)));.  return
20650 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
20660 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
20670 5f 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20  _set_magic  DB  
20680 4d 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a  MAGIC-NUMBER.**.
20690 2a 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d  ** Set the db->m
206a0 61 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69  agic value.  Thi
206b0 73 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73  s is used to tes
206c0 74 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79  t error recovery
206d0 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69   logic..*/.stati
206e0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
206f0 41 50 49 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d  API sqlite_set_m
20700 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20 63  agic(.  void * c
20710 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
20720 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
20730 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
20740 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
20750 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
20760 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
20770 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
20780 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
20790 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
207a0 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
207b0 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42 20  ,.         " DB 
207c0 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20 20  MAGIC", 0);.    
207d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
207e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
207f0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
20800 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
20810 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
20820 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  R;.  if( strcmp(
20830 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
20840 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30  _MAGIC_OPEN")==0
20850 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
20860 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
20870 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
20880 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
20890 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
208a0 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a  _CLOSED")==0 ){.
208b0 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
208c0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
208d0 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
208e0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
208f0 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42   "SQLITE_MAGIC_B
20900 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  USY")==0 ){.    
20910 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
20920 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
20930 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
20940 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
20950 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22 29  TE_MAGIC_ERROR")
20960 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
20970 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
20980 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  GIC_ERROR;.  }el
20990 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  se if( Tcl_GetIn
209a0 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
209b0 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d 61  ], (int*)&db->ma
209c0 67 69 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gic) ){.    retu
209d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
209e0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
209f0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
20a00 65 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  e:  sqlite3_inte
20a10 72 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a  rrupt  DB .**.**
20a20 20 54 72 69 67 67 65 72 20 61 6e 20 69 6e 74 65   Trigger an inte
20a30 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73  rrupt on DB.*/.s
20a40 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
20a50 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69 6e 74  _TCLAPI test_int
20a60 65 72 72 75 70 74 28 0a 20 20 76 6f 69 64 20 2a  errupt(.  void *
20a70 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
20a80 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
20a90 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
20aa0 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
20ab0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
20ac0 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
20ad0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
20ae0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
20af0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
20b00 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
20b10 30 5d 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0], " DB", 0);. 
20b20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
20b30 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
20b40 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
20b50 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
20b60 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
20b70 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f  RROR;.  sqlite3_
20b80 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b 0a 20  interrupt(db);. 
20b90 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
20ba0 7d 0a 0a 73 74 61 74 69 63 20 75 38 20 2a 73 71  }..static u8 *sq
20bb0 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65  lite3_stack_base
20bc0 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  line = 0;../*.**
20bd0 20 46 69 6c 6c 20 74 68 65 20 73 74 61 63 6b 20   Fill the stack 
20be0 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20 62 69 74  with a known bit
20bf0 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74 61 74  pattern..*/.stat
20c00 69 63 20 76 6f 69 64 20 70 72 65 70 53 74 61 63  ic void prepStac
20c10 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74 20 69  k(void){.  int i
20c20 3b 0a 20 20 75 33 32 20 62 69 67 42 75 66 5b 36  ;.  u32 bigBuf[6
20c30 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28 69 3d 30  5536];.  for(i=0
20c40 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69 67 42 75  ; i<sizeof(bigBu
20c50 66 29 2f 73 69 7a 65 6f 66 28 62 69 67 42 75 66  f)/sizeof(bigBuf
20c60 5b 30 5d 29 3b 20 69 2b 2b 29 20 62 69 67 42 75  [0]); i++) bigBu
20c70 66 5b 69 5d 20 3d 20 30 78 64 65 61 64 62 65 65  f[i] = 0xdeadbee
20c80 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 61  f;.  sqlite3_sta
20c90 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20 28 75  ck_baseline = (u
20ca0 38 2a 29 26 62 69 67 42 75 66 5b 36 35 35 33 36  8*)&bigBuf[65536
20cb0 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 20  ];.}../*.** Get 
20cc0 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 63  the current stac
20cd0 6b 20 64 65 70 74 68 2e 20 20 55 73 65 64 20 66  k depth.  Used f
20ce0 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c  or debugging onl
20cf0 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69 74 65  y..*/.u64 sqlite
20d00 33 53 74 61 63 6b 44 65 70 74 68 28 76 6f 69 64  3StackDepth(void
20d10 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20 72 65 74  ){.  u8 x;.  ret
20d20 75 72 6e 20 28 75 36 34 29 28 73 71 6c 69 74 65  urn (u64)(sqlite
20d30 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65  3_stack_baseline
20d40 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   - &x);.}../*.**
20d50 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
20d60 5f 73 74 61 63 6b 5f 75 73 65 64 20 44 42 20 53  _stack_used DB S
20d70 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  QL.**.** Try to 
20d80 6d 65 61 73 75 72 65 20 74 68 65 20 61 6d 6f 75  measure the amou
20d90 6e 74 20 6f 66 20 73 74 61 63 6b 20 73 70 61 63  nt of stack spac
20da0 65 20 75 73 65 64 20 62 79 20 61 20 63 61 6c 6c  e used by a call
20db0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78 65 63   to sqlite3_exec
20dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
20dd0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
20de0 74 5f 73 74 61 63 6b 5f 75 73 65 64 28 0a 20 20  t_stack_used(.  
20df0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20e00 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20e10 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
20e20 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
20e30 67 76 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  gv.){.  sqlite3 
20e40 2a 64 62 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *db;.  int i;.  
20e50 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
20e60 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
20e70 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
20e80 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
20e90 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
20ea0 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
20eb0 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20 20 20 72   SQL", 0);.    r
20ec0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20ed0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
20ee0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
20ef0 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
20f00 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
20f10 3b 0a 20 20 70 72 65 70 53 74 61 63 6b 28 29 3b  ;.  prepStack();
20f20 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
20f30 5f 65 78 65 63 28 64 62 2c 20 61 72 67 76 5b 32  _exec(db, argv[2
20f40 5d 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 66  ], 0, 0, 0);.  f
20f50 6f 72 28 69 3d 36 35 35 33 35 3b 20 69 3e 3d 30  or(i=65535; i>=0
20f60 20 26 26 20 28 28 75 33 32 2a 29 73 71 6c 69 74   && ((u32*)sqlit
20f70 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e  e3_stack_baselin
20f80 65 29 5b 2d 69 5d 3d 3d 30 78 64 65 61 64 62 65  e)[-i]==0xdeadbe
20f90 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20 20 54 63 6c  ef; i--){}.  Tcl
20fa0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
20fb0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
20fc0 4f 62 6a 28 69 2a 34 29 29 3b 0a 20 20 72 65 74  Obj(i*4));.  ret
20fd0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
20fe0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
20ff0 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69  te_delete_functi
21000 6f 6e 20 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e  on DB function-n
21010 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  ame.**.** Delete
21020 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   the user functi
21030 6f 6e 20 27 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d  on 'function-nam
21040 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  e' from database
21050 20 68 61 6e 64 6c 65 20 44 42 2e 20 49 74 0a 2a   handle DB. It.*
21060 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74 68 61  * is assumed tha
21070 74 20 74 68 65 20 75 73 65 72 20 66 75 6e 63 74  t the user funct
21080 69 6f 6e 20 77 61 73 20 63 72 65 61 74 65 64 20  ion was created 
21090 61 73 20 55 54 46 38 2c 20 61 6e 79 20 6e 75 6d  as UTF8, any num
210a0 62 65 72 20 6f 66 0a 2a 2a 20 61 72 67 75 6d 65  ber of.** argume
210b0 6e 74 73 20 28 74 68 65 20 77 61 79 20 74 68 65  nts (the way the
210c0 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64   TCL interface d
210d0 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74  oes it)..*/.stat
210e0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
210f0 4c 41 50 49 20 64 65 6c 65 74 65 5f 66 75 6e 63  LAPI delete_func
21100 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63  tion(.  void * c
21110 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
21120 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
21130 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
21140 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
21150 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
21160 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67  3 *db;.  if( arg
21170 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
21180 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
21190 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
211a0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
211b0 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20  ", argv[0], .   
211c0 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74 69       " DB functi
211d0 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20 20  on-name", 0);.  
211e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
211f0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
21200 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
21210 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
21220 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
21230 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
21240 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
21250 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
21260 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
21270 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 0, 0, 0, 0);. 
21280 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
21290 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
212a0 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
212b0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
212c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
212d0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
212e0 6c 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c  lite_delete_coll
212f0 61 74 69 6f 6e 20 44 42 20 63 6f 6c 6c 61 74 69  ation DB collati
21300 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65  on-name.**.** De
21310 6c 65 74 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  lete the collati
21320 6f 6e 20 73 65 71 75 65 6e 63 65 20 27 63 6f 6c  on sequence 'col
21330 6c 61 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f  lation-name' fro
21340 6d 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  m database handl
21350 65 20 0a 2a 2a 20 44 42 2e 20 49 74 20 69 73 20  e .** DB. It is 
21360 61 73 73 75 6d 65 64 20 74 68 61 74 20 74 68 65  assumed that the
21370 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
21380 6e 63 65 20 77 61 73 20 63 72 65 61 74 65 64 20  nce was created 
21390 61 73 20 55 54 46 38 20 28 74 68 65 20 0a 2a 2a  as UTF8 (the .**
213a0 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74   way the TCL int
213b0 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e  erface does it).
213c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
213d0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 65 6c  QLITE_TCLAPI del
213e0 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ete_collation(. 
213f0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
21400 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
21410 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
21420 61 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61  argc,.  char **a
21430 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  rgv.){.  int rc;
21440 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
21450 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
21460 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
21470 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
21480 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
21490 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
214a0 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20  [0], .        " 
214b0 44 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65  DB function-name
214c0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
214d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
214e0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
214f0 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
21500 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
21510 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
21520 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
21530 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
21540 2c 20 61 72 67 76 5b 32 5d 2c 20 53 51 4c 49 54  , argv[2], SQLIT
21550 45 5f 55 54 46 38 2c 20 30 2c 20 30 29 3b 0a 20  E_UTF8, 0, 0);. 
21560 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
21570 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
21580 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
21590 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
215a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
215b0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
215c0 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
215d0 6d 6d 69 74 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  mmit DB.**.** Re
215e0 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
215f0 20 64 61 74 61 62 61 73 65 20 44 42 20 69 73 20   database DB is 
21600 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 75 74  currently in aut
21610 6f 2d 63 6f 6d 6d 69 74 20 6d 6f 64 65 2e 0a 2a  o-commit mode..*
21620 2a 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69  * Return false i
21630 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  f not..*/.static
21640 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
21650 50 49 20 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  PI get_autocommi
21660 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  t(.  void * clie
21670 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
21680 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
21690 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
216a0 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 68 61   **argv.){.  cha
216b0 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 73 71  r zBuf[30];.  sq
216c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
216d0 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
216e0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
216f0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
21700 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
21710 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
21720 0a 20 20 20 20 20 20 20 20 22 20 44 42 22 2c 20  .        " DB", 
21730 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
21740 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
21750 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
21760 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
21770 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
21780 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
21790 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
217a0 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
217b0 2c 20 22 25 64 22 2c 20 73 71 6c 69 74 65 33 5f  , "%d", sqlite3_
217c0 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 64  get_autocommit(d
217d0 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  b));.  Tcl_Appen
217e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
217f0 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75  zBuf, 0);.  retu
21800 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
21810 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
21820 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 20  e3_busy_timeout 
21830 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20 53 65 74 20  DB MS.**.** Set 
21840 74 68 65 20 62 75 73 79 20 74 69 6d 65 6f 75 74  the busy timeout
21850 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72 65 20  .  This is more 
21860 65 61 73 69 6c 79 20 64 6f 6e 65 20 75 73 69 6e  easily done usin
21870 67 20 74 68 65 20 74 69 6d 65 6f 75 74 0a 2a 2a  g the timeout.**
21880 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 54   method of the T
21890 43 4c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 42  CL interface.  B
218a0 75 74 20 77 65 20 6e 65 65 64 20 61 20 77 61 79  ut we need a way
218b0 20 74 6f 20 74 65 73 74 20 74 68 65 20 63 61 73   to test the cas
218c0 65 0a 2a 2a 20 77 68 65 72 65 20 69 74 20 72 65  e.** where it re
218d0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4d 49 53  turns SQLITE_MIS
218e0 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  USE..*/.static i
218f0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
21900 20 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f   test_busy_timeo
21910 75 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ut(.  void * cli
21920 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
21930 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
21940 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61   int argc,.  cha
21950 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e  r **argv.){.  in
21960 74 20 72 63 2c 20 6d 73 3b 0a 20 20 73 71 6c 69  t rc, ms;.  sqli
21970 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
21980 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
21990 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
219a0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
219b0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
219c0 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
219d0 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
219e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
219f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
21a00 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
21a10 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
21a20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
21a30 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
21a40 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
21a50 2c 20 61 72 67 76 5b 32 5d 2c 20 26 6d 73 29 20  , argv[2], &ms) 
21a60 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
21a70 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
21a80 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
21a90 64 62 2c 20 6d 73 29 3b 0a 20 20 54 63 6c 5f 41  db, ms);.  Tcl_A
21aa0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
21ab0 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
21ac0 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
21ad0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
21ae0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 74 63  /*.** Usage:  tc
21af0 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 20  l_variable_type 
21b00 56 41 52 49 41 42 4c 45 4e 41 4d 45 0a 2a 2a 0a  VARIABLENAME.**.
21b10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
21b20 6d 65 20 6f 66 20 74 68 65 20 69 6e 74 65 72 6e  me of the intern
21b30 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
21b40 6e 20 66 6f 72 20 74 68 65 0a 2a 2a 20 76 61 6c  n for the.** val
21b50 75 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  ue of the given 
21b60 76 61 72 69 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  variable..*/.sta
21b70 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
21b80 43 4c 41 50 49 20 74 63 6c 5f 76 61 72 69 61 62  CLAPI tcl_variab
21b90 6c 65 5f 74 79 70 65 28 0a 20 20 76 6f 69 64 20  le_type(.  void 
21ba0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
21bb0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
21bc0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
21bd0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
21be0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c   objv[].){.  Tcl
21bf0 5f 4f 62 6a 20 2a 70 56 61 72 3b 0a 20 20 69 66  _Obj *pVar;.  if
21c00 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
21c10 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
21c20 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
21c30 76 2c 20 22 56 41 52 49 41 42 4c 45 22 29 3b 0a  v, "VARIABLE");.
21c40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
21c50 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 56 61 72  RROR;.  }.  pVar
21c60 20 3d 20 54 63 6c 5f 47 65 74 56 61 72 32 45 78   = Tcl_GetVar2Ex
21c70 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
21c80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
21c90 20 30 2c 20 54 43 4c 5f 4c 45 41 56 45 5f 45 52   0, TCL_LEAVE_ER
21ca0 52 5f 4d 53 47 29 3b 0a 20 20 69 66 28 20 70 56  R_MSG);.  if( pV
21cb0 61 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54  ar==0 ) return T
21cc0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
21cd0 70 56 61 72 2d 3e 74 79 70 65 50 74 72 20 29 7b  pVar->typePtr ){
21ce0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
21cf0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
21d00 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 70  l_NewStringObj(p
21d10 56 61 72 2d 3e 74 79 70 65 50 74 72 2d 3e 6e 61  Var->typePtr->na
21d20 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  me, -1));.  }.  
21d30 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
21d40 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
21d50 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
21d60 6d 65 6d 6f 72 79 20 3f 4e 3f 0a 2a 2a 0a 2a 2a  memory ?N?.**.**
21d70 20 41 74 74 65 6d 70 74 20 74 6f 20 72 65 6c 65   Attempt to rele
21d80 61 73 65 20 6d 65 6d 6f 72 79 20 63 75 72 72 65  ase memory curre
21d90 6e 74 6c 79 20 68 65 6c 64 20 62 75 74 20 6e 6f  ntly held but no
21da0 74 20 61 63 74 75 61 6c 6c 79 20 72 65 71 75 69  t actually requi
21db0 72 65 64 2e 0a 2a 2a 20 54 68 65 20 69 6e 74 65  red..** The inte
21dc0 67 65 72 20 4e 20 69 73 20 74 68 65 20 6e 75 6d  ger N is the num
21dd0 62 65 72 20 6f 66 20 62 79 74 65 73 20 77 65 20  ber of bytes we 
21de0 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72 65  are trying to re
21df0 6c 65 61 73 65 2e 20 20 54 68 65 20 0a 2a 2a 20  lease.  The .** 
21e00 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
21e10 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  the amount of me
21e20 6d 6f 72 79 20 61 63 74 75 61 6c 6c 79 20 72 65  mory actually re
21e30 6c 65 61 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  leased..*/.stati
21e40 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
21e50 41 50 49 20 74 65 73 74 5f 72 65 6c 65 61 73 65  API test_release
21e60 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20  _memory(.  void 
21e70 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
21e80 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
21e90 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
21ea0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
21eb0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 20 64   objv[].){.#if d
21ec0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
21ed0 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
21ee0 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66 69  GEMENT) && !defi
21ef0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
21f00 44 49 53 4b 49 4f 29 0a 20 20 69 6e 74 20 4e 3b  DISKIO).  int N;
21f10 0a 20 20 69 6e 74 20 61 6d 74 3b 0a 20 20 69 66  .  int amt;.  if
21f20 28 20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a  ( objc!=1 && obj
21f30 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
21f40 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
21f50 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f  erp, 1, objv, "?
21f60 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  N?");.    return
21f70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
21f80 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b    if( objc==2 ){
21f90 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
21fa0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
21fb0 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20  p, objv[1], &N) 
21fc0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
21fd0 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OR;.  }else{.   
21fe0 20 4e 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20 61   N = -1;.  }.  a
21ff0 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 6c  mt = sqlite3_rel
22000 65 61 73 65 5f 6d 65 6d 6f 72 79 28 4e 29 3b 0a  ease_memory(N);.
22010 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
22020 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
22030 65 77 49 6e 74 4f 62 6a 28 61 6d 74 29 29 3b 0a  ewIntObj(amt));.
22040 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
22050 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
22060 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
22070 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  3_db_release_mem
22080 6f 72 79 20 44 42 0a 2a 2a 0a 2a 2a 20 41 74 74  ory DB.**.** Att
22090 65 6d 70 74 20 74 6f 20 72 65 6c 65 61 73 65 20  empt to release 
220a0 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e 74 6c 79  memory currently
220b0 20 68 65 6c 64 20 62 79 20 64 61 74 61 62 61 73   held by databas
220c0 65 20 44 42 2e 20 20 52 65 74 75 72 6e 20 74 68  e DB.  Return th
220d0 65 0a 2a 2a 20 72 65 73 75 6c 74 20 63 6f 64 65  e.** result code
220e0 20 28 77 68 69 63 68 20 69 6e 20 74 68 65 20 63   (which in the c
220f0 75 72 72 65 6e 74 20 69 6d 70 6c 65 6d 65 6e 74  urrent implement
22100 61 74 69 6f 6e 20 69 73 20 61 6c 77 61 79 73 20  ation is always 
22110 7a 65 72 6f 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  zero)..*/.static
22120 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
22130 50 49 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61  PI test_db_relea
22140 73 65 5f 6d 65 6d 6f 72 79 28 0a 20 20 76 6f 69  se_memory(.  voi
22150 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
22160 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
22170 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
22180 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
22190 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
221a0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
221b0 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63  t rc;.  if( objc
221c0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
221d0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
221e0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
221f0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
22200 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22210 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
22220 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
22230 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
22240 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
22250 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
22260 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65   sqlite3_db_rele
22270 61 73 65 5f 6d 65 6d 6f 72 79 28 64 62 29 3b 0a  ase_memory(db);.
22280 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
22290 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
222a0 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20  ewIntObj(rc));. 
222b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
222c0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
222d0 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68   sqlite3_db_cach
222e0 65 66 6c 75 73 68 20 44 42 0a 2a 2a 0a 2a 2a 20  eflush DB.**.** 
222f0 41 74 74 65 6d 70 74 20 74 6f 20 66 6c 75 73 68  Attempt to flush
22300 20 61 6e 79 20 64 69 72 74 79 20 70 61 67 65 73   any dirty pages
22310 20 74 6f 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61   to disk..*/.sta
22320 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
22330 43 4c 41 50 49 20 74 65 73 74 5f 64 62 5f 63 61  CLAPI test_db_ca
22340 63 68 65 66 6c 75 73 68 28 0a 20 20 76 6f 69 64  cheflush(.  void
22350 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
22360 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
22370 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
22380 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
22390 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
223a0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
223b0 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21   rc;.  if( objc!
223c0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
223d0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
223e0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
223f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
22400 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
22410 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
22420 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
22430 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
22440 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
22450 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
22460 73 71 6c 69 74 65 33 5f 64 62 5f 63 61 63 68 65  sqlite3_db_cache
22470 66 6c 75 73 68 28 64 62 29 3b 0a 20 20 69 66 28  flush(db);.  if(
22480 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53   rc ){.    Tcl_S
22490 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
224a0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
224b0 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f  ErrStr(rc), TCL_
224c0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74  STATIC);.    ret
224d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
224e0 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74 52   }..  Tcl_ResetR
224f0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
22500 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
22510 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
22520 20 73 71 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f   sqlite3_system_
22530 65 72 72 6e 6f 20 44 42 0a 2a 2a 0a 2a 2a 20 52  errno DB.**.** R
22540 65 74 75 72 6e 20 74 68 65 20 6c 6f 77 2d 6c 65  eturn the low-le
22550 76 65 6c 20 73 79 73 74 65 6d 20 65 72 72 6e 6f  vel system errno
22560 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69   value..*/.stati
22570 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
22580 41 50 49 20 74 65 73 74 5f 73 79 73 74 65 6d 5f  API test_system_
22590 65 72 72 6e 6f 28 0a 20 20 76 6f 69 64 20 2a 20  errno(.  void * 
225a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
225b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
225c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
225d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
225e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
225f0 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69 45  e3 *db;.  int iE
22600 72 72 6e 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63  rrno;.  if( objc
22610 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
22620 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
22630 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
22640 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
22650 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22660 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
22670 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
22680 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
22690 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
226a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 45 72 72  CL_ERROR;.  iErr
226b0 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 73 79 73  no = sqlite3_sys
226c0 74 65 6d 5f 65 72 72 6e 6f 28 64 62 29 3b 0a 20  tem_errno(db);. 
226d0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
226e0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
226f0 77 49 6e 74 4f 62 6a 28 69 45 72 72 6e 6f 29 29  wIntObj(iErrno))
22700 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
22710 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
22720 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 66  e:  sqlite3_db_f
22730 69 6c 65 6e 61 6d 65 20 44 42 20 44 42 4e 41 4d  ilename DB DBNAM
22740 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
22750 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c  he name of a fil
22760 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  e associated wit
22770 68 20 61 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  h a database..*/
22780 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
22790 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64  TE_TCLAPI test_d
227a0 62 5f 66 69 6c 65 6e 61 6d 65 28 0a 20 20 76 6f  b_filename(.  vo
227b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
227c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
227d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
227e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
227f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
22800 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
22810 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
22820 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  me;.  if( objc!=
22830 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
22840 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
22850 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
22860 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  BNAME");.    ret
22870 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22880 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
22890 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
228a0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
228b0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
228c0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
228d0 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
228e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
228f0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
22900 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71  esult(interp, sq
22910 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d  lite3_db_filenam
22920 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 2c 20  e(db, zDbName), 
22930 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 72 65 74  (void*)0);.  ret
22940 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
22950 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
22960 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
22970 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a   DB DBNAME.**.**
22980 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 20 69   Return 1 or 0 i
22990 66 20 44 42 4e 41 4d 45 20 69 73 20 72 65 61 64  f DBNAME is read
229a0 6f 6e 6c 79 20 6f 72 20 6e 6f 74 2e 20 20 52 65  only or not.  Re
229b0 74 75 72 6e 20 2d 31 20 69 66 20 44 42 4e 41 4d  turn -1 if DBNAM
229c0 45 20 64 6f 65 73 0a 2a 2a 20 6e 6f 74 20 65 78  E does.** not ex
229d0 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ist..*/.static i
229e0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
229f0 20 74 65 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c   test_db_readonl
22a00 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
22a10 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
22a20 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
22a30 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
22a40 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
22a50 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
22a60 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
22a70 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28   *zDbName;.  if(
22a80 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
22a90 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
22aa0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
22ab0 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a  , "DB DBNAME");.
22ac0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
22ad0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
22ae0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
22af0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
22b00 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
22b10 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
22b20 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20  RROR;.  zDbName 
22b30 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
22b40 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  objv[2]);.  Tcl_
22b50 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
22b60 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
22b70 62 6a 28 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  bj(sqlite3_db_re
22b80 61 64 6f 6e 6c 79 28 64 62 2c 20 7a 44 62 4e 61  adonly(db, zDbNa
22b90 6d 65 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  me)));.  return 
22ba0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
22bb0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
22bc0 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74  _soft_heap_limit
22bd0 20 3f 4e 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79   ?N?.**.** Query
22be0 20 6f 72 20 73 65 74 20 74 68 65 20 73 6f 66 74   or set the soft
22bf0 20 68 65 61 70 20 6c 69 6d 69 74 20 66 6f 72 20   heap limit for 
22c00 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72 65  the current thre
22c10 61 64 2e 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69  ad.  The.** limi
22c20 74 20 69 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65  t is only change
22c30 64 20 69 66 20 74 68 65 20 4e 20 69 73 20 70 72  d if the N is pr
22c40 65 73 65 6e 74 2e 20 20 54 68 65 20 70 72 65 76  esent.  The prev
22c50 69 6f 75 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73  ious limit.** is
22c60 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
22c70 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
22c80 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6f 66 74  TCLAPI test_soft
22c90 5f 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76  _heap_limit(.  v
22ca0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
22cb0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
22cc0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
22cd0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
22ce0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
22cf0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61   sqlite3_int64 a
22d00 6d 74 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e  mt;.  Tcl_WideIn
22d10 74 20 4e 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20  t N = -1;.  if( 
22d20 6f 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21  objc!=1 && objc!
22d30 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
22d40 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
22d50 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f  p, 1, objv, "?N?
22d60 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
22d70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22d80 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
22d90 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69     if( Tcl_GetWi
22da0 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
22db0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e  erp, objv[1], &N
22dc0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
22dd0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20  RROR;.  }.  amt 
22de0 3d 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68  = sqlite3_soft_h
22df0 65 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a  eap_limit64(N);.
22e00 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
22e10 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
22e20 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 61 6d 74  ewWideIntObj(amt
22e30 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
22e40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
22e50 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 74  age:   sqlite3_t
22e60 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a 2a  hread_cleanup.**
22e70 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c  .** Call the sql
22e80 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
22e90 6e 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  nup API..*/.stat
22ea0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
22eb0 4c 41 50 49 20 74 65 73 74 5f 74 68 72 65 61 64  LAPI test_thread
22ec0 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76 6f 69 64  _cleanup(.  void
22ed0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
22ee0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
22ef0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
22f00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
22f10 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
22f20 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
22f30 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c  DEPRECATED.  sql
22f40 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
22f50 6e 75 70 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nup();.#endif.  
22f60 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
22f70 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
22f80 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
22f90 65 66 63 6f 75 6e 74 73 20 20 44 42 0a 2a 2a 0a  efcounts  DB.**.
22fa0 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74  ** Return a list
22fb0 20 6f 66 20 6e 75 6d 62 65 72 73 20 77 68 69 63   of numbers whic
22fc0 68 20 61 72 65 20 74 68 65 20 50 61 67 65 72 52  h are the PagerR
22fd0 65 66 63 6f 75 6e 74 20 66 6f 72 20 61 6c 6c 0a  efcount for all.
22fe0 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20 65 61 63  ** pagers on eac
22ff0 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  h database conne
23000 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
23010 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
23020 50 49 20 74 65 73 74 5f 70 61 67 65 72 5f 72 65  PI test_pager_re
23030 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f 69 64 20  fcounts(.  void 
23040 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
23050 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23060 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
23070 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
23080 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
23090 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
230a0 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a 61 3b 0a  i;.  int v, *a;.
230b0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 73 75    Tcl_Obj *pResu
230c0 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  lt;..  if( objc!
230d0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
230e0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
230f0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
23100 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
23110 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
23120 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
23130 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
23140 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
23150 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
23160 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
23170 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
23180 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
23190 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
231a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 70 52   TCL_ERROR;.  pR
231b0 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65 77 4f  esult = Tcl_NewO
231c0 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  bj();.  for(i=0;
231d0 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
231e0 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44  {.    if( db->aD
231f0 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 7b 0a 20  b[i].pBt==0 ){. 
23200 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a 20 20 20       v = -1;.   
23210 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
23220 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
23230 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
23240 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 50      a = sqlite3P
23250 61 67 65 72 53 74 61 74 73 28 73 71 6c 69 74 65  agerStats(sqlite
23260 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
23270 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a 20 20  aDb[i].pBt));.  
23280 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b 0a 20 20      v = a[0];.  
23290 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
232a0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
232b0 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63  x);.    }.    Tc
232c0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
232d0 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 73 75 6c  lement(0, pResul
232e0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
232f0 28 76 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  (v));.  }.  Tcl_
23300 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
23310 65 72 70 2c 20 70 52 65 73 75 6c 74 29 3b 0a 20  erp, pResult);. 
23320 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
23330 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
23340 3a 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69  :   working_64bi
23350 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65  t_int.**.** Some
23360 20 54 43 4c 20 62 75 69 6c 64 73 20 28 65 78 3a   TCL builds (ex:
23370 20 63 79 67 77 69 6e 29 20 64 6f 20 6e 6f 74 20   cygwin) do not 
23380 73 75 70 70 6f 72 74 20 36 34 2d 62 69 74 20 69  support 64-bit i
23390 6e 74 65 67 65 72 73 2e 20 20 54 68 69 73 0a 2a  ntegers.  This.*
233a0 2a 20 6c 65 61 64 73 20 74 6f 20 61 20 6e 75 6d  * leads to a num
233b0 62 65 72 20 6f 66 20 74 65 73 74 20 66 61 69 6c  ber of test fail
233c0 75 72 65 73 2e 20 20 54 68 65 20 70 72 65 73 65  ures.  The prese
233d0 6e 74 20 63 6f 6d 6d 61 6e 64 20 63 68 65 63 6b  nt command check
233e0 73 20 74 68 65 0a 2a 2a 20 54 43 4c 20 62 75 69  s the.** TCL bui
233f0 6c 64 20 74 6f 20 73 65 65 20 77 68 65 74 68 65  ld to see whethe
23400 72 20 6f 72 20 6e 6f 74 20 69 74 20 73 75 70 70  r or not it supp
23410 6f 72 74 73 20 36 34 2d 62 69 74 20 69 6e 74 65  orts 64-bit inte
23420 67 65 72 73 2e 20 20 49 74 0a 2a 2a 20 72 65 74  gers.  It.** ret
23430 75 72 6e 73 20 54 52 55 45 20 69 66 20 69 74 20  urns TRUE if it 
23440 64 6f 65 73 20 61 6e 64 20 46 41 4c 53 45 20 69  does and FALSE i
23450 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  f not..**.** Thi
23460 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65  s command is use
23470 64 20 74 6f 20 77 61 72 6e 20 75 73 65 72 73 20  d to warn users 
23480 74 68 61 74 20 74 68 65 69 72 20 54 43 4c 20 62  that their TCL b
23490 75 69 6c 64 20 69 73 20 64 65 66 65 63 74 69 76  uild is defectiv
234a0 65 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20 74 68  e.** and that th
234b0 65 20 65 72 72 6f 72 73 20 74 68 65 79 20 61 72  e errors they ar
234c0 65 20 73 65 65 69 6e 67 20 69 6e 20 74 68 65 20  e seeing in the 
234d0 74 65 73 74 20 73 63 72 69 70 74 73 20 6d 69 67  test scripts mig
234e0 68 74 20 62 65 0a 2a 2a 20 61 20 72 65 73 75 6c  ht be.** a resul
234f0 74 20 6f 66 20 74 68 65 69 72 20 64 65 66 65 63  t of their defec
23500 74 69 76 65 20 54 43 4c 20 72 61 74 68 65 72 20  tive TCL rather 
23510 74 68 61 6e 20 70 72 6f 62 6c 65 6d 73 20 69 6e  than problems in
23520 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74 61 74   SQLite..*/.stat
23530 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
23540 4c 41 50 49 20 77 6f 72 6b 69 6e 67 5f 36 34 62  LAPI working_64b
23550 69 74 5f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74  it_int(.  Client
23560 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
23570 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
23580 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
23590 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
235a0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
235b0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
235c0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
235d0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
235e0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
235f0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
23600 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23610 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
23620 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23630 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
23640 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
23650 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 54 65  {.  Tcl_Obj *pTe
23660 73 74 4f 62 6a 3b 0a 20 20 69 6e 74 20 77 6f 72  stObj;.  int wor
23670 6b 69 6e 67 20 3d 20 30 3b 0a 0a 20 20 70 54 65  king = 0;..  pTe
23680 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 57  stObj = Tcl_NewW
23690 69 64 65 49 6e 74 4f 62 6a 28 31 30 30 30 30 30  ideIntObj(100000
236a0 30 2a 28 69 36 34 29 31 32 33 34 35 36 37 38 39  0*(i64)123456789
236b0 30 29 3b 0a 20 20 77 6f 72 6b 69 6e 67 20 3d 20  0);.  working = 
236c0 73 74 72 63 6d 70 28 54 63 6c 5f 47 65 74 53 74  strcmp(Tcl_GetSt
236d0 72 69 6e 67 28 70 54 65 73 74 4f 62 6a 29 2c 20  ring(pTestObj), 
236e0 22 31 32 33 34 35 36 37 38 39 30 30 30 30 30 30  "123456789000000
236f0 30 22 29 3d 3d 30 3b 0a 20 20 54 63 6c 5f 44 65  0")==0;.  Tcl_De
23700 63 72 52 65 66 43 6f 75 6e 74 28 70 54 65 73 74  crRefCount(pTest
23710 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  Obj);.  Tcl_SetO
23720 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
23730 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
23740 62 6a 28 77 6f 72 6b 69 6e 67 29 29 3b 0a 20 20  bj(working));.  
23750 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
23760 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .../*.** tclcmd:
23770 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65     vfs_unlink_te
23780 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  st.**.** This TC
23790 4c 20 63 6f 6d 6d 61 6e 64 20 75 6e 72 65 67 69  L command unregi
237a0 73 74 65 72 73 20 74 68 65 20 70 72 69 6d 61 72  sters the primar
237b0 79 20 56 46 53 20 61 6e 64 20 74 68 65 6e 20 72  y VFS and then r
237c0 65 67 69 73 74 65 72 73 0a 2a 2a 20 69 74 20 62  egisters.** it b
237d0 61 63 6b 20 61 67 61 69 6e 2e 20 20 54 68 69 73  ack again.  This
237e0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
237f0 20 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20   the ability to 
23800 72 65 67 69 73 74 65 72 20 61 0a 2a 2a 20 56 46  register a.** VF
23810 53 20 77 68 65 6e 20 6e 6f 6e 65 20 61 72 65 20  S when none are 
23820 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
23830 74 65 72 65 64 2c 20 61 6e 64 20 74 68 65 20 61  tered, and the a
23840 62 69 6c 69 74 79 20 74 6f 20 0a 2a 2a 20 75 6e  bility to .** un
23850 72 65 67 69 73 74 65 72 20 74 68 65 20 6f 6e 6c  register the onl
23860 79 20 61 76 61 69 6c 61 62 6c 65 20 56 46 53 2e  y available VFS.
23870 20 20 54 69 63 6b 65 74 20 23 32 37 33 38 0a 2a    Ticket #2738.*
23880 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
23890 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f 75  ITE_TCLAPI vfs_u
238a0 6e 6c 69 6e 6b 5f 74 65 73 74 28 0a 20 20 43 6c  nlink_test(.  Cl
238b0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
238c0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
238d0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
238e0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
238f0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
23900 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
23910 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
23920 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
23930 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
23940 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
23950 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
23960 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
23970 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
23980 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
23990 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
239a0 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
239b0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 4d   sqlite3_vfs *pM
239c0 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ain;.  sqlite3_v
239d0 66 73 20 2a 61 70 56 66 73 5b 32 30 5d 3b 0a 20  fs *apVfs[20];. 
239e0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65   sqlite3_vfs one
239f0 2c 20 74 77 6f 3b 0a 0a 20 20 73 71 6c 69 74 65  , two;..  sqlite
23a00 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
23a10 28 30 29 3b 20 20 20 2f 2a 20 55 6e 72 65 67 69  (0);   /* Unregi
23a20 73 74 65 72 20 6f 66 20 4e 55 4c 4c 20 69 73 20  ster of NULL is 
23a30 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20 6f 6e  harmless */.  on
23a40 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f 6e 65  e.zName = "__one
23a50 22 3b 0a 20 20 74 77 6f 2e 7a 4e 61 6d 65 20 3d  ";.  two.zName =
23a60 20 22 5f 5f 74 77 6f 22 3b 0a 0a 20 20 2f 2a 20   "__two";..  /* 
23a70 43 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  Calling sqlite3_
23a80 76 66 73 5f 72 65 67 69 73 74 65 72 20 77 69 74  vfs_register wit
23a90 68 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 6f  h 2nd argument o
23aa0 66 20 30 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a  f 0 does not.  *
23ab0 2a 20 63 68 61 6e 67 65 20 74 68 65 20 64 65 66  * change the def
23ac0 61 75 6c 74 20 56 46 53 0a 20 20 2a 2f 0a 20 20  ault VFS.  */.  
23ad0 70 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f  pMain = sqlite3_
23ae0 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 73  vfs_find(0);.  s
23af0 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
23b00 74 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20  ter(&one, 0);.  
23b10 61 73 73 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30  assert( pMain==0
23b20 20 7c 7c 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74   || pMain==sqlit
23b30 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
23b40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  ;.  sqlite3_vfs_
23b50 72 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 30  register(&two, 0
23b60 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d 61  );.  assert( pMa
23b70 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d 3d  in==0 || pMain==
23b80 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
23b90 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20  (0) );..  /* We 
23ba0 63 61 6e 20 66 69 6e 64 20 61 20 56 46 53 20 62  can find a VFS b
23bb0 79 20 69 74 73 20 6e 61 6d 65 20 2a 2f 0a 20 20  y its name */.  
23bc0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
23bd0 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
23be0 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61 73 73  )==&one );.  ass
23bf0 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73  ert( sqlite3_vfs
23c00 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d  _find("__two")==
23c10 26 74 77 6f 20 29 3b 0a 0a 20 20 2f 2a 20 43 61  &two );..  /* Ca
23c20 6c 6c 69 6e 67 20 73 71 6c 69 74 65 5f 76 66 73  lling sqlite_vfs
23c30 5f 72 65 67 69 73 74 65 72 20 77 69 74 68 20 6e  _register with n
23c40 6f 6e 2d 7a 65 72 6f 20 73 65 63 6f 6e 64 20 70  on-zero second p
23c50 61 72 61 6d 65 74 65 72 20 63 68 61 6e 67 65 73  arameter changes
23c60 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75 6c   the.  ** defaul
23c70 74 20 56 46 53 2c 20 65 76 65 6e 20 69 66 20 74  t VFS, even if t
23c80 68 65 20 31 73 74 20 70 61 72 61 6d 65 74 65 72  he 1st parameter
23c90 20 69 73 20 61 6e 20 65 78 69 73 74 69 67 20 56   is an existig V
23ca0 46 53 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  FS that is.  ** 
23cb0 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
23cc0 74 65 72 65 64 20 61 73 20 74 68 65 20 6e 6f 6e  tered as the non
23cd0 2d 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 20  -default..  */. 
23ce0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67   sqlite3_vfs_reg
23cf0 69 73 74 65 72 28 26 6f 6e 65 2c 20 31 29 3b 0a  ister(&one, 1);.
23d00 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
23d10 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
23d20 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 61  e")==&one );.  a
23d30 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
23d40 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
23d50 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73 73 65  ==&two );.  asse
23d60 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
23d70 66 69 6e 64 28 30 29 3d 3d 26 6f 6e 65 20 29 3b  find(0)==&one );
23d80 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
23d90 65 67 69 73 74 65 72 28 26 74 77 6f 2c 20 31 29  egister(&two, 1)
23da0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
23db0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
23dc0 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20  one")==&one );. 
23dd0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
23de0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
23df0 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 61 73  ")==&two );.  as
23e00 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
23e10 73 5f 66 69 6e 64 28 30 29 3d 3d 26 74 77 6f 20  s_find(0)==&two 
23e20 29 3b 0a 20 20 69 66 28 20 70 4d 61 69 6e 20 29  );.  if( pMain )
23e30 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66  {.    sqlite3_vf
23e40 73 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  s_register(pMain
23e50 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  , 1);.    assert
23e60 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
23e70 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e  nd("__one")==&on
23e80 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  e );.    assert(
23e90 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
23ea0 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
23eb0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
23ec0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
23ed0 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20  (0)==pMain );.  
23ee0 7d 0a 20 20 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b  }.  .  /* Unlink
23ef0 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
23f00 2e 20 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20  .  Repeat until 
23f10 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
23f20 65 20 56 46 53 65 73 0a 20 20 2a 2a 20 72 65 67  e VFSes.  ** reg
23f30 69 73 74 65 72 65 64 2e 0a 20 20 2a 2f 0a 20 20  istered..  */.  
23f40 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
23f50 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f 66 28  f(apVfs)/sizeof(
23f60 61 70 56 66 73 5b 30 5d 29 3b 20 69 2b 2b 29 7b  apVfs[0]); i++){
23f70 0a 20 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20  .    apVfs[i] = 
23f80 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
23f90 28 30 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56  (0);.    if( apV
23fa0 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 61  fs[i] ){.      a
23fb0 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
23fc0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
23fd0 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
23fe0 65 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  e) );.      sqli
23ff0 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
24000 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20  er(apVfs[i]);.  
24010 20 20 20 20 61 73 73 65 72 74 28 20 30 3d 3d 73      assert( 0==s
24020 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
24030 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
24040 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   );.    }.  }.  
24050 61 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74  assert( 0==sqlit
24060 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
24070 3b 0a 20 20 0a 20 20 2f 2a 20 52 65 67 69 73 74  ;.  .  /* Regist
24080 65 72 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20  er the main VFS 
24090 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 20 28  as non-default (
240a0 77 69 6c 6c 20 62 65 20 6d 61 64 65 20 64 65 66  will be made def
240b0 61 75 6c 74 2c 20 73 69 6e 63 65 0a 20 20 2a 2a  ault, since.  **
240c0 20 69 74 27 6c 6c 20 62 65 20 74 68 65 20 6f 6e   it'll be the on
240d0 6c 79 20 6f 6e 65 20 69 6e 20 65 78 69 73 74 65  ly one in existe
240e0 6e 63 65 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  nce)..  */.  sql
240f0 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
24100 72 28 70 4d 61 69 6e 2c 20 30 29 3b 0a 20 20 61  r(pMain, 0);.  a
24110 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
24120 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
24130 6e 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 55 6e 2d  n );.  .  /* Un-
24140 72 65 67 69 73 74 65 72 20 74 68 65 20 6d 61 69  register the mai
24150 6e 20 56 46 53 20 61 67 61 69 6e 20 74 6f 20 72  n VFS again to r
24160 65 73 74 6f 72 65 20 61 6e 20 65 6d 70 74 79 20  estore an empty 
24170 56 46 53 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71  VFS list */.  sq
24180 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
24190 73 74 65 72 28 70 4d 61 69 6e 29 3b 0a 20 20 61  ster(pMain);.  a
241a0 73 73 65 72 74 28 20 30 3d 3d 73 71 6c 69 74 65  ssert( 0==sqlite
241b0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
241c0 0a 0a 20 20 2f 2a 20 52 65 6c 69 6e 6b 20 61 6c  ..  /* Relink al
241d0 6c 20 56 46 53 65 73 20 69 6e 20 72 65 76 65 72  l VFSes in rever
241e0 73 65 20 6f 72 64 65 72 2e 20 2a 2f 20 20 0a 20  se order. */  . 
241f0 20 66 6f 72 28 69 3d 73 69 7a 65 6f 66 28 61 70   for(i=sizeof(ap
24200 56 66 73 29 2f 73 69 7a 65 6f 66 28 61 70 56 66  Vfs)/sizeof(apVf
24210 73 5b 30 5d 29 2d 31 3b 20 69 3e 3d 30 3b 20 69  s[0])-1; i>=0; i
24220 2d 2d 29 7b 0a 20 20 20 20 69 66 28 20 61 70 56  --){.    if( apV
24230 66 73 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 73  fs[i] ){.      s
24240 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
24250 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 31 29  ter(apVfs[i], 1)
24260 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
24270 61 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65  apVfs[i]==sqlite
24280 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b  3_vfs_find(0) );
24290 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
242a0 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33  pVfs[i]==sqlite3
242b0 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b  _vfs_find(apVfs[
242c0 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20  i]->zName) );.  
242d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e    }.  }..  /* Un
242e0 72 65 67 69 73 74 65 72 20 6f 75 74 20 73 61 6d  register out sam
242f0 70 6c 65 20 56 46 53 65 73 2e 20 2a 2f 0a 20 20  ple VFSes. */.  
24300 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
24310 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20  gister(&one);.  
24320 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
24330 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 0a 20  gister(&two);.. 
24340 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 69 6e   /* Unregisterin
24350 67 20 61 20 56 46 53 20 74 68 61 74 20 69 73 20  g a VFS that is 
24360 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
24370 67 69 73 74 65 72 65 64 20 69 73 20 68 61 72 6d  gistered is harm
24380 6c 65 73 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  less */.  sqlite
24390 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
243a0 28 26 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65  (&one);.  sqlite
243b0 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72  3_vfs_unregister
243c0 28 26 74 77 6f 29 3b 0a 20 20 61 73 73 65 72 74  (&two);.  assert
243d0 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
243e0 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 30 20 29  nd("__one")==0 )
243f0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24400 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
24410 74 77 6f 22 29 3d 3d 30 20 29 3b 0a 0a 20 20 2f  two")==0 );..  /
24420 2a 20 57 65 20 73 68 6f 75 6c 64 20 62 65 20 6c  * We should be l
24430 65 66 74 20 77 69 74 68 20 74 68 65 20 6f 72 69  eft with the ori
24440 67 69 6e 61 6c 20 64 65 66 61 75 6c 74 20 56 46  ginal default VF
24450 53 20 62 61 63 6b 20 61 73 20 74 68 65 0a 20 20  S back as the.  
24460 2a 2a 20 6f 72 69 67 69 6e 61 6c 20 2a 2f 0a 20  ** original */. 
24470 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
24480 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d  _vfs_find(0)==pM
24490 61 69 6e 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ain );..  return
244a0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
244b0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f  * tclcmd:   vfs_
244c0 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 0a 2a 2a  initfail_test.**
244d0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
244e0 6d 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74 6f  mand attempts to
244f0 20 76 66 73 5f 66 69 6e 64 20 61 6e 64 20 76 66   vfs_find and vf
24500 73 5f 72 65 67 69 73 74 65 72 20 77 68 65 6e 20  s_register when 
24510 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 69  the.** sqlite3_i
24520 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 6e 74 65  nitialize() inte
24530 72 66 61 63 65 20 69 73 20 66 61 69 6c 69 6e 67  rface is failing
24540 2e 20 20 41 6c 6c 20 63 61 6c 6c 73 20 73 68 6f  .  All calls sho
24550 75 6c 64 20 66 61 69 6c 2e 0a 2a 2f 0a 73 74 61  uld fail..*/.sta
24560 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
24570 43 4c 41 50 49 20 76 66 73 5f 69 6e 69 74 66 61  CLAPI vfs_initfa
24580 69 6c 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e  il_test(.  Clien
24590 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
245a0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
245b0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
245c0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
245d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
245e0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
245f0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
24600 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
24610 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
24620 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
24630 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24640 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
24650 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
24660 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
24670 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
24680 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
24690 20 6f 6e 65 3b 0a 20 20 6f 6e 65 2e 7a 4e 61 6d   one;.  one.zNam
246a0 65 20 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 0a 20 20  e = "__one";..  
246b0 69 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  if( sqlite3_vfs_
246c0 66 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e  find(0) ) return
246d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
246e0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
246f0 65 72 28 26 6f 6e 65 2c 20 30 29 3b 0a 20 20 69  er(&one, 0);.  i
24700 66 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  f( sqlite3_vfs_f
24710 69 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20  ind(0) ) return 
24720 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
24730 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
24740 72 28 26 6f 6e 65 2c 20 31 29 3b 0a 20 20 69 66  r(&one, 1);.  if
24750 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
24760 6e 64 28 30 29 20 29 20 72 65 74 75 72 6e 20 54  nd(0) ) return T
24770 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75  CL_ERROR;.  retu
24780 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
24790 0a 2a 2a 20 53 61 76 65 64 20 56 46 53 65 73 0a  .** Saved VFSes.
247a0 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
247b0 33 5f 76 66 73 20 2a 61 70 56 66 73 5b 32 30 5d  3_vfs *apVfs[20]
247c0 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 56 66  ;.static int nVf
247d0 73 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 74 63  s = 0;../*.** tc
247e0 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 72 65  lcmd:   vfs_unre
247f0 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a  gister_all.**.**
24800 20 55 6e 72 65 67 69 73 74 65 72 20 61 6c 6c 20   Unregister all 
24810 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  VFSes..*/.static
24820 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
24830 50 49 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65  PI vfs_unregiste
24840 72 5f 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44  r_all(.  ClientD
24850 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
24860 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
24870 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
24880 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
24890 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
248a0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
248b0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
248c0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
248d0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
248e0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
248f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
24900 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
24910 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
24920 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
24930 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
24940 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
24950 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
24960 28 61 70 56 66 73 29 3b 20 69 2b 2b 29 7b 0a 20  (apVfs); i++){. 
24970 20 20 20 61 70 56 66 73 5b 69 5d 20 3d 20 73 71     apVfs[i] = sq
24980 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
24990 29 3b 0a 20 20 20 20 69 66 28 20 61 70 56 66 73  );.    if( apVfs
249a0 5b 69 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [i]==0 ) break;.
249b0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
249c0 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73  unregister(apVfs
249d0 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 6e 56 66 73  [i]);.  }.  nVfs
249e0 20 3d 20 69 3b 0a 20 20 72 65 74 75 72 6e 20 54   = i;.  return T
249f0 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74  CL_OK;.}./*.** t
24a00 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 72 65 72  clcmd:   vfs_rer
24a10 65 67 69 73 74 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a  egister_all.**.*
24a20 2a 20 52 65 73 74 6f 72 65 20 61 6c 6c 20 56 46  * Restore all VF
24a30 53 65 73 20 74 68 61 74 20 77 65 72 65 20 72 65  Ses that were re
24a40 6d 6f 76 65 64 20 75 73 69 6e 67 20 76 66 73 5f  moved using vfs_
24a50 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 2e 20  unregister_all. 
24a60 54 61 6b 69 6e 67 0a 2a 2a 20 63 61 72 65 20 74  Taking.** care t
24a70 6f 20 70 75 74 20 74 68 65 20 6c 69 6e 6b 65 64  o put the linked
24a80 20 6c 69 73 74 20 62 61 63 6b 20 74 6f 67 65 74   list back toget
24a90 68 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20  her in the same 
24aa0 6f 72 64 65 72 20 61 73 20 69 74 20 77 61 73 0a  order as it was.
24ab0 2a 2a 20 69 6e 20 62 65 66 6f 72 65 20 76 66 73  ** in before vfs
24ac0 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 20  _unregister_all 
24ad0 77 61 73 20 69 6e 76 6f 6b 65 64 2e 0a 2a 2f 0a  was invoked..*/.
24ae0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
24af0 45 5f 54 43 4c 41 50 49 20 76 66 73 5f 72 65 72  E_TCLAPI vfs_rer
24b00 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43  egister_all(.  C
24b10 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
24b20 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
24b30 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
24b40 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
24b50 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
24b60 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
24b70 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
24b80 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
24b90 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
24ba0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
24bb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24bc0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
24bd0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
24be0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
24bf0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
24c00 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
24c10 20 20 66 6f 72 28 69 3d 6e 56 66 73 2d 31 3b 20    for(i=nVfs-1; 
24c20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
24c30 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
24c40 73 74 65 72 28 61 70 56 66 73 5b 69 5d 2c 20 31  ster(apVfs[i], 1
24c50 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
24c60 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
24c70 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
24c80 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 20 44 42  _control_test DB
24c90 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
24ca0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
24cb0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
24cc0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
24cd0 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
24ce0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
24cf0 6e 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a  n of the same..*
24d00 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
24d10 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f  ITE_TCLAPI file_
24d20 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28 0a 20 20  control_test(.  
24d30 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
24d40 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
24d50 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
24d60 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
24d70 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
24d80 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
24d90 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
24da0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
24db0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
24dc0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
24dd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
24de0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
24df0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
24e00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
24e10 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
24e20 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41  s */.){.  int iA
24e30 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  rg = 0;.  sqlite
24e40 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
24e50 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
24e60 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
24e70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
24e80 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
24e90 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
24ea0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
24eb0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
24ec0 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
24ed0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
24ee0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
24ef0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
24f00 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
24f10 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
24f20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
24f30 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
24f40 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
24f50 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30 2c 20 26  trol(db, 0, 0, &
24f60 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
24f70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
24f80 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d 20 73  OUND );.  rc = s
24f90 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24fa0 72 6f 6c 28 64 62 2c 20 22 6e 6f 74 61 64 61 74  rol(db, "notadat
24fb0 61 62 61 73 65 22 2c 20 53 51 4c 49 54 45 5f 46  abase", SQLITE_F
24fc0 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20  CNTL_LOCKSTATE, 
24fd0 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
24fe0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
24ff0 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OR );.  rc = sql
25000 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
25010 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 2d 31  l(db, "main", -1
25020 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
25030 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
25040 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20  OTFOUND );.  rc 
25050 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
25060 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74 65 6d 70  ontrol(db, "temp
25070 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20  ", -1, &iArg);. 
25080 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
25090 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 7c 7c 20  ITE_NOTFOUND || 
250a0 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
250b0 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43   );..  return TC
250c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
250d0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
250e0 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f  ontrol_lasterrno
250f0 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54  _test DB.**.** T
25100 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
25110 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
25120 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
25130 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
25140 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
25150 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
25160 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
25170 4e 4f 20 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74  NO verb..*/.stat
25180 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
25190 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  LAPI file_contro
251a0 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74  l_lasterrno_test
251b0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
251c0 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
251d0 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
251e0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
251f0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
25200 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
25210 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
25220 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
25230 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
25240 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
25250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25260 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
25270 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
25280 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
25290 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
252a0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
252b0 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20 73 71  t iArg = 0;.  sq
252c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
252d0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
252e0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
252f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
25300 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
25310 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
25320 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
25330 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
25340 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
25350 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
25360 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
25370 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
25380 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
25390 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
253a0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
253b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
253c0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
253d0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
253e0 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
253f0 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 2c 20 26  TE_LAST_ERRNO, &
25400 69 41 72 67 29 3b 0a 20 20 69 66 28 20 72 63 20  iArg);.  if( rc 
25410 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  ){ .    Tcl_SetO
25420 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
25430 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
25440 63 29 29 3b 20 0a 20 20 20 20 72 65 74 75 72 6e  c)); .    return
25450 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20 20 7d   TCL_ERROR; .  }
25460 0a 20 20 69 66 28 20 69 41 72 67 21 3d 30 20 29  .  if( iArg!=0 )
25470 20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e   {.    Tcl_Appen
25480 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
25490 22 55 6e 65 78 70 65 63 74 65 64 20 6e 6f 6e 2d  "Unexpected non-
254a0 7a 65 72 6f 20 65 72 72 6e 6f 3a 20 22 2c 0a 20  zero errno: ",. 
254b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
254c0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
254d0 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 4e 65 77  gFromObj(Tcl_New
254e0 49 6e 74 4f 62 6a 28 69 41 72 67 29 2c 20 30 29  IntObj(iArg), 0)
254f0 2c 20 22 20 22 2c 20 30 29 3b 0a 20 20 20 20 72  , " ", 0);.    r
25500 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25510 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
25520 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
25530 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
25540 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a  control_chunksiz
25550 65 5f 74 65 73 74 20 44 42 20 44 42 4e 41 4d 45  e_test DB DBNAME
25560 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73   SIZE.**.** This
25570 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
25580 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
25590 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
255a0 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
255b0 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
255c0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  ration of the SQ
255d0 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
255e0 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51  XYFILE and.** SQ
255f0 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_SET_LOCKPRO
25600 58 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f  XYFILE verbs..*/
25610 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
25620 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63  TE_TCLAPI file_c
25630 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
25640 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44  _test(.  ClientD
25650 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
25660 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
25670 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
25680 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
25690 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
256a0 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
256b0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
256c0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
256d0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
256e0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
256f0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25700 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
25710 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
25720 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
25730 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
25740 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20 20  .  int nSize;   
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 20 20 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b 20     /* New chunk 
25770 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  size */.  char *
25780 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  zDb;            
25790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20            /* Db 
257a0 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74  name ("main", "t
257b0 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20  emp" etc.) */.  
257c0 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
257d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257e0 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64  /* Database hand
257f0 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  le */.  int rc; 
25800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25810 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f          /* file_
25820 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e  control() return
25830 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
25840 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
25850 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
25860 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
25870 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45   "DB DBNAME SIZE
25880 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
25890 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
258a0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
258b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
258c0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
258d0 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c   &db) .   || Tcl
258e0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
258f0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
25900 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20  &nSize).  ){.   
25910 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25920 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63  ;.  }.  zDb = Tc
25930 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
25940 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b  [2]);.  if( zDb[
25950 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d  0]=='\0' ) zDb =
25960 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73   NULL;..  rc = s
25970 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
25980 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  rol(db, zDb, SQL
25990 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b 5f  ITE_FCNTL_CHUNK_
259a0 53 49 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26 6e  SIZE, (void *)&n
259b0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
259c0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
259d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
259e0 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e  ar *)sqlite3ErrN
259f0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
25a00 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  TIC);.    return
25a10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
25a20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25a30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
25a40 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
25a50 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20 44  _sizehint_test D
25a60 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a  B DBNAME SIZE.**
25a70 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
25a80 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
25a90 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
25aa0 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 0a 2a 2a  ol interface .**
25ab0 20 77 69 74 68 20 53 51 4c 49 54 45 5f 46 43 4e   with SQLITE_FCN
25ac0 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f 0a  TL_SIZE_HINT.*/.
25ad0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
25ae0 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f  E_TCLAPI file_co
25af0 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
25b00 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
25b10 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
25b20 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
25b30 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
25b40 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
25b50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25b60 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25b70 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25b80 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25b90 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25ba0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25bb0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25bc0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25bd0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25be0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25bf0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
25c00 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 53 69   Tcl_WideInt nSi
25c10 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
25c20 20 2f 2a 20 48 69 6e 74 65 64 20 73 69 7a 65 20   /* Hinted size 
25c30 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 20  */.  char *zDb; 
25c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25c50 20 20 20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20       /* Db name 
25c60 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d 70 22 20  ("main", "temp" 
25c70 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74  etc.) */.  sqlit
25c80 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
25c90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
25ca0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
25cb0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
25cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25cd0 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72     /* file_contr
25ce0 6f 6c 28 29 20 72 65 74 75 72 6e 20 63 6f 64 65  ol() return code
25cf0 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
25d00 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
25d10 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
25d20 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
25d30 44 42 4e 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20  DBNAME SIZE");. 
25d40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
25d50 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
25d60 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
25d70 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
25d80 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
25d90 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 57   .   || Tcl_GetW
25da0 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
25db0 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
25dc0 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20 20 72  nSize).  ){.   r
25dd0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25de0 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c  .  }.  zDb = Tcl
25df0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
25e00 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62 5b 30  2]);.  if( zDb[0
25e10 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20 3d 20  ]=='\0' ) zDb = 
25e20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20 73 71  NULL;..  rc = sq
25e30 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
25e40 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  ol(db, zDb, SQLI
25e50 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49  TE_FCNTL_SIZE_HI
25e60 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26 6e 53 69  NT, (void *)&nSi
25e70 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ze);.  if( rc ){
25e80 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75  .    Tcl_SetResu
25e90 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
25ea0 20 2a 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d   *)sqlite3ErrNam
25eb0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
25ec0 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  C);.    return T
25ed0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
25ee0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
25ef0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
25f00 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
25f10 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 20 44 42  ockproxy_test DB
25f20 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   PWD.**.** This 
25f30 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
25f40 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
25f50 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
25f60 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
25f70 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
25f80 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
25f90 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
25fa0 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c  YFILE and.** SQL
25fb0 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
25fc0 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a  YFILE verbs..*/.
25fd0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
25fe0 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f  E_TCLAPI file_co
25ff0 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
26000 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
26010 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
26020 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
26030 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
26040 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
26050 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
26060 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
26070 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
26080 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
26090 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
260a0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
260b0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
260c0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
260d0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
260e0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
260f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
26100 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
26110 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20   .  if( objc!=3 
26120 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
26130 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
26140 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
26150 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
26160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26170 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
26180 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
26190 20 30 29 2c 20 22 20 44 42 20 50 57 44 22 2c 20   0), " DB PWD", 
261a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
261b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
261c0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
261d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
261e0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
261f0 20 26 64 62 29 20 29 7b 0a 20 20 20 72 65 74 75   &db) ){.   retu
26200 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
26210 7d 0a 20 20 0a 23 69 66 20 21 64 65 66 69 6e 65  }.  .#if !define
26220 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
26230 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 29 0a 23  LOCKING_STYLE).#
26240 20 20 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41    if defined(__A
26250 50 50 4c 45 5f 5f 29 0a 23 20 20 20 20 64 65 66  PPLE__).#    def
26260 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ine SQLITE_ENABL
26270 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20  E_LOCKING_STYLE 
26280 31 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20 64  1.#  else.#    d
26290 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 45 4e 41  efine SQLITE_ENA
262a0 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
262b0 45 20 30 0a 23 20 20 65 6e 64 69 66 0a 23 65 6e  E 0.#  endif.#en
262c0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 45  dif.#if SQLITE_E
262d0 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
262e0 59 4c 45 20 26 26 20 64 65 66 69 6e 65 64 28 5f  YLE && defined(_
262f0 5f 41 50 50 4c 45 5f 5f 29 0a 20 20 7b 0a 20 20  _APPLE__).  {.  
26300 20 20 63 68 61 72 20 2a 74 65 73 74 50 61 74 68    char *testPath
26310 3b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20  ;.    int rc;.  
26320 20 20 69 6e 74 20 6e 50 77 64 3b 0a 20 20 20 20    int nPwd;.    
26330 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 77 64  const char *zPwd
26340 3b 0a 20 20 20 20 63 68 61 72 20 70 72 6f 78 79  ;.    char proxy
26350 50 61 74 68 5b 34 30 30 5d 3b 0a 20 20 20 20 0a  Path[400];.    .
26360 20 20 20 20 7a 50 77 64 20 3d 20 54 63 6c 5f 47      zPwd = Tcl_G
26370 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
26380 6f 62 6a 76 5b 32 5d 2c 20 26 6e 50 77 64 29 3b  objv[2], &nPwd);
26390 0a 20 20 20 20 69 66 28 20 73 69 7a 65 6f 66 28  .    if( sizeof(
263a0 70 72 6f 78 79 50 61 74 68 29 3c 6e 50 77 64 2b  proxyPath)<nPwd+
263b0 32 30 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  20 ){.      Tcl_
263c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
263d0 65 72 70 2c 20 22 50 57 44 20 74 6f 6f 20 62 69  erp, "PWD too bi
263e0 67 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20  g", (void*)0);. 
263f0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
26400 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
26410 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
26420 66 28 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61  f(sizeof(proxyPa
26430 74 68 29 2c 20 70 72 6f 78 79 50 61 74 68 2c 20  th), proxyPath, 
26440 22 25 73 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c  "%s/test.proxy",
26450 20 7a 50 77 64 29 3b 0a 20 20 20 20 72 63 20 3d   zPwd);.    rc =
26460 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
26470 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
26480 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
26490 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50  ROXYFILE, proxyP
264a0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ath);.    if( rc
264b0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
264c0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
264d0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
264e0 28 72 63 29 29 3b 20 0a 20 20 20 20 20 20 72 65  (rc)); .      re
264f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
26500 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
26510 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
26520 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
26530 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f  LITE_GET_LOCKPRO
26540 58 59 46 49 4c 45 2c 20 26 74 65 73 74 50 61 74  XYFILE, &testPat
26550 68 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 6e  h);.    if( strn
26560 63 6d 70 28 70 72 6f 78 79 50 61 74 68 2c 74 65  cmp(proxyPath,te
26570 73 74 50 61 74 68 2c 31 31 29 20 29 7b 0a 20 20  stPath,11) ){.  
26580 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
26590 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f  sult(interp, "Lo
265a0 63 6b 20 70 72 6f 78 79 20 66 69 6c 65 20 64 69  ck proxy file di
265b0 64 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  d not match the 
265c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
265e0 20 22 70 72 65 76 69 6f 75 73 6c 79 20 61 73 73   "previously ass
265f0 69 67 6e 65 64 20 76 61 6c 75 65 22 2c 20 30 29  igned value", 0)
26600 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
26610 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
26620 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
26630 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
26640 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
26650 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
26660 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
26670 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
26680 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
26690 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
266a0 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45   NULL, SQLITE_SE
266b0 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
266c0 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20 20   proxyPath);.   
266d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
266e0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
266f0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
26700 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
26710 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
26720 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
26730 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
26740 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66  TCL_OK;  .}..#if
26750 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f   SQLITE_OS_WIN./
26760 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
26770 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
26780 32 5f 61 76 5f 72 65 74 72 79 20 44 42 20 20 4e  2_av_retry DB  N
26790 52 45 54 52 59 20 20 44 45 4c 41 59 0a 2a 2a 0a  RETRY  DELAY.**.
267a0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
267b0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
267c0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
267d0 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  l interface with
267e0 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46  .** the SQLITE_F
267f0 43 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45  CNTL_WIN32_AV_RE
26800 54 52 59 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73  TRY opcode..*/.s
26810 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
26820 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e  _TCLAPI file_con
26830 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65  trol_win32_av_re
26840 74 72 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  try(.  ClientDat
26850 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
26860 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
26870 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
26880 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
26890 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
268a0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
268b0 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
268c0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
268d0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
268e0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
268f0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
26900 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
26910 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
26920 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
26930 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
26940 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
26950 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b  int rc;.  int a[
26960 32 5d 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30  2];.  char z[100
26970 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ];..  if( objc!=
26980 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
26990 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
269a0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
269b0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
269c0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
269d0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
269e0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e  v[0], 0), " DB N
269f0 52 45 54 52 59 20 44 45 4c 41 59 22 2c 20 30 29  RETRY DELAY", 0)
26a00 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
26a10 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
26a20 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
26a30 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
26a40 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
26a50 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
26a60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
26a70 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
26a80 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
26a90 20 6f 62 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29   objv[2], &a[0])
26aa0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
26ab0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
26ac0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
26ad0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61  erp, objv[3], &a
26ae0 5b 31 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43  [1]) ) return TC
26af0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
26b00 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
26b10 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
26b20 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33  QLITE_FCNTL_WIN3
26b30 32 5f 41 56 5f 52 45 54 52 59 2c 20 28 76 6f 69  2_AV_RETRY, (voi
26b40 64 2a 29 61 29 3b 0a 20 20 73 71 6c 69 74 65 33  d*)a);.  sqlite3
26b50 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
26b60 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 20 25  (z), z, "%d %d %
26b70 64 22 2c 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b  d", rc, a[0], a[
26b80 31 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  1]);.  Tcl_Appen
26b90 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
26ba0 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  z, (char*)0);.  
26bb0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
26bc0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
26bd0 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
26be0 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c  _win32_set_handl
26bf0 65 20 44 42 20 48 41 4e 44 4c 45 0a 2a 2a 0a 2a  e DB HANDLE.**.*
26c00 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
26c10 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
26c20 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
26c30 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a   interface with.
26c40 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  ** the SQLITE_FC
26c50 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41  NTL_WIN32_SET_HA
26c60 4e 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  NDLE opcode..*/.
26c70 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
26c80 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f  E_TCLAPI file_co
26c90 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f  ntrol_win32_set_
26ca0 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e 74  handle(.  Client
26cb0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
26cc0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
26cd0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
26ce0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
26cf0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
26d00 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
26d10 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
26d20 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
26d30 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
26d40 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
26d50 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
26d60 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
26d70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
26d80 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
26d90 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
26da0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
26db0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 48 41 4e  .  int rc;.  HAN
26dc0 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55 4c 4c  DLE hFile = NULL
26dd0 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b  ;.  char z[100];
26de0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
26df0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
26e00 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
26e10 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
26e20 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
26e30 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
26e40 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
26e50 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 48 41 4e  0], 0), " DB HAN
26e60 44 4c 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  DLE", 0);.    re
26e70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
26e80 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
26e90 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
26ea0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
26eb0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
26ec0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
26ed0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
26ee0 65 74 57 69 6e 33 32 48 61 6e 64 6c 65 28 69 6e  etWin32Handle(in
26ef0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
26f00 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 68  ing(objv[2]), &h
26f10 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65 74  File) ){.    ret
26f20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
26f30 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
26f40 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
26f50 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
26f60 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f  FCNTL_WIN32_SET_
26f70 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20 20 20 20  HANDLE,.        
26f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f90 20 20 20 20 28 76 6f 69 64 2a 29 26 68 46 69 6c      (void*)&hFil
26fa0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  e);.  sqlite3_sn
26fb0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
26fc0 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c 20 72 63  , z, "%d %p", rc
26fd0 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c 65 29 3b  , (void*)hFile);
26fe0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
26ff0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28  ult(interp, z, (
27000 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75  char*)0);.  retu
27010 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 23  rn TCL_OK;  .}.#
27020 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  endif../*.** tcl
27030 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
27040 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c 20  rol_persist_wal 
27050 44 42 20 50 45 52 53 49 53 54 2d 46 4c 41 47 0a  DB PERSIST-FLAG.
27060 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
27070 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
27080 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
27090 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 77  trol interface w
270a0 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54  ith.** the SQLIT
270b0 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
270c0 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73  WAL opcode..*/.s
270d0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
270e0 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e  _TCLAPI file_con
270f0 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c  trol_persist_wal
27100 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
27110 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
27120 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
27130 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
27140 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
27150 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
27160 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
27170 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
27180 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
27190 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
271a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
271b0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
271c0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
271d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
271e0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
271f0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
27200 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
27210 20 72 63 3b 0a 20 20 69 6e 74 20 62 50 65 72 73   rc;.  int bPers
27220 69 73 74 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30  ist;.  char z[10
27230 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
27240 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
27250 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
27260 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
27270 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
27280 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
27290 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
272a0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
272b0 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72  FLAG", 0);.    r
272c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
272d0 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
272e0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
272f0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
27300 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
27310 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27320 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
27330 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
27340 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
27350 5d 2c 20 26 62 50 65 72 73 69 73 74 29 20 29 20  ], &bPersist) ) 
27360 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27370 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
27380 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
27390 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46  , NULL, SQLITE_F
273a0 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c  CNTL_PERSIST_WAL
273b0 2c 20 28 76 6f 69 64 2a 29 26 62 50 65 72 73 69  , (void*)&bPersi
273c0 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
273d0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
273e0 29 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c 20 72  ), z, "%d %d", r
273f0 63 2c 20 62 50 65 72 73 69 73 74 29 3b 0a 20 20  c, bPersist);.  
27400 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
27410 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61  (interp, z, (cha
27420 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
27430 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
27440 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
27450 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73  e_control_powers
27460 61 66 65 5f 6f 76 65 72 77 72 69 74 65 20 44 42  afe_overwrite DB
27470 20 50 53 4f 57 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a   PSOW-FLAG.**.**
27480 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
27490 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
274a0 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
274b0 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a  interface with.*
274c0 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  * the SQLITE_FCN
274d0 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56 45  TL_POWERSAFE_OVE
274e0 52 57 52 49 54 45 20 6f 70 63 6f 64 65 2e 0a 2a  RWRITE opcode..*
274f0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
27500 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f  ITE_TCLAPI file_
27510 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66  control_powersaf
27520 65 5f 6f 76 65 72 77 72 69 74 65 28 0a 20 20 43  e_overwrite(.  C
27530 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
27540 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
27550 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
27560 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
27570 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
27580 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27590 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
275a0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
275b0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
275c0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
275d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
275e0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
275f0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
27600 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
27610 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
27620 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
27630 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
27640 20 20 69 6e 74 20 62 3b 0a 20 20 63 68 61 72 20    int b;.  char 
27650 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  z[100];..  if( o
27660 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
27670 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
27680 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
27690 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
276a0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
276b0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
276c0 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
276d0 20 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20   DB FLAG", 0);. 
276e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
276f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
27700 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
27710 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
27720 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
27730 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
27740 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
27750 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
27760 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
27770 6a 76 5b 32 5d 2c 20 26 62 29 20 29 20 72 65 74  jv[2], &b) ) ret
27780 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27790 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
277a0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55  le_control(db,NU
277b0 4c 4c 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  LL,SQLITE_FCNTL_
277c0 50 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52  POWERSAFE_OVERWR
277d0 49 54 45 2c 28 76 6f 69 64 2a 29 26 62 29 3b 0a  ITE,(void*)&b);.
277e0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
277f0 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
27800 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62 29   "%d %d", rc, b)
27810 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
27820 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
27830 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
27840 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
27850 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
27860 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76    file_control_v
27870 66 73 6e 61 6d 65 20 44 42 20 3f 41 55 58 44 42  fsname DB ?AUXDB
27880 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ?.**.** Return a
27890 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
278a0 63 72 69 62 65 73 20 74 68 65 20 73 74 61 63 6b  cribes the stack
278b0 20 6f 66 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74   of VFSes..*/.st
278c0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
278d0 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74  TCLAPI file_cont
278e0 72 6f 6c 5f 76 66 73 6e 61 6d 65 28 0a 20 20 43  rol_vfsname(.  C
278f0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
27900 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
27910 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
27920 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
27930 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
27940 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27950 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
27960 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
27970 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
27980 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
27990 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
279a0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
279b0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
279c0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
279d0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
279e0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
279f0 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
27a00 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d  ar *zDbName = "m
27a10 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a 56  ain";.  char *zV
27a20 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  fsName = 0;..  i
27a30 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
27a40 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
27a50 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
27a60 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
27a70 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
27a80 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
27a90 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
27aa0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
27ab0 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b  DB ?AUXDB?", 0);
27ac0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
27ad0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
27ae0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
27af0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
27b00 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
27b10 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
27b20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
27b30 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
27b40 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  .    zDbName = T
27b50 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
27b60 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  v[2]);.  }.  sql
27b70 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
27b80 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53  l(db, zDbName, S
27b90 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
27ba0 41 4d 45 2c 28 76 6f 69 64 2a 29 26 7a 56 66 73  AME,(void*)&zVfs
27bb0 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70  Name);.  Tcl_App
27bc0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
27bd0 2c 20 7a 56 66 73 4e 61 6d 65 2c 20 28 63 68 61  , zVfsName, (cha
27be0 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  r*)0);.  sqlite3
27bf0 5f 66 72 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b  _free(zVfsName);
27c00 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
27c10 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
27c20 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
27c30 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65  rol_tempfilename
27c40 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a   DB ?AUXDB?.**.*
27c50 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
27c60 67 20 74 68 61 74 20 69 73 20 61 20 74 65 6d 70  g that is a temp
27c70 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 0a 2a  orary filename.*
27c80 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
27c90 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c 65 5f  ITE_TCLAPI file_
27ca0 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69 6c 65  control_tempfile
27cb0 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74 44 61  name(.  ClientDa
27cc0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
27cd0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
27ce0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
27cf0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
27d00 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
27d10 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
27d20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
27d30 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
27d40 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
27d50 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
27d60 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
27d70 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
27d80 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
27d90 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
27da0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
27db0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
27dc0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
27dd0 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20  Name = "main";. 
27de0 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20 3d 20   char *zTName = 
27df0 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
27e00 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a  2 && objc!=3 ){.
27e10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
27e20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
27e30 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
27e40 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
27e50 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
27e60 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
27e70 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42   0), " DB ?AUXDB
27e80 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  ?", 0);.    retu
27e90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27ea0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
27eb0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
27ec0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
27ed0 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
27ee0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27ef0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
27f00 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e  c==3 ){.    zDbN
27f10 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
27f20 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
27f30 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  }.  sqlite3_file
27f40 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
27f50 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Name, SQLITE_FCN
27f60 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c  TL_TEMPFILENAME,
27f70 20 28 76 6f 69 64 2a 29 26 7a 54 4e 61 6d 65 29   (void*)&zTName)
27f80 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
27f90 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 54 4e  sult(interp, zTN
27fa0 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
27fb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
27fc0 54 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  TName);.  return
27fd0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f   TCL_OK;  .}.../
27fe0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73  *.** tclcmd:   s
27ff0 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 0a  qlite3_vfs_list.
28000 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e 20 61  **.**   Return a
28010 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74 61 69   tcl list contai
28020 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73 20 6f  ning the names o
28030 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72 65 64  f all registered
28040 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61 74 69   vfs's..*/.stati
28050 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
28060 41 50 49 20 76 66 73 5f 6c 69 73 74 28 0a 20 20  API vfs_list(.  
28070 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
28080 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
28090 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
280a0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
280b0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
280c0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
280d0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
280e0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
280f0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
28100 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
28110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28120 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
28130 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
28140 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
28150 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
28160 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
28170 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 54  3_vfs *pVfs;.  T
28180 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d 20 54  cl_Obj *pRet = T
28190 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 69  cl_NewObj();.  i
281a0 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20  f( objc!=1 ){.  
281b0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
281c0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
281d0 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74  jv, "");.    ret
281e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
281f0 20 7d 0a 20 20 66 6f 72 28 70 56 66 73 3d 73 71   }.  for(pVfs=sq
28200 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
28210 29 3b 20 70 56 66 73 3b 20 70 56 66 73 3d 70 56  ); pVfs; pVfs=pV
28220 66 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  fs->pNext){.    
28230 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
28240 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
28250 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
28260 72 69 6e 67 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e  ringObj(pVfs->zN
28270 61 6d 65 2c 20 2d 31 29 29 3b 0a 20 20 7d 0a 20  ame, -1));.  }. 
28280 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
28290 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
282a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
282b0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
282c0 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 6c  cmd:   sqlite3_l
282d0 69 6d 69 74 20 44 42 20 49 44 20 56 41 4c 55 45  imit DB ID VALUE
282e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
282f0 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
28300 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 69   sqlite3_limit i
28310 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
28320 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
28330 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
28340 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e same..*/.stati
28350 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
28360 41 50 49 20 74 65 73 74 5f 6c 69 6d 69 74 28 0a  API test_limit(.
28370 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
28380 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
28390 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
283a0 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
283b0 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
283c0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
283d0 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
283e0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
283f0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
28400 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
28410 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28420 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
28430 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
28440 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
28450 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
28460 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
28470 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
28480 63 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  c;.  static cons
28490 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
284a0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
284b0 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d 20 61 49    int id;.  } aI
284c0 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53  d[] = {.    { "S
284d0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
284e0 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TH",            
284f0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c    SQLITE_LIMIT_L
28500 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
28510 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
28520 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
28530 45 4e 47 54 48 22 2c 20 20 20 20 20 20 20 20 20  ENGTH",         
28540 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51   SQLITE_LIMIT_SQ
28550 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  L_LENGTH        
28560 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
28570 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
28580 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
28590 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
285a0 55 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20  UMN             
285b0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
285c0 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
285d0 50 54 48 22 2c 20 20 20 20 20 20 20 20 20 20 53  PTH",          S
285e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52  QLITE_LIMIT_EXPR
285f0 5f 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20  _DEPTH          
28600 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
28610 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
28620 5f 53 45 4c 45 43 54 22 2c 20 20 20 20 20 53 51  _SELECT",     SQ
28630 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
28640 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20  UND_SELECT      
28650 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
28660 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 22 2c  _LIMIT_VDBE_OP",
28670 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
28680 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
28690 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  P              }
286a0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
286b0 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41  LIMIT_FUNCTION_A
286c0 52 47 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  RG",        SQLI
286d0 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f  TE_LIMIT_FUNCTIO
286e0 4e 5f 41 52 47 20 20 20 20 20 20 20 20 20 7d 2c  N_ARG         },
286f0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
28700 49 4d 49 54 5f 41 54 54 41 43 48 45 44 22 2c 20  IMIT_ATTACHED", 
28710 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
28720 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44  E_LIMIT_ATTACHED
28730 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
28740 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
28750 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
28760 5f 4c 45 4e 47 54 48 22 2c 20 53 51 4c 49 54 45  _LENGTH", SQLITE
28770 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
28780 45 52 4e 5f 4c 45 4e 47 54 48 20 20 7d 2c 0a 20  ERN_LENGTH  },. 
28790 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
287a0 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
287b0 45 52 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f  ER",     SQLITE_
287c0 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
287d0 55 4d 42 45 52 20 20 20 20 20 20 7d 2c 0a 20 20  UMBER      },.  
287e0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
287f0 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 22  T_TRIGGER_DEPTH"
28800 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c  ,       SQLITE_L
28810 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
28820 54 48 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  TH        },.   
28830 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
28840 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 22  _WORKER_THREADS"
28850 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49  ,      SQLITE_LI
28860 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
28870 44 53 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  DS       },.    
28880 0a 20 20 20 20 2f 2a 20 4f 75 74 20 6f 66 20 72  .    /* Out of r
28890 61 6e 67 65 20 74 65 73 74 20 63 61 73 65 73 20  ange test cases 
288a0 2a 2f 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  */.    { "SQLITE
288b0 5f 4c 49 4d 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22  _LIMIT_TOOSMALL"
288c0 2c 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c  ,            -1,
288d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
288e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
288f0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
28900 4c 49 4d 49 54 5f 54 4f 4f 42 49 47 22 2c 20 20  LIMIT_TOOBIG",  
28910 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
28920 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
28930 54 48 52 45 41 44 53 2b 31 20 20 20 20 20 7d 2c  THREADS+1     },
28940 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 69  .  };.  int i, i
28950 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 76 61 6c  d = 0;.  int val
28960 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
28970 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  zId;..  if( objc
28980 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
28990 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
289a0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
289b0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
289c0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
289d0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
289e0 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42  bjv[0], 0), " DB
289f0 20 49 44 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a   ID VALUE", 0);.
28a00 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28a10 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
28a20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
28a30 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
28a40 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
28a50 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
28a60 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d 20 54 63  RROR;.  zId = Tc
28a70 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
28a80 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [2]);.  for(i=0;
28a90 20 69 3c 73 69 7a 65 6f 66 28 61 49 64 29 2f 73   i<sizeof(aId)/s
28aa0 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 3b 20 69  izeof(aId[0]); i
28ab0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72  ++){.    if( str
28ac0 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b 69 5d 2e  cmp(zId, aId[i].
28ad0 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  zName)==0 ){.   
28ae0 20 20 20 69 64 20 3d 20 61 49 64 5b 69 5d 2e 69     id = aId[i].i
28af0 64 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  d;.      break;.
28b00 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
28b10 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64 29 2f 73  i>=sizeof(aId)/s
28b20 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29 20 29 7b  izeof(aId[0]) ){
28b30 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
28b40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 75  esult(interp, "u
28b50 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20 74 79 70  nknown limit typ
28b60 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63 68 61 72  e: ", zId, (char
28b70 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
28b80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
28b90 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
28ba0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
28bb0 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29  objv[3], &val) )
28bc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
28bd0 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
28be0 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69 64 2c 20  3_limit(db, id, 
28bf0 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  val);.  Tcl_SetO
28c00 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
28c10 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
28c20 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  c));.  return TC
28c30 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
28c40 20 74 63 6c 63 6d 64 3a 20 20 73 61 76 65 5f 70   tclcmd:  save_p
28c50 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20  rng_state.**.** 
28c60 53 61 76 65 20 74 68 65 20 73 74 61 74 65 20 6f  Save the state o
28c70 66 20 74 68 65 20 70 73 65 75 64 6f 2d 72 61 6e  f the pseudo-ran
28c80 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65 6e 65 72  dom number gener
28c90 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74 68 65 20  ator..** At the 
28ca0 73 61 6d 65 20 74 69 6d 65 2c 20 76 65 72 69 66  same time, verif
28cb0 79 20 74 68 61 74 20 73 71 6c 69 74 65 33 5f 74  y that sqlite3_t
28cc0 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b  est_control work
28cd0 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a 2a 20 63  s even when.** c
28ce0 61 6c 6c 65 64 20 77 69 74 68 20 61 6e 20 6f 75  alled with an ou
28cf0 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70 63 6f 64  t-of-range opcod
28d00 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
28d10 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73   SQLITE_TCLAPI s
28d20 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ave_prng_state(.
28d30 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
28d40 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
28d50 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
28d60 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
28d70 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
28d80 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
28d90 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
28da0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
28db0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
28dc0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
28dd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28de0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
28df0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
28e00 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
28e10 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
28e20 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  nts */.){.  int 
28e30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
28e40 74 5f 63 6f 6e 74 72 6f 6c 28 39 39 39 39 29 3b  t_control(9999);
28e50 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
28e60 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
28e70 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
28e80 2d 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  -1);.  assert( r
28e90 63 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  c==0 );.  sqlite
28ea0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
28eb0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
28ec0 52 4e 47 5f 53 41 56 45 29 3b 0a 20 20 72 65 74  RNG_SAVE);.  ret
28ed0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
28ee0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65 73  .** tclcmd:  res
28ef0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a  tore_prng_state.
28f00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
28f10 4c 49 54 45 5f 54 43 4c 41 50 49 20 72 65 73 74  LITE_TCLAPI rest
28f20 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a  ore_prng_state(.
28f30 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
28f40 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
28f50 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
28f60 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
28f70 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
28f80 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
28f90 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
28fa0 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
28fb0 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
28fc0 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
28fe0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
28ff0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
29000 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
29010 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
29020 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  nts */.){.  sqli
29030 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
29040 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
29050 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 29 3b 0a  _PRNG_RESTORE);.
29060 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
29070 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
29080 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74 61    reset_prng_sta
29090 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  te.*/.static int
290a0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 72   SQLITE_TCLAPI r
290b0 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 28  eset_prng_state(
290c0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
290d0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
290e0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
290f0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
29100 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
29110 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
29120 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
29130 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
29140 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
29150 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
29160 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29170 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
29180 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
29190 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
291a0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
291b0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
291c0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
291d0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
291e0 4c 5f 50 52 4e 47 5f 52 45 53 45 54 29 3b 0a 20  L_PRNG_RESET);. 
291f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
29200 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
29210 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62    database_may_b
29220 65 5f 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20  e_corrupt.**.** 
29230 49 6e 64 69 63 61 74 65 20 74 68 61 74 20 64 61  Indicate that da
29240 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67  tabase files mig
29250 68 74 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  ht be corrupt.  
29260 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
29270 73 65 74 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a  set the normal.*
29280 2a 20 73 74 61 74 65 20 6f 66 20 6f 70 65 72 61  * state of opera
29290 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
292a0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
292b0 49 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62  I database_may_b
292c0 65 5f 63 6f 72 72 75 70 74 28 0a 20 20 43 6c 69  e_corrupt(.  Cli
292d0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
292e0 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
292f0 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
29300 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
29310 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
29320 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
29330 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
29340 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
29350 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
29360 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
29370 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29380 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
29390 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
293a0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
293b0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
293c0 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74  /.){.  sqlite3_t
293d0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
293e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
293f0 52 5f 43 4f 52 52 55 50 54 2c 20 30 29 3b 0a 20  R_CORRUPT, 0);. 
29400 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
29410 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  }./*.** tclcmd: 
29420 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f   database_never_
29430 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e  corrupt.**.** In
29440 64 69 63 61 74 65 20 74 68 61 74 20 64 61 74 61  dicate that data
29450 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 61  base files are a
29460 6c 77 61 79 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  lways well-forme
29470 64 2e 20 20 54 68 69 73 20 65 6e 61 62 6c 65 73  d.  This enables
29480 20 65 78 74 72 61 20 61 73 73 65 72 74 28 29 0a   extra assert().
29490 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ** statements th
294a0 61 74 20 74 65 73 74 20 63 6f 6e 64 69 74 69 6f  at test conditio
294b0 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 77 61  ns that are alwa
294c0 79 73 20 74 72 75 65 20 66 6f 72 20 77 65 6c 6c  ys true for well
294d0 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
294e0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
294f0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64   SQLITE_TCLAPI d
29500 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f  atabase_never_co
29510 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44  rrupt(.  ClientD
29520 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
29530 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
29540 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
29550 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
29560 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
29570 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
29580 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
29590 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
295a0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
295b0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
295c0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
295d0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
295e0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
295f0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
29600 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
29610 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
29620 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
29630 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
29640 52 52 55 50 54 2c 20 31 29 3b 0a 20 20 72 65 74  RRUPT, 1);.  ret
29650 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
29660 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63  *.** tclcmd:  pc
29670 61 63 68 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74  ache_stats.*/.st
29680 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
29690 54 43 4c 41 50 49 20 74 65 73 74 5f 70 63 61 63  TCLAPI test_pcac
296a0 68 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69 65  he_stats(.  Clie
296b0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
296c0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
296d0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
296e0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
296f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29700 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
29710 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
29720 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
29730 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
29740 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
29750 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29760 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
29770 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
29780 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
29790 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
297a0 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a  .){.  int nMin;.
297b0 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e    int nMax;.  in
297c0 74 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e  t nCurrent;.  in
297d0 74 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20  t nRecyclable;. 
297e0 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
297f0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
29800 53 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74 2c  Stats(&nCurrent,
29810 20 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26   &nMax, &nMin, &
29820 6e 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20  nRecyclable);.. 
29830 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f   pRet = Tcl_NewO
29840 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  bj();.  Tcl_List
29850 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
29860 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
29870 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
29880 22 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b  "current", -1));
29890 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
298a0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
298b0 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
298c0 77 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74  wIntObj(nCurrent
298d0 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
298e0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
298f0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
29900 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d  _NewStringObj("m
29910 61 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ax", -1));.  Tcl
29920 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
29930 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52  ement(interp, pR
29940 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
29950 6a 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f  j(nMax));.  Tcl_
29960 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
29970 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
29980 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
29990 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b  Obj("min", -1));
299a0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
299b0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
299c0 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  rp, pRet, Tcl_Ne
299d0 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a  wIntObj(nMin));.
299e0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
299f0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
29a00 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
29a10 53 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79 63  StringObj("recyc
29a20 6c 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20  lable", -1));.  
29a30 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
29a40 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
29a50 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
29a60 74 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65  tObj(nRecyclable
29a70 29 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ));..  Tcl_SetOb
29a80 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
29a90 70 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pRet);..  return
29aa0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64   TCL_OK;.}..#ifd
29ab0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
29ac0 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
29ad0 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
29ae0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62  unlock_notify_cb
29af0 28 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e  (void **aArg, in
29b00 74 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69  t nArg){.  int i
29b10 69 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  i;.  for(ii=0; i
29b20 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20  i<nArg; ii++){. 
29b30 20 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28 54     Tcl_EvalEx((T
29b40 63 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72 67  cl_Interp *)aArg
29b50 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f  [ii], "unlock_no
29b60 74 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45  tify", -1, TCL_E
29b70 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d  VAL_GLOBAL);.  }
29b80 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
29b90 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43  ITE_ENABLE_UNLOC
29ba0 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a  K_NOTIFY */../*.
29bb0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
29bc0 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  te3_unlock_notif
29bd0 79 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53  y db.*/.#ifdef S
29be0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
29bf0 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69  OCK_NOTIFY.stati
29c00 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
29c10 41 50 49 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f  API test_unlock_
29c20 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69 65 6e 74  notify(.  Client
29c30 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
29c40 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
29c50 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
29c60 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
29c70 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
29c80 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
29c90 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
29ca0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
29cb0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
29cc0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
29cd0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
29ce0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
29cf0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
29d00 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
29d10 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
29d20 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
29d30 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
29d40 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
29d50 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65  v, "DB");.    re
29d60 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
29d70 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62    }..  if( getDb
29d80 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
29d90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
29da0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
29db0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29dc0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
29dd0 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f   sqlite3_unlock_
29de0 6e 6f 74 69 66 79 28 64 62 2c 20 74 65 73 74 5f  notify(db, test_
29df0 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62  unlock_notify_cb
29e00 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72 70  , (void *)interp
29e10 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
29e20 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
29e30 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
29e40 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
29e50 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
29e60 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
29e70 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
29e80 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
29e90 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73  t db ?NAME?.*/.s
29ea0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
29eb0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 77 61 6c  _TCLAPI test_wal
29ec0 5f 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43  _checkpoint(.  C
29ed0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
29ee0 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20  Data, /* Unused 
29ef0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
29f00 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
29f10 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
29f20 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
29f30 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
29f40 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
29f50 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
29f60 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
29f70 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
29f80 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
29f90 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
29fa0 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
29fb0 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  Db = 0;.  sqlite
29fc0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
29fd0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
29fe0 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  && objc!=2 ){.  
29ff0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2a000 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2a010 6a 76 2c 20 22 44 42 20 3f 4e 41 4d 45 3f 22 29  jv, "DB ?NAME?")
2a020 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2a030 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
2a040 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2a050 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2a060 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2a070 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
2a080 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a090 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20  }.  if( objc==3 
2a0a0 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c  ){.    zDb = Tcl
2a0b0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2a0c0 32 5d 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  2]);.  }.  rc = 
2a0d0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
2a0e0 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b  kpoint(db, zDb);
2a0f0 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
2a100 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
2a110 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
2a120 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
2a130 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2a140 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
2a150 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
2a160 65 63 6b 70 6f 69 6e 74 5f 76 32 20 64 62 20 4d  eckpoint_v2 db M
2a170 4f 44 45 20 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a  ODE ?NAME?.**.**
2a180 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 63 61   This command ca
2a190 6c 6c 73 20 74 68 65 20 77 61 6c 5f 63 68 65 63  lls the wal_chec
2a1a0 6b 70 6f 69 6e 74 5f 76 32 28 29 20 66 75 6e 63  kpoint_v2() func
2a1b0 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 73 70  tion with the sp
2a1c0 65 63 69 66 69 65 64 0a 2a 2a 20 6d 6f 64 65 20  ecified.** mode 
2a1d0 61 72 67 75 6d 65 6e 74 20 28 70 61 73 73 69 76  argument (passiv
2a1e0 65 2c 20 66 75 6c 6c 20 6f 72 20 72 65 73 74 61  e, full or resta
2a1f0 72 74 29 2e 20 49 66 20 70 72 65 73 65 6e 74 2c  rt). If present,
2a200 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6e 61   the database na
2a210 6d 65 0a 2a 2a 20 4e 41 4d 45 20 69 73 20 70 61  me.** NAME is pa
2a220 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63 6f  ssed as the seco
2a230 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 77  nd argument to w
2a240 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
2a250 28 29 2e 20 49 66 20 69 74 20 74 68 65 0a 2a 2a  (). If it the.**
2a260 20 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20 69   NAME argument i
2a270 73 20 6e 6f 74 20 70 72 65 73 65 6e 74 2c 20 61  s not present, a
2a280 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 69 73   NULL pointer is
2a290 20 70 61 73 73 65 64 20 69 6e 73 74 65 61 64 2e   passed instead.
2a2a0 0a 2a 2a 0a 2a 2a 20 49 66 20 77 61 6c 5f 63 68  .**.** If wal_ch
2a2b0 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 72 65  eckpoint_v2() re
2a2c0 74 75 72 6e 73 20 61 6e 79 20 76 61 6c 75 65 20  turns any value 
2a2d0 6f 74 68 65 72 20 74 68 61 6e 20 53 51 4c 49 54  other than SQLIT
2a2e0 45 5f 42 55 53 59 20 6f 72 0a 2a 2a 20 53 51 4c  E_BUSY or.** SQL
2a2f0 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20 74 68 69  ITE_OK, then thi
2a300 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e  s command return
2a310 73 20 54 43 4c 5f 45 52 52 4f 52 2e 20 54 68 65  s TCL_ERROR. The
2a320 20 54 63 6c 20 72 65 73 75 6c 74 20 69 73 20 73   Tcl result is s
2a330 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20 65 72 72  et.** to the err
2a340 6f 72 20 6d 65 73 73 61 67 65 20 6f 62 74 61 69  or message obtai
2a350 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2a360 5f 65 72 72 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a  _errmsg()..**.**
2a370 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 69 73   Otherwise, this
2a380 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73   command returns
2a390 20 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65   a list of three
2a3a0 20 69 6e 74 65 67 65 72 73 2e 20 54 68 65 20 66   integers. The f
2a3b0 69 72 73 74 20 69 6e 74 65 67 65 72 0a 2a 2a 20  irst integer.** 
2a3c0 69 73 20 31 20 69 66 20 53 51 4c 49 54 45 5f 42  is 1 if SQLITE_B
2a3d0 55 53 59 20 77 61 73 20 72 65 74 75 72 6e 65 64  USY was returned
2a3e0 2c 20 6f 72 20 30 20 6f 74 68 65 72 77 69 73 65  , or 0 otherwise
2a3f0 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  . The following 
2a400 74 77 6f 20 69 6e 74 65 67 65 72 73 0a 2a 2a 20  two integers.** 
2a410 61 72 65 20 74 68 65 20 76 61 6c 75 65 73 20 72  are the values r
2a420 65 74 75 72 6e 65 64 20 76 69 61 20 74 68 65 20  eturned via the 
2a430 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
2a440 73 20 62 79 20 77 61 6c 5f 63 68 65 63 6b 70 6f  s by wal_checkpo
2a450 69 6e 74 5f 76 32 28 29 20 2d 0a 2a 2a 20 74 68  int_v2() -.** th
2a460 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
2a470 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 61 6e  es in the log an
2a480 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
2a490 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
2a4a0 67 0a 2a 2a 20 74 68 61 74 20 68 61 76 65 20 62  g.** that have b
2a4b0 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  een checkpointed
2a4c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a4d0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2a4e0 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  st_wal_checkpoin
2a4f0 74 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61  t_v2(.  ClientDa
2a500 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2a510 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63  * Unused */.  Tc
2a520 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2a530 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2a540 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2a550 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2a560 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2a570 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2a580 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2a590 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2a5a0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2a5b0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2a5c0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2a5d0 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
2a5e0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2a5f0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 6e 74    int rc;..  int
2a600 20 65 4d 6f 64 65 3b 0a 20 20 69 6e 74 20 6e 4c   eMode;.  int nL
2a610 6f 67 20 3d 20 2d 35 35 35 3b 0a 20 20 69 6e 74  og = -555;.  int
2a620 20 6e 43 6b 70 74 20 3d 20 2d 35 35 35 3b 0a 20   nCkpt = -555;. 
2a630 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a   Tcl_Obj *pRet;.
2a640 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 20  .  const char * 
2a650 61 4d 6f 64 65 5b 5d 20 3d 20 7b 20 22 70 61 73  aMode[] = { "pas
2a660 73 69 76 65 22 2c 20 22 66 75 6c 6c 22 2c 20 22  sive", "full", "
2a670 72 65 73 74 61 72 74 22 2c 20 22 74 72 75 6e 63  restart", "trunc
2a680 61 74 65 22 2c 20 30 20 7d 3b 0a 20 20 61 73 73  ate", 0 };.  ass
2a690 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
2a6a0 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d  KPOINT_PASSIVE==
2a6b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  0 );.  assert( S
2a6c0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
2a6d0 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73  _FULL==1 );.  as
2a6e0 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
2a6f0 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d  CKPOINT_RESTART=
2a700 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
2a710 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
2a720 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b  T_TRUNCATE==3 );
2a730 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
2a740 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  && objc!=4 ){.  
2a750 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2a760 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2a770 6a 76 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41  jv, "DB MODE ?NA
2a780 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ME?");.    retur
2a790 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a7a0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20  ..  if( objc==4 
2a7b0 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c  ){.    zDb = Tcl
2a7c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2a7d0 33 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  3]);.  }.  if( g
2a7e0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2a7f0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2a800 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2a810 20 7c 7c 20 28 0a 20 20 20 20 20 20 54 43 4c 5f   || (.      TCL_
2a820 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72  OK!=Tcl_GetIntFr
2a830 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d  omObj(0, objv[2]
2a840 2c 20 26 65 4d 6f 64 65 29 0a 20 20 20 26 26 20  , &eMode).   && 
2a850 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
2a860 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
2a870 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f  rp, objv[2], aMo
2a880 64 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26  de, "mode", 0, &
2a890 65 4d 6f 64 65 29 20 0a 20 20 29 29 7b 0a 20 20  eMode) .  )){.  
2a8a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a8b0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OR;.  }..  rc = 
2a8c0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
2a8d0 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44  kpoint_v2(db, zD
2a8e0 62 2c 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c  b, eMode, &nLog,
2a8f0 20 26 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28 20   &nCkpt);.  if( 
2a900 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc!=SQLITE_OK &&
2a910 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc!=SQLITE_BUSY
2a920 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
2a930 61 72 20 2a 7a 45 72 72 43 6f 64 65 20 3d 20 73  ar *zErrCode = s
2a940 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
2a950 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  );.    Tcl_Reset
2a960 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2a970 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2a980 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
2a990 72 43 6f 64 65 2c 20 22 20 2d 20 22 2c 20 28 63  rCode, " - ", (c
2a9a0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65 72  har *)sqlite3_er
2a9b0 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
2a9c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2a9d0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20  OR;.  }..  pRet 
2a9e0 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
2a9f0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2aa00 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2aa10 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
2aa20 49 6e 74 4f 62 6a 28 72 63 3d 3d 53 51 4c 49 54  IntObj(rc==SQLIT
2aa30 45 5f 42 55 53 59 3f 31 3a 30 29 29 3b 0a 20 20  E_BUSY?1:0));.  
2aa40 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
2aa50 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2aa60 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e   pRet, Tcl_NewIn
2aa70 74 4f 62 6a 28 6e 4c 6f 67 29 29 3b 0a 20 20 54  tObj(nLog));.  T
2aa80 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2aa90 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2aaa0 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
2aab0 4f 62 6a 28 6e 43 6b 70 74 29 29 3b 0a 20 20 54  Obj(nCkpt));.  T
2aac0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2aad0 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a  interp, pRet);..
2aae0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2aaf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
2ab00 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  :  sqlite3_wal_a
2ab10 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  utocheckpoint db
2ab20 20 56 41 4c 55 45 0a 2a 2f 0a 73 74 61 74 69 63   VALUE.*/.static
2ab30 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2ab40 50 49 20 74 65 73 74 5f 77 61 6c 5f 61 75 74 6f  PI test_wal_auto
2ab50 63 68 65 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c  checkpoint(.  Cl
2ab60 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2ab70 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
2ab80 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
2ab90 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2aba0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2abb0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2abc0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2abd0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
2abe0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2abf0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2ac00 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
2ac10 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
2ac20 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2ac30 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2ac40 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
2ac50 20 69 6e 74 20 69 56 61 6c 3b 0a 0a 0a 20 20 69   int iVal;...  i
2ac60 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
2ac70 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2ac80 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2ac90 6a 76 2c 20 22 44 42 20 56 41 4c 55 45 22 29 3b  jv, "DB VALUE");
2aca0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2acb0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
2acc0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2acd0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2ace0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2acf0 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47  db) .   || Tcl_G
2ad00 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 30 2c 20  etIntFromObj(0, 
2ad10 6f 62 6a 76 5b 32 5d 2c 20 26 69 56 61 6c 29 0a  objv[2], &iVal).
2ad20 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
2ad30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
2ad40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77    rc = sqlite3_w
2ad50 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
2ad60 74 28 64 62 2c 20 69 56 61 6c 29 3b 0a 20 20 54  t(db, iVal);.  T
2ad70 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
2ad80 6e 74 65 72 70 29 3b 0a 20 20 69 66 28 20 72 63  nterp);.  if( rc
2ad90 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2ada0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2adb0 45 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74 65  ErrCode = sqlite
2adc0 33 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20 20  3ErrName(rc);.  
2add0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2ade0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2adf0 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 72 72  ewStringObj(zErr
2ae00 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Code, -1));.    
2ae10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2ae20 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
2ae30 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
2ae40 2a 20 74 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f  * tclcmd:  test_
2ae50 73 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52  sqlite3_log ?SCR
2ae60 49 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73  IPT?.*/.static s
2ae70 74 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63  truct LogCallbac
2ae80 6b 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  k {.  Tcl_Interp
2ae90 20 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c   *pInterp;.  Tcl
2aea0 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f  _Obj *pObj;.} lo
2aeb0 67 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20  gcallback = {0, 
2aec0 30 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  0};.static void 
2aed0 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69  xLogcallback(voi
2aee0 64 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20 65  d *unused, int e
2aef0 72 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b  rr, char *zMsg){
2af00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77  .  Tcl_Obj *pNew
2af10 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65   = Tcl_Duplicate
2af20 4f 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  Obj(logcallback.
2af30 70 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  pObj);.  Tcl_Inc
2af40 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b  rRefCount(pNew);
2af50 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
2af60 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20  pendElement(.   
2af70 20 20 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f     0, pNew, Tcl_
2af80 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c  NewStringObj(sql
2af90 69 74 65 33 45 72 72 4e 61 6d 65 28 65 72 72 29  ite3ErrName(err)
2afa0 2c 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c  , -1).  );.  Tcl
2afb0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
2afc0 65 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54  ement(0, pNew, T
2afd0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2afe0 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63  zMsg, -1));.  Tc
2aff0 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63  l_EvalObjEx(logc
2b000 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c  allback.pInterp,
2b010 20 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f   pNew, TCL_EVAL_
2b020 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f  GLOBAL|TCL_EVAL_
2b030 44 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44  DIRECT);.  Tcl_D
2b040 65 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77  ecrRefCount(pNew
2b050 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20  );.}.static int 
2b060 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2b070 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 28 0a  st_sqlite3_log(.
2b080 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
2b090 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
2b0a0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2b0b0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2b0c0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2b0d0 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2b0e0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2b0f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2b100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2b110 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2b120 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2b130 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2b140 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
2b150 66 28 20 6f 62 6a 63 3e 32 20 29 7b 0a 20 20 20  f( objc>2 ){.   
2b160 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2b170 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2b180 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20 20  v, "SCRIPT");.  
2b190 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b1a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 6f  OR;.  }.  if( lo
2b1b0 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 29  gcallback.pObj )
2b1c0 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  {.    Tcl_DecrRe
2b1d0 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61  fCount(logcallba
2b1e0 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f  ck.pObj);.    lo
2b1f0 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d  gcallback.pObj =
2b200 20 30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62   0;.    logcallb
2b210 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 30 3b  ack.pInterp = 0;
2b220 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .    sqlite3_con
2b230 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
2b240 47 5f 4c 4f 47 2c 20 28 76 6f 69 64 2a 29 30 2c  G_LOG, (void*)0,
2b250 20 28 76 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a   (void*)0);.  }.
2b260 20 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a    if( objc>1 ){.
2b270 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e      logcallback.
2b280 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a  pObj = objv[1];.
2b290 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
2b2a0 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b  ount(logcallback
2b2b0 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63  .pObj);.    logc
2b2c0 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 20  allback.pInterp 
2b2d0 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 73 71  = interp;.    sq
2b2e0 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c  lite3_config(SQL
2b2f0 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20  ITE_CONFIG_LOG, 
2b300 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 2c 20 28 76  xLogcallback, (v
2b310 6f 69 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 72  oid*)0);.  }.  r
2b320 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2b330 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74 63 6c 5f 6f  ./*.**     tcl_o
2b340 62 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41  bjproc COMMANDNA
2b350 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a  ME ARGS....**.**
2b360 20 52 75 6e 20 61 20 54 43 4c 20 63 6f 6d 6d 61   Run a TCL comma
2b370 6e 64 20 75 73 69 6e 67 20 69 74 73 20 6f 62 6a  nd using its obj
2b380 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e 20  Proc interface. 
2b390 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72 20   Throw an error 
2b3a0 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61 6e  if.** the comman
2b3b0 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63  d has no objProc
2b3c0 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
2b3d0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2b3e0 5f 54 43 4c 41 50 49 20 72 75 6e 41 73 4f 62 6a  _TCLAPI runAsObj
2b3f0 50 72 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63  Proc(.  void * c
2b400 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
2b410 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2b420 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
2b430 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2b440 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  jv[].){.  Tcl_Cm
2b450 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
2b460 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20   if( objc<2 ){. 
2b470 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2b480 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2b490 62 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e  bjv, "COMMAND ..
2b4a0 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
2b4b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2b4c0 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d   if( !Tcl_GetCom
2b4d0 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
2b4e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2b4f0 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66  bjv[1]), &cmdInf
2b500 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  o) ){.    Tcl_Ap
2b510 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2b520 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20  p, "command not 
2b530 66 6f 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20  found: ",.      
2b540 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
2b550 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68  ng(objv[1]), (ch
2b560 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2b570 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2b580 7d 0a 20 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e  }.  if( cmdInfo.
2b590 6f 62 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20  objProc==0 ){.  
2b5a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2b5b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d  lt(interp, "comm
2b5c0 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72  and has no objPr
2b5d0 6f 63 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  oc: ",.         
2b5e0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
2b5f0 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
2b600 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
2b610 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2b620 20 72 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e   return cmdInfo.
2b630 6f 62 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e  objProc(cmdInfo.
2b640 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20 69  objClientData, i
2b650 6e 74 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f  nterp, objc-1, o
2b660 62 6a 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64  bjv+1);.}..#ifnd
2b670 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
2b680 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52  XPLAIN./*.** WAR
2b690 4e 49 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77  NING: The follow
2b6a0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72  ing function, pr
2b6b0 69 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50  intExplainQueryP
2b6c0 6c 61 6e 28 29 20 69 73 20 61 6e 20 65 78 61 63  lan() is an exac
2b6d0 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78 61  t.** copy of exa
2b6e0 6d 70 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20 65  mple code from e
2b6f0 71 70 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29  qp.in (eqp.html)
2b700 2e 20 49 66 20 74 68 69 73 20 63 6f 64 65 20 69  . If this code i
2b710 73 20 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74  s modified,.** t
2b720 68 65 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74  hen the document
2b730 61 74 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73  ation copy needs
2b740 20 74 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20   to be modified 
2b750 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a  as well..*/./*.*
2b760 2a 20 41 72 67 75 6d 65 6e 74 20 70 53 74 6d 74  * Argument pStmt
2b770 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20 53   is a prepared S
2b780 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  QL statement. Th
2b790 69 73 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70  is function comp
2b7a0 69 6c 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41  iles.** an EXPLA
2b7b0 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
2b7c0 6d 6d 61 6e 64 20 74 6f 20 72 65 70 6f 72 74 20  mmand to report 
2b7d0 6f 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  on the prepared 
2b7e0 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e  statement,.** an
2b7f0 64 20 70 72 69 6e 74 73 20 74 68 65 20 72 65 70  d prints the rep
2b800 6f 72 74 20 74 6f 20 73 74 64 6f 75 74 20 75 73  ort to stdout us
2b810 69 6e 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f  ing printf()..*/
2b820 0a 69 6e 74 20 70 72 69 6e 74 45 78 70 6c 61 69  .int printExplai
2b830 6e 51 75 65 72 79 50 6c 61 6e 28 73 71 6c 69 74  nQueryPlan(sqlit
2b840 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b  e3_stmt *pStmt){
2b850 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2b860 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sql;            
2b870 20 20 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20     /* Input SQL 
2b880 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 6c  */.  char *zExpl
2b890 61 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  ain;            
2b8a0 20 20 20 20 20 2f 2a 20 53 51 4c 20 77 69 74 68       /* SQL with
2b8b0 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
2b8c0 4c 41 4e 20 70 72 65 70 65 6e 64 65 64 20 2a 2f  LAN prepended */
2b8d0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
2b8e0 2a 70 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20  *pExplain;      
2b8f0 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45     /* Compiled E
2b900 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
2b910 4e 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  N command */.  i
2b920 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2b940 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72  * Return code fr
2b950 6f 6d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  om sqlite3_prepa
2b960 72 65 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53  re_v2() */..  zS
2b970 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c  ql = sqlite3_sql
2b980 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a  (pStmt);.  if( z
2b990 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
2b9a0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20  SQLITE_ERROR;.. 
2b9b0 20 7a 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69   zExplain = sqli
2b9c0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50  te3_mprintf("EXP
2b9d0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
2b9e0 25 73 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66  %s", zSql);.  if
2b9f0 28 20 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20  ( zExplain==0 ) 
2ba00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
2ba10 4d 45 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  MEM;..  rc = sql
2ba20 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2ba30 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
2ba40 65 28 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61  e(pStmt), zExpla
2ba50 69 6e 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69  in, -1, &pExplai
2ba60 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  n, 0);.  sqlite3
2ba70 5f 66 72 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b  _free(zExplain);
2ba80 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2ba90 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
2baa0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49  ;..  while( SQLI
2bab0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2bac0 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29  step(pExplain) )
2bad0 7b 0a 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63  {.    int iSelec
2bae0 74 69 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tid = sqlite3_co
2baf0 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
2bb00 6e 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 69  n, 0);.    int i
2bb10 4f 72 64 65 72 20 3d 20 73 71 6c 69 74 65 33 5f  Order = sqlite3_
2bb20 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
2bb30 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74  ain, 1);.    int
2bb40 20 69 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33   iFrom = sqlite3
2bb50 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
2bb60 6c 61 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f  lain, 2);.    co
2bb70 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 74 61 69  nst char *zDetai
2bb80 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20  l = (const char 
2bb90 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2bba0 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20  _text(pExplain, 
2bbb0 33 29 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66 28  3);..    printf(
2bbc0 22 25 64 20 25 64 20 25 64 20 25 73 5c 6e 22 2c  "%d %d %d %s\n",
2bbd0 20 69 53 65 6c 65 63 74 69 64 2c 20 69 4f 72 64   iSelectid, iOrd
2bbe0 65 72 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61  er, iFrom, zDeta
2bbf0 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  il);.  }..  retu
2bc00 72 6e 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  rn sqlite3_final
2bc10 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d  ize(pExplain);.}
2bc20 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  ..static int SQL
2bc30 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
2bc40 70 72 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69  print_eqp(.  voi
2bc50 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
2bc60 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2bc70 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2bc80 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2bc90 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
2bca0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
2bcb0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
2bcc0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
2bcd0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2bce0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2bcf0 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
2bd00 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2bd10 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2bd20 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
2bd30 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2bd40 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
2bd50 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
2bd60 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
2bd70 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
2bd80 72 79 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20  ryPlan(pStmt);. 
2bd90 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64   /* This is need
2bda0 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f  ed on Windows so
2bdb0 20 74 68 61 74 20 61 20 74 65 73 74 20 63 61 73   that a test cas
2bdc0 65 20 75 73 69 6e 67 20 74 68 69 73 20 0a 20 20  e using this .  
2bdd0 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ** function can 
2bde0 6f 70 65 6e 20 61 20 72 65 61 64 20 70 69 70 65  open a read pipe
2bdf0 20 61 6e 64 20 67 65 74 20 74 68 65 20 6f 75 74   and get the out
2be00 70 75 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e  put of.  ** prin
2be10 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
2be20 6e 28 29 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  n() immediately.
2be30 0a 20 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73  .  */.  fflush(s
2be40 74 64 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65  tdout);.  Tcl_Se
2be50 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
2be60 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
2be70 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
2be80 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2be90 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
2bea0 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
2beb0 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ../*.** sqlite3_
2bec0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52  test_control VER
2bed0 42 20 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61  B ARGS....*/.sta
2bee0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2bef0 43 4c 41 50 49 20 74 65 73 74 5f 74 65 73 74 5f  CLAPI test_test_
2bf00 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69 64 20  control(.  void 
2bf10 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2bf20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2bf30 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2bf40 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2bf50 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 72   objv[].){.  str
2bf60 75 63 74 20 56 65 72 62 20 7b 0a 20 20 20 20 63  uct Verb {.    c
2bf70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2bf80 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 7d  ;.    int i;.  }
2bf90 20 61 56 65 72 62 5b 5d 20 3d 20 7b 0a 20 20 20   aVerb[] = {.   
2bfa0 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43   { "SQLITE_TESTC
2bfb0 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
2bfc0 55 4c 54 22 2c 20 53 51 4c 49 54 45 5f 54 45 53  ULT", SQLITE_TES
2bfd0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
2bfe0 46 41 55 4c 54 20 7d 2c 20 0a 20 20 20 20 7b 20  FAULT }, .    { 
2bff0 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  "SQLITE_TESTCTRL
2c000 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 22 2c 20 20  _SORTER_MMAP",  
2c010 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
2c020 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 20 20  RL_SORTER_MMAP  
2c030 20 20 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51     }, .    { "SQ
2c040 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
2c050 50 4f 53 54 45 52 22 2c 20 20 20 20 20 20 20 20  POSTER",        
2c060 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2c070 49 4d 50 4f 53 54 45 52 20 20 20 20 20 20 20 20  IMPOSTER        
2c080 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 56  },.  };.  int iV
2c090 65 72 62 3b 0a 20 20 69 6e 74 20 69 46 6c 61 67  erb;.  int iFlag
2c0a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
2c0b0 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
2c0c0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2c0d0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2c0e0 76 2c 20 22 56 45 52 42 20 41 52 47 53 2e 2e 2e  v, "VERB ARGS...
2c0f0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2c100 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
2c110 20 72 63 20 3d 20 54 63 6c 5f 47 65 74 49 6e 64   rc = Tcl_GetInd
2c120 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28  exFromObjStruct(
2c130 0a 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 6f  .      interp, o
2c140 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62 2c 20 73  bjv[1], aVerb, s
2c150 69 7a 65 6f 66 28 61 56 65 72 62 5b 30 5d 29 2c  izeof(aVerb[0]),
2c160 20 22 56 45 52 42 22 2c 20 30 2c 20 26 69 56 65   "VERB", 0, &iVe
2c170 72 62 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63  rb.  );.  if( rc
2c180 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72  !=TCL_OK ) retur
2c190 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61 67 20 3d  n rc;..  iFlag =
2c1a0 20 61 56 65 72 62 5b 69 56 65 72 62 5d 2e 69 3b   aVerb[iVerb].i;
2c1b0 0a 20 20 73 77 69 74 63 68 28 20 69 46 6c 61 67  .  switch( iFlag
2c1c0 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
2c1d0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
2c1e0 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
2c1f0 20 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20        int val;. 
2c200 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21 3d 33       if( objc!=3
2c210 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63 6c 5f   ){.        Tcl_
2c220 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2c230 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20 22 4f  erp, 2, objv, "O
2c240 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20 20 20 20  NOFF");.        
2c250 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2c260 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c270 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
2c280 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
2c290 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
2c2a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2c2b0 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ROR;.      sqlit
2c2c0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2c2d0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2c2e0 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c  LOCALTIME_FAULT,
2c2f0 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72 65   val);.      bre
2c300 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
2c310 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
2c320 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a  TRL_SORTER_MMAP:
2c330 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c   {.      int val
2c340 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  ;.      sqlite3 
2c350 2a 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  *db;.      if( o
2c360 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 20 20  bjc!=4 ){.      
2c370 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2c380 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62  gs(interp, 2, ob
2c390 6a 76 2c 20 22 44 42 20 4c 49 4d 49 54 22 29 3b  jv, "DB LIMIT");
2c3a0 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
2c3b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
2c3c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 65 74   }.      if( get
2c3d0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2c3e0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2c3f0 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62 29 20 29  objv[2]), &db) )
2c400 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c410 52 3b 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c  R;.      if( Tcl
2c420 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
2c430 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
2c440 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &val) ) return T
2c450 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  CL_ERROR;.      
2c460 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
2c470 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
2c480 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
2c490 2c 20 64 62 2c 20 76 61 6c 29 3b 0a 20 20 20 20  , db, val);.    
2c4a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
2c4b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2c4c0 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
2c4d0 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6f  R: {.      int o
2c4e0 6e 4f 66 66 2c 20 74 6e 75 6d 3b 0a 20 20 20 20  nOff, tnum;.    
2c4f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2c500 62 4e 61 6d 65 3b 0a 20 20 20 20 20 20 73 71 6c  bName;.      sql
2c510 69 74 65 33 20 2a 64 62 3b 0a 20 20 20 20 20 20  ite3 *db;.      
2c520 69 66 28 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20  if( objc!=6 ){. 
2c530 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67         Tcl_Wrong
2c540 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2c550 32 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62 4e  2, objv, "DB dbN
2c560 61 6d 65 20 6f 6e 4f 66 66 20 74 6e 75 6d 22 29  ame onOff tnum")
2c570 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2c580 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
2c590 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 67 65    }.      if( ge
2c5a0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2c5b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2c5c0 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62 29 20  (objv[2]), &db) 
2c5d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2c5e0 4f 52 3b 0a 20 20 20 20 20 20 7a 44 62 4e 61 6d  OR;.      zDbNam
2c5f0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
2c600 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 20 20  g(objv[3]);.    
2c610 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2c620 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2c630 6f 62 6a 76 5b 34 5d 2c 20 26 6f 6e 4f 66 66 29  objv[4], &onOff)
2c640 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2c650 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20 54  ROR;.      if( T
2c660 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
2c670 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 35 5d  (interp, objv[5]
2c680 2c 20 26 74 6e 75 6d 29 20 29 20 72 65 74 75 72  , &tnum) ) retur
2c690 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2c6a0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
2c6b0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2c6c0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2c6d0 2c 20 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 6f  , db, zDbName, o
2c6e0 6e 4f 66 66 2c 20 74 6e 75 6d 29 3b 0a 20 20 20  nOff, tnum);.   
2c6f0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2c700 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73 65 74    }..  Tcl_Reset
2c710 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2c720 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2c730 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .}..#if SQLITE_O
2c740 53 5f 55 4e 49 58 0a 23 69 6e 63 6c 75 64 65 20  S_UNIX.#include 
2c750 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e  <sys/time.h>.#in
2c760 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73 6f 75  clude <sys/resou
2c770 72 63 65 2e 68 3e 0a 0a 73 74 61 74 69 63 20 69  rce.h>..static i
2c780 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2c790 20 74 65 73 74 5f 67 65 74 72 75 73 61 67 65 28   test_getrusage(
2c7a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
2c7b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2c7c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2c7d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2c7e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2c7f0 29 7b 0a 20 20 63 68 61 72 20 62 75 66 5b 31 30  ){.  char buf[10
2c800 32 34 5d 3b 0a 20 20 73 74 72 75 63 74 20 72 75  24];.  struct ru
2c810 73 61 67 65 20 72 3b 0a 20 20 6d 65 6d 73 65 74  sage r;.  memset
2c820 28 26 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 72  (&r, 0, sizeof(r
2c830 29 29 3b 0a 20 20 67 65 74 72 75 73 61 67 65 28  ));.  getrusage(
2c840 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 72 29  RUSAGE_SELF, &r)
2c850 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ;..  sqlite3_snp
2c860 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 62 75 66  rintf(sizeof(buf
2c870 29 2c 20 62 75 66 2c 0a 20 20 20 20 22 72 75 5f  ), buf,.    "ru_
2c880 75 74 69 6d 65 3d 25 64 2e 25 30 36 64 20 72 75  utime=%d.%06d ru
2c890 5f 73 74 69 6d 65 3d 25 64 2e 25 30 36 64 20 72  _stime=%d.%06d r
2c8a0 75 5f 6d 69 6e 66 6c 74 3d 25 64 20 72 75 5f 6d  u_minflt=%d ru_m
2c8b0 61 6a 66 6c 74 3d 25 64 22 2c 20 0a 20 20 20 20  ajflt=%d", .    
2c8c0 28 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d 65 2e  (int)r.ru_utime.
2c8d0 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e 72  tv_sec, (int)r.r
2c8e0 75 5f 75 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c  u_utime.tv_usec,
2c8f0 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f   .    (int)r.ru_
2c900 73 74 69 6d 65 2e 74 76 5f 73 65 63 2c 20 28 69  stime.tv_sec, (i
2c910 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e 74 76  nt)r.ru_stime.tv
2c920 5f 75 73 65 63 2c 20 0a 20 20 20 20 28 69 6e 74  _usec, .    (int
2c930 29 72 2e 72 75 5f 6d 69 6e 66 6c 74 2c 20 28 69  )r.ru_minflt, (i
2c940 6e 74 29 72 2e 72 75 5f 6d 61 6a 66 6c 74 0a 20  nt)r.ru_majflt. 
2c950 20 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   );.  Tcl_SetObj
2c960 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
2c970 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2c980 62 75 66 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74  buf, -1));.  ret
2c990 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
2c9a0 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49 54 45  ndif..#if SQLITE
2c9b0 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e  _OS_WIN./*.** In
2c9c0 66 6f 72 6d 61 74 69 6f 6e 20 70 61 73 73 65 64  formation passed
2c9d0 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 74   from the main t
2c9e0 68 72 65 61 64 20 69 6e 74 6f 20 74 68 65 20 77  hread into the w
2c9f0 69 6e 64 6f 77 73 20 66 69 6c 65 20 6c 6f 63 6b  indows file lock
2ca00 65 72 0a 2a 2a 20 62 61 63 6b 67 72 6f 75 6e 64  er.** background
2ca10 20 74 68 72 65 61 64 2e 0a 2a 2f 0a 73 74 72 75   thread..*/.stru
2ca20 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b  ct win32FileLock
2ca30 65 72 20 7b 0a 20 20 63 68 61 72 20 2a 65 76 4e  er {.  char *evN
2ca40 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  ame;       /* Na
2ca50 6d 65 20 6f 66 20 65 76 65 6e 74 20 74 6f 20 73  me of event to s
2ca60 69 67 6e 61 6c 20 74 68 72 65 61 64 20 73 74 61  ignal thread sta
2ca70 72 74 75 70 20 2a 2f 0a 20 20 48 41 4e 44 4c 45  rtup */.  HANDLE
2ca80 20 68 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   h;           /*
2ca90 20 48 61 6e 64 6c 65 20 6f 66 20 74 68 65 20 66   Handle of the f
2caa0 69 6c 65 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64  ile to be locked
2cab0 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79 31   */.  int delay1
2cac0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 6c  ;         /* Del
2cad0 61 79 20 62 65 66 6f 72 65 20 6c 6f 63 6b 69 6e  ay before lockin
2cae0 67 20 2a 2f 0a 20 20 69 6e 74 20 64 65 6c 61 79  g */.  int delay
2caf0 32 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65  2;         /* De
2cb00 6c 61 79 20 62 65 66 6f 72 65 20 75 6e 6c 6f 63  lay before unloc
2cb10 6b 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b  king */.  int ok
2cb20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2cb30 20 46 69 6e 69 73 68 65 64 20 6f 6b 20 2a 2f 0a   Finished ok */.
2cb40 20 20 69 6e 74 20 65 72 72 3b 20 20 20 20 20 20    int err;      
2cb50 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2cb60 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
2cb70 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a   */.};.#endif...
2cb80 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2cb90 4e 0a 23 69 6e 63 6c 75 64 65 20 3c 70 72 6f 63  N.#include <proc
2cba0 65 73 73 2e 68 3e 0a 2f 2a 0a 2a 2a 20 54 68 65  ess.h>./*.** The
2cbb0 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
2cbc0 61 64 20 74 68 61 74 20 64 6f 65 73 20 66 69 6c  ad that does fil
2cbd0 65 20 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74  e locking..*/.st
2cbe0 61 74 69 63 20 76 6f 69 64 20 53 51 4c 49 54 45  atic void SQLITE
2cbf0 5f 43 44 45 43 4c 20 77 69 6e 33 32 5f 66 69 6c  _CDECL win32_fil
2cc00 65 5f 6c 6f 63 6b 65 72 28 76 6f 69 64 20 2a 70  e_locker(void *p
2cc10 41 70 70 44 61 74 61 29 7b 0a 20 20 73 74 72 75  AppData){.  stru
2cc20 63 74 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b  ct win32FileLock
2cc30 65 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  er *p = (struct 
2cc40 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 2a  win32FileLocker*
2cc50 29 70 41 70 70 44 61 74 61 3b 0a 20 20 69 66 28  )pAppData;.  if(
2cc60 20 70 2d 3e 65 76 4e 61 6d 65 20 29 7b 0a 20 20   p->evName ){.  
2cc70 20 20 48 41 4e 44 4c 45 20 65 76 20 3d 20 4f 70    HANDLE ev = Op
2cc80 65 6e 45 76 65 6e 74 28 45 56 45 4e 54 5f 4d 4f  enEvent(EVENT_MO
2cc90 44 49 46 59 5f 53 54 41 54 45 2c 20 46 41 4c 53  DIFY_STATE, FALS
2cca0 45 2c 20 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20  E, p->evName);. 
2ccb0 20 20 20 69 66 20 28 20 65 76 20 29 7b 0a 20 20     if ( ev ){.  
2ccc0 20 20 20 20 53 65 74 45 76 65 6e 74 28 65 76 29      SetEvent(ev)
2ccd0 3b 0a 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e  ;.      CloseHan
2cce0 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 7d 0a 20  dle(ev);.    }. 
2ccf0 20 7d 0a 20 20 69 66 28 20 70 2d 3e 64 65 6c 61   }.  if( p->dela
2cd00 79 31 20 29 20 53 6c 65 65 70 28 70 2d 3e 64 65  y1 ) Sleep(p->de
2cd10 6c 61 79 31 29 3b 0a 20 20 69 66 28 20 4c 6f 63  lay1);.  if( Loc
2cd20 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30  kFile(p->h, 0, 0
2cd30 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30 29 20  , 100000000, 0) 
2cd40 29 7b 0a 20 20 20 20 53 6c 65 65 70 28 70 2d 3e  ){.    Sleep(p->
2cd50 64 65 6c 61 79 32 29 3b 0a 20 20 20 20 55 6e 6c  delay2);.    Unl
2cd60 6f 63 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c  ockFile(p->h, 0,
2cd70 20 30 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30   0, 100000000, 0
2cd80 29 3b 0a 20 20 20 20 70 2d 3e 6f 6b 20 3d 20 31  );.    p->ok = 1
2cd90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2cda0 2d 3e 65 72 72 20 3d 20 31 3b 0a 20 20 7d 0a 20  ->err = 1;.  }. 
2cdb0 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e   CloseHandle(p->
2cdc0 68 29 3b 0a 20 20 70 2d 3e 68 20 3d 20 30 3b 0a  h);.  p->h = 0;.
2cdd0 20 20 70 2d 3e 64 65 6c 61 79 31 20 3d 20 30 3b    p->delay1 = 0;
2cde0 0a 20 20 70 2d 3e 64 65 6c 61 79 32 20 3d 20 30  .  p->delay2 = 0
2cdf0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
2ce00 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a  SQLITE_OS_WIN./*
2ce10 0a 2a 2a 20 20 20 20 20 20 6c 6f 63 6b 5f 77 69  .**      lock_wi
2ce20 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d  n32_file FILENAM
2ce30 45 20 44 45 4c 41 59 31 20 44 45 4c 41 59 32 0a  E DELAY1 DELAY2.
2ce40 2a 2a 0a 2a 2a 20 47 65 74 20 61 6e 20 65 78 63  **.** Get an exc
2ce50 6c 75 73 69 76 65 20 6d 61 6e 64 69 74 6f 72 79  lusive manditory
2ce60 20 6c 6f 63 6b 20 6f 6e 20 66 69 6c 65 20 66 6f   lock on file fo
2ce70 72 20 44 45 4c 41 59 32 20 6d 69 6c 6c 69 73 65  r DELAY2 millise
2ce80 63 6f 6e 64 73 2e 0a 2a 2a 20 57 61 69 74 20 44  conds..** Wait D
2ce90 45 4c 41 59 31 20 6d 69 6c 6c 69 73 65 63 6f 6e  ELAY1 millisecon
2cea0 64 73 20 62 65 66 6f 72 65 20 61 63 71 75 69 72  ds before acquir
2ceb0 69 6e 67 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f  ing the lock..*/
2cec0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
2ced0 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f  TE_TCLAPI win32_
2cee0 66 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69  file_lock(.  voi
2cef0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
2cf00 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2cf10 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2cf20 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2cf30 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
2cf40 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
2cf50 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d  32FileLocker x =
2cf60 20 7b 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c   { "win32_file_l
2cf70 6f 63 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ock", 0, 0, 0, 0
2cf80 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
2cf90 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
2cfa0 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
2cfb0 3b 0a 20 20 69 6e 74 20 72 65 74 72 79 20 3d 20  ;.  int retry = 
2cfc0 30 3b 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a  0;.  HANDLE ev;.
2cfd0 20 20 44 57 4f 52 44 20 77 52 65 73 75 6c 74 3b    DWORD wResult;
2cfe0 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
2cff0 34 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a  4 && objc!=1 ){.
2d000 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2d010 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2d020 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20  objv, "FILENAME 
2d030 44 45 4c 41 59 31 20 44 45 4c 41 59 32 22 29 3b  DELAY1 DELAY2");
2d040 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2d050 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2d060 20 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20   objc==1 ){.    
2d070 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2d080 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
2d090 42 75 66 2c 20 22 25 64 20 25 64 20 25 64 20 25  Buf, "%d %d %d %
2d0a0 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
2d0b0 20 20 20 20 20 20 20 20 20 20 20 20 78 2e 6f 6b              x.ok
2d0c0 2c 20 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79  , x.err, x.delay
2d0d0 31 2c 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68  1, x.delay2, x.h
2d0e0 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
2d0f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2d100 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
2d110 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2d120 4f 4b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  OK;.  }.  while(
2d130 20 78 2e 68 20 26 26 20 72 65 74 72 79 3c 33 30   x.h && retry<30
2d140 20 29 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b   ){.    retry++;
2d150 0a 20 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b  .    Sleep(100);
2d160 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 68 20 29  .  }.  if( x.h )
2d170 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2d180 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2d190 62 75 73 79 22 2c 20 28 63 68 61 72 2a 29 30 29  busy", (char*)0)
2d1a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2d1b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2d1c0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2d1d0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2d1e0 5b 32 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29 20  [2], &x.delay1) 
2d1f0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2d200 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
2d210 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
2d220 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e  rp, objv[3], &x.
2d230 64 65 6c 61 79 32 29 20 29 20 72 65 74 75 72 6e  delay2) ) return
2d240 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46   TCL_ERROR;.  zF
2d250 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
2d260 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
2d270 3b 0a 20 20 78 2e 68 20 3d 20 43 72 65 61 74 65  ;.  x.h = Create
2d280 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  File(zFilename, 
2d290 47 45 4e 45 52 49 43 5f 52 45 41 44 7c 47 45 4e  GENERIC_READ|GEN
2d2a0 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20  ERIC_WRITE,.    
2d2b0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53            FILE_S
2d2c0 48 41 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53  HARE_READ|FILE_S
2d2d0 48 41 52 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f  HARE_WRITE, 0, O
2d2e0 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  PEN_ALWAYS,.    
2d2f0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41            FILE_A
2d300 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c  TTRIBUTE_NORMAL,
2d310 20 30 29 3b 0a 20 20 69 66 28 20 21 78 2e 68 20   0);.  if( !x.h 
2d320 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2d330 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2d340 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
2d350 65 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e: ", zFilename,
2d360 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2d370 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2d380 3b 0a 20 20 7d 0a 20 20 65 76 20 3d 20 43 72 65  ;.  }.  ev = Cre
2d390 61 74 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54  ateEvent(NULL, T
2d3a0 52 55 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76  RUE, FALSE, x.ev
2d3b0 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 20 21 65  Name);.  if ( !e
2d3c0 76 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  v ){.    Tcl_App
2d3d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2d3e0 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  , "cannot create
2d3f0 20 65 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e   event: ", x.evN
2d400 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
2d410 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2d420 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67  RROR;.  }.  _beg
2d430 69 6e 74 68 72 65 61 64 28 77 69 6e 33 32 5f 66  inthread(win32_f
2d440 69 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28  ile_locker, 0, (
2d450 76 6f 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65  void*)&x);.  Sle
2d460 65 70 28 30 29 3b 0a 20 20 69 66 20 28 20 28 77  ep(0);.  if ( (w
2d470 52 65 73 75 6c 74 20 3d 20 57 61 69 74 46 6f 72  Result = WaitFor
2d480 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c  SingleObject(ev,
2d490 20 31 30 30 30 30 29 29 21 3d 57 41 49 54 5f 4f   10000))!=WAIT_O
2d4a0 42 4a 45 43 54 5f 30 20 29 7b 0a 20 20 20 20 73  BJECT_0 ){.    s
2d4b0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2d4c0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
2d4d0 75 66 2c 20 22 30 78 25 78 22 2c 20 77 52 65 73  uf, "0x%x", wRes
2d4e0 75 6c 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  ult);.    Tcl_Ap
2d4f0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2d500 70 2c 20 22 77 61 69 74 20 66 61 69 6c 65 64 3a  p, "wait failed:
2d510 20 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a   ", zBuf, (char*
2d520 29 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  )0);.    CloseHa
2d530 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 72 65  ndle(ev);.    re
2d540 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2d550 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c    }.  CloseHandl
2d560 65 28 65 76 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(ev);.  return 
2d570 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2d580 20 20 20 20 20 20 65 78 69 73 74 73 5f 77 69 6e        exists_win
2d590 33 32 5f 70 61 74 68 20 50 41 54 48 0a 2a 2a 0a  32_path PATH.**.
2d5a0 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
2d5b0 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
2d5c0 66 69 65 64 20 70 61 74 68 20 65 78 69 73 74 73  fied path exists
2d5d0 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75  , whose fully qu
2d5e0 61 6c 69 66 69 65 64 20 6e 61 6d 65 0a 2a 2a 20  alified name.** 
2d5f0 6d 61 79 20 65 78 63 65 65 64 20 32 36 30 20 63  may exceed 260 c
2d600 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
2d610 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
2d620 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74   "\\?\"..*/.stat
2d630 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2d640 4c 41 50 49 20 77 69 6e 33 32 5f 65 78 69 73 74  LAPI win32_exist
2d650 73 5f 70 61 74 68 28 0a 20 20 76 6f 69 64 20 2a  s_path(.  void *
2d660 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2d670 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2d680 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2d690 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2d6a0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f  bjv[].){.  if( o
2d6b0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2d6c0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2d6d0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2d6e0 22 50 41 54 48 22 29 3b 0a 20 20 20 20 72 65 74  "PATH");.    ret
2d6f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2d700 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
2d710 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
2d720 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28  l_NewBooleanObj(
2d730 0a 20 20 20 20 20 20 47 65 74 46 69 6c 65 41 74  .      GetFileAt
2d740 74 72 69 62 75 74 65 73 57 28 20 54 63 6c 5f 47  tributesW( Tcl_G
2d750 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31  etUnicode(objv[1
2d760 5d 29 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49 4c  ]))!=INVALID_FIL
2d770 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 29 3b  E_ATTRIBUTES ));
2d780 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2d790 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20  ;.}../*.**      
2d7a0 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65 20  find_win32_file 
2d7b0 50 41 54 54 45 52 4e 0a 2a 2a 0a 2a 2a 20 52 65  PATTERN.**.** Re
2d7c0 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20  turns a list of 
2d7d0 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 69 72  entries in a dir
2d7e0 65 63 74 6f 72 79 20 74 68 61 74 20 6d 61 74 63  ectory that matc
2d7f0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
2d800 70 61 74 74 65 72 6e 2c 0a 2a 2a 20 77 68 6f 73  pattern,.** whos
2d810 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
2d820 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65  d name may excee
2d830 64 20 32 34 38 20 63 68 61 72 61 63 74 65 72 73  d 248 characters
2d840 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78   if it is prefix
2d850 65 64 20 77 69 74 68 0a 2a 2a 20 22 5c 5c 3f 5c  ed with.** "\\?\
2d860 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
2d870 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77   SQLITE_TCLAPI w
2d880 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c 65 28 0a  in32_find_file(.
2d890 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
2d8a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2d8b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2d8c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2d8d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2d8e0 0a 20 20 48 41 4e 44 4c 45 20 68 46 69 6e 64 46  .  HANDLE hFindF
2d8f0 69 6c 65 20 3d 20 49 4e 56 41 4c 49 44 5f 48 41  ile = INVALID_HA
2d900 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20 20 57 49  NDLE_VALUE;.  WI
2d910 4e 33 32 5f 46 49 4e 44 5f 44 41 54 41 57 20 66  N32_FIND_DATAW f
2d920 69 6e 64 44 61 74 61 3b 0a 20 20 54 63 6c 5f 4f  indData;.  Tcl_O
2d930 62 6a 20 2a 6c 69 73 74 4f 62 6a 3b 0a 20 20 44  bj *listObj;.  D
2d940 57 4f 52 44 20 6c 61 73 74 45 72 72 6e 6f 3b 0a  WORD lastErrno;.
2d950 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2d960 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2d970 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2d980 20 6f 62 6a 76 2c 20 22 50 41 54 54 45 52 4e 22   objv, "PATTERN"
2d990 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2d9a0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 68  L_ERROR;.  }.  h
2d9b0 46 69 6e 64 46 69 6c 65 20 3d 20 46 69 6e 64 46  FindFile = FindF
2d9c0 69 72 73 74 46 69 6c 65 57 28 54 63 6c 5f 47 65  irstFileW(Tcl_Ge
2d9d0 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d  tUnicode(objv[1]
2d9e0 29 2c 20 26 66 69 6e 64 44 61 74 61 29 3b 0a 20  ), &findData);. 
2d9f0 20 69 66 28 20 68 46 69 6e 64 46 69 6c 65 3d 3d   if( hFindFile==
2da00 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45 5f 56  INVALID_HANDLE_V
2da10 41 4c 55 45 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ALUE ){.    Tcl_
2da20 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
2da30 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
2da40 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72  IntObj(GetLastEr
2da50 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74  ror()));.    ret
2da60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2da70 20 7d 0a 20 20 6c 69 73 74 4f 62 6a 20 3d 20 54   }.  listObj = T
2da80 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54  cl_NewObj();.  T
2da90 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
2daa0 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 64 6f 20 7b  listObj);.  do {
2dab0 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
2dac0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
2dad0 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54  terp, listObj, T
2dae0 63 6c 5f 4e 65 77 55 6e 69 63 6f 64 65 4f 62 6a  cl_NewUnicodeObj
2daf0 28 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44 61  (.        findDa
2db00 74 61 2e 63 46 69 6c 65 4e 61 6d 65 2c 20 2d 31  ta.cFileName, -1
2db10 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
2db20 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2db30 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
2db40 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2db50 4f 62 6a 28 0a 20 20 20 20 20 20 20 20 66 69 6e  Obj(.        fin
2db60 64 44 61 74 61 2e 64 77 46 69 6c 65 41 74 74 72  dData.dwFileAttr
2db70 69 62 75 74 65 73 29 29 3b 0a 20 20 7d 20 77 68  ibutes));.  } wh
2db80 69 6c 65 28 20 46 69 6e 64 4e 65 78 74 46 69 6c  ile( FindNextFil
2db90 65 57 28 68 46 69 6e 64 46 69 6c 65 2c 20 26 66  eW(hFindFile, &f
2dba0 69 6e 64 44 61 74 61 29 20 29 3b 0a 20 20 6c 61  indData) );.  la
2dbb0 73 74 45 72 72 6e 6f 20 3d 20 47 65 74 4c 61 73  stErrno = GetLas
2dbc0 74 45 72 72 6f 72 28 29 3b 0a 20 20 69 66 28 20  tError();.  if( 
2dbd0 6c 61 73 74 45 72 72 6e 6f 21 3d 4e 4f 5f 45 52  lastErrno!=NO_ER
2dbe0 52 4f 52 20 26 26 20 6c 61 73 74 45 72 72 6e 6f  ROR && lastErrno
2dbf0 21 3d 45 52 52 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f  !=ERROR_NO_MORE_
2dc00 46 49 4c 45 53 20 29 7b 0a 20 20 20 20 46 69 6e  FILES ){.    Fin
2dc10 64 43 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65  dClose(hFindFile
2dc20 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  );.    Tcl_DecrR
2dc30 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f 62 6a 29  efCount(listObj)
2dc40 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ;.    Tcl_SetObj
2dc50 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
2dc60 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
2dc70 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29  (GetLastError())
2dc80 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2dc90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 46  L_ERROR;.  }.  F
2dca0 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64 46 69  indClose(hFindFi
2dcb0 6c 65 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  le);.  Tcl_SetOb
2dcc0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
2dcd0 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 72 65 74 75  listObj);.  retu
2dce0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
2dcf0 0a 2a 2a 20 20 20 20 20 20 64 65 6c 65 74 65 5f  .**      delete_
2dd00 77 69 6e 33 32 5f 66 69 6c 65 20 46 49 4c 45 4e  win32_file FILEN
2dd10 41 4d 45 0a 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65  AME.**.** Delete
2dd20 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
2dd30 66 69 6c 65 2c 20 77 68 6f 73 65 20 66 75 6c 6c  file, whose full
2dd40 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65  y qualified name
2dd50 20 6d 61 79 20 65 78 63 65 65 64 20 32 36 30 0a   may exceed 260.
2dd60 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66  ** characters if
2dd70 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20   it is prefixed 
2dd80 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a  with "\\?\"..*/.
2dd90 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2dda0 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32 5f 64  E_TCLAPI win32_d
2ddb0 65 6c 65 74 65 5f 66 69 6c 65 28 0a 20 20 76 6f  elete_file(.  vo
2ddc0 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
2ddd0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2dde0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2ddf0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2de00 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
2de10 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2de20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2de30 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2de40 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 22 29 3b  jv, "FILENAME");
2de50 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2de60 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2de70 20 21 44 65 6c 65 74 65 46 69 6c 65 57 28 54 63   !DeleteFileW(Tc
2de80 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a  l_GetUnicode(obj
2de90 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20 20 54 63  v[1])) ){.    Tc
2dea0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2deb0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69  nterp, Tcl_NewWi
2dec0 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74  deIntObj(GetLast
2ded0 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72  Error()));.    r
2dee0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2def0 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74  .  }.  Tcl_Reset
2df00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
2df10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2df20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d  .}../*.**      m
2df30 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72 20 44 49  ake_win32_dir DI
2df40 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72  RECTORY.**.** Cr
2df50 65 61 74 65 73 20 74 68 65 20 73 70 65 63 69 66  eates the specif
2df60 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20 77  ied directory, w
2df70 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69  hose fully quali
2df80 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78  fied name may ex
2df90 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61 72  ceed 248.** char
2dfa0 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20  acters if it is 
2dfb0 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c  prefixed with "\
2dfc0 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  \?\"..*/.static 
2dfd0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2dfe0 49 20 77 69 6e 33 32 5f 6d 6b 64 69 72 28 0a 20  I win32_mkdir(. 
2dff0 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
2e000 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
2e010 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
2e020 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
2e030 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
2e040 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
2e050 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2e060 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2e070 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f 52   objv, "DIRECTOR
2e080 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  Y");.    return 
2e090 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2e0a0 20 69 66 28 20 21 43 72 65 61 74 65 44 69 72 65   if( !CreateDire
2e0b0 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55 6e  ctoryW(Tcl_GetUn
2e0c0 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20  icode(objv[1]), 
2e0d0 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 54 63 6c  NULL) ){.    Tcl
2e0e0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
2e0f0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64  terp, Tcl_NewWid
2e100 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73 74 45  eIntObj(GetLastE
2e110 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20 72 65  rror()));.    re
2e120 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2e130 20 20 7d 0a 20 20 54 63 6c 5f 52 65 73 65 74 52    }.  Tcl_ResetR
2e140 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20  esult(interp);. 
2e150 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2e160 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 72 65  }../*.**      re
2e170 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72 20 44  move_win32_dir D
2e180 49 52 45 43 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52  IRECTORY.**.** R
2e190 65 6d 6f 76 65 73 20 74 68 65 20 73 70 65 63 69  emoves the speci
2e1a0 66 69 65 64 20 64 69 72 65 63 74 6f 72 79 2c 20  fied directory, 
2e1b0 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c  whose fully qual
2e1c0 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65  ified name may e
2e1d0 78 63 65 65 64 20 32 34 38 0a 2a 2a 20 63 68 61  xceed 248.** cha
2e1e0 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69 73  racters if it is
2e1f0 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20 22   prefixed with "
2e200 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  \\?\"..*/.static
2e210 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2e220 50 49 20 77 69 6e 33 32 5f 72 6d 64 69 72 28 0a  PI win32_rmdir(.
2e230 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61    void *clientDa
2e240 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
2e250 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
2e260 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
2e270 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
2e280 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
2e290 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2e2a0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2e2b0 2c 20 6f 62 6a 76 2c 20 22 44 49 52 45 43 54 4f  , objv, "DIRECTO
2e2c0 52 59 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  RY");.    return
2e2d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2e2e0 20 20 69 66 28 20 21 52 65 6d 6f 76 65 44 69 72    if( !RemoveDir
2e2f0 65 63 74 6f 72 79 57 28 54 63 6c 5f 47 65 74 55  ectoryW(Tcl_GetU
2e300 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29  nicode(objv[1]))
2e310 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
2e320 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2e330 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
2e340 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  bj(GetLastError(
2e350 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
2e360 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2e370 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
2e380 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75  (interp);.  retu
2e390 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
2e3a0 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  dif.../*.**     
2e3b0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f   optimization_co
2e3c0 6e 74 72 6f 6c 20 44 42 20 4f 50 54 20 42 4f 4f  ntrol DB OPT BOO
2e3d0 4c 45 41 4e 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c  LEAN.**.** Enabl
2e3e0 65 20 6f 72 20 64 69 73 61 62 6c 65 20 71 75 65  e or disable que
2e3f0 72 79 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  ry optimizations
2e400 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
2e410 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
2e420 29 0a 2a 2a 20 69 6e 74 65 72 66 61 63 65 2e 20  ).** interface. 
2e430 20 44 69 73 61 62 6c 65 20 69 66 20 42 4f 4f 4c   Disable if BOOL
2e440 45 41 4e 20 69 73 20 66 61 6c 73 65 20 61 6e 64  EAN is false and
2e450 20 65 6e 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45   enable if BOOLE
2e460 41 4e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 20 4f  AN is true..** O
2e470 50 54 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  PT is the name o
2e480 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2e490 6f 6e 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  on to be disable
2e4a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2e4b0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 6f   SQLITE_TCLAPI o
2e4c0 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74  ptimization_cont
2e4d0 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  rol(.  void * cl
2e4e0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2e4f0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2e500 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2e510 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2e520 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  v[].){.  int i;.
2e530 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2e540 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
2e550 74 3b 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a  t;.  int onoff;.
2e560 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b 0a    int mask = 0;.
2e570 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
2e580 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73  truct {.    cons
2e590 74 20 63 68 61 72 20 2a 7a 4f 70 74 4e 61 6d 65  t char *zOptName
2e5a0 3b 0a 20 20 20 20 69 6e 74 20 6d 61 73 6b 3b 0a  ;.    int mask;.
2e5b0 20 20 7d 20 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20    } aOpt[] = {. 
2e5c0 20 20 20 7b 20 22 61 6c 6c 22 2c 20 20 20 20 20     { "all",     
2e5d0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2e5e0 54 45 5f 41 6c 6c 4f 70 74 73 20 20 20 20 20 20  TE_AllOpts      
2e5f0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 6f 6e 65    },.    { "none
2e600 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2e610 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
2e620 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2e630 20 22 71 75 65 72 79 2d 66 6c 61 74 74 65 6e 65   "query-flattene
2e640 72 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 51  r",     SQLITE_Q
2e650 75 65 72 79 46 6c 61 74 74 65 6e 65 72 20 7d 2c  ueryFlattener },
2e660 0a 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63  .    { "column-c
2e670 61 63 68 65 22 2c 20 20 20 20 20 20 20 20 53 51  ache",        SQ
2e680 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63 68 65  LITE_ColumnCache
2e690 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 67 72      },.    { "gr
2e6a0 6f 75 70 62 79 2d 6f 72 64 65 72 22 2c 20 20 20  oupby-order",   
2e6b0 20 20 20 20 53 51 4c 49 54 45 5f 47 72 6f 75 70      SQLITE_Group
2e6c0 42 79 4f 72 64 65 72 20 20 20 7d 2c 0a 20 20 20  ByOrder   },.   
2e6d0 20 7b 20 22 66 61 63 74 6f 72 2d 63 6f 6e 73 74   { "factor-const
2e6e0 61 6e 74 73 22 2c 20 20 20 20 53 51 4c 49 54 45  ants",    SQLITE
2e6f0 5f 46 61 63 74 6f 72 4f 75 74 43 6f 6e 73 74 20  _FactorOutConst 
2e700 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73 74 69 6e  },.    { "distin
2e710 63 74 2d 6f 70 74 22 2c 20 20 20 20 20 20 20 20  ct-opt",        
2e720 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63 74 4f  SQLITE_DistinctO
2e730 70 74 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  pt    },.    { "
2e740 63 6f 76 65 72 2d 69 64 78 2d 73 63 61 6e 22 2c  cover-idx-scan",
2e750 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43 6f 76        SQLITE_Cov
2e760 65 72 49 64 78 53 63 61 6e 20 20 20 7d 2c 0a 20  erIdxScan   },. 
2e770 20 20 20 7b 20 22 6f 72 64 65 72 2d 62 79 2d 69     { "order-by-i
2e780 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53 51 4c 49  dx-join",   SQLI
2e790 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a 6f 69  TE_OrderByIdxJoi
2e7a0 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72 61 6e  n },.    { "tran
2e7b0 73 69 74 69 76 65 22 2c 20 20 20 20 20 20 20 20  sitive",        
2e7c0 20 20 53 51 4c 49 54 45 5f 54 72 61 6e 73 69 74    SQLITE_Transit
2e7d0 69 76 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b  ive     },.    {
2e7e0 20 22 73 75 62 71 75 65 72 79 2d 63 6f 72 6f 75   "subquery-corou
2e7f0 74 69 6e 65 22 2c 20 20 53 51 4c 49 54 45 5f 53  tine",  SQLITE_S
2e800 75 62 71 43 6f 72 6f 75 74 69 6e 65 20 20 7d 2c  ubqCoroutine  },
2e810 0a 20 20 20 20 7b 20 22 6f 6d 69 74 2d 6e 6f 6f  .    { "omit-noo
2e820 70 2d 6a 6f 69 6e 22 2c 20 20 20 20 20 20 53 51  p-join",      SQ
2e830 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a 6f 69  LITE_OmitNoopJoi
2e840 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 74  n   },.    { "st
2e850 61 74 33 22 2c 20 20 20 20 20 20 20 20 20 20 20  at3",           
2e860 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74 33      SQLITE_Stat3
2e870 34 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  4         },.   
2e880 20 7b 20 22 73 74 61 74 34 22 2c 20 20 20 20 20   { "stat4",     
2e890 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2e8a0 5f 53 74 61 74 33 34 20 20 20 20 20 20 20 20 20  _Stat34         
2e8b0 7d 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f  },.  };..  if( o
2e8c0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
2e8d0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2e8e0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2e8f0 22 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 22  "DB OPT BOOLEAN"
2e900 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2e910 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2e920 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2e930 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2e940 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2e950 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2e960 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
2e970 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f  cl_GetBooleanFro
2e980 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
2e990 76 5b 33 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 20  v[3], &onoff) ) 
2e9a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2e9b0 3b 0a 20 20 7a 4f 70 74 20 3d 20 54 63 6c 5f 47  ;.  zOpt = Tcl_G
2e9c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
2e9d0 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
2e9e0 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
2e9f0 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b  eof(aOpt[0]); i+
2ea00 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
2ea10 6d 70 28 7a 4f 70 74 2c 20 61 4f 70 74 5b 69 5d  mp(zOpt, aOpt[i]
2ea20 2e 7a 4f 70 74 4e 61 6d 65 29 3d 3d 30 20 29 7b  .zOptName)==0 ){
2ea30 0a 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 61 4f  .      mask = aO
2ea40 70 74 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20  pt[i].mask;.    
2ea50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2ea60 20 7d 0a 20 20 69 66 28 20 6f 6e 6f 66 66 20 29   }.  if( onoff )
2ea70 20 6d 61 73 6b 20 3d 20 7e 6d 61 73 6b 3b 0a 20   mask = ~mask;. 
2ea80 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61   if( i>=sizeof(a
2ea90 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74  Opt)/sizeof(aOpt
2eaa0 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  [0]) ){.    Tcl_
2eab0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
2eac0 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  erp, "unknown op
2ead0 74 69 6d 69 7a 61 74 69 6f 6e 20 2d 20 73 68 6f  timization - sho
2eae0 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 22 2c  uld be one of:",
2eaf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2eb00 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b        (char*)0);
2eb10 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
2eb20 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a  sizeof(aOpt)/siz
2eb30 65 6f 66 28 61 4f 70 74 5b 30 5d 29 3b 20 69 2b  eof(aOpt[0]); i+
2eb40 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
2eb50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2eb60 70 2c 20 22 20 22 2c 20 61 4f 70 74 5b 69 5d 2e  p, " ", aOpt[i].
2eb70 7a 4f 70 74 4e 61 6d 65 2c 20 28 63 68 61 72 2a  zOptName, (char*
2eb80 29 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  )0);.    }.    r
2eb90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2eba0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 74  .  }.  sqlite3_t
2ebb0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2ebc0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
2ebd0 4d 49 5a 41 54 49 4f 4e 53 2c 20 64 62 2c 20 6d  MIZATIONS, db, m
2ebe0 61 73 6b 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ask);.  return T
2ebf0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2ec00 20 20 20 20 6c 6f 61 64 5f 73 74 61 74 69 63 5f      load_static_
2ec10 65 78 74 65 6e 73 69 6f 6e 20 44 42 20 4e 41 4d  extension DB NAM
2ec20 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 4c 6f 61 64  E ....**.** Load
2ec30 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 74 61   one or more sta
2ec40 74 69 63 61 6c 6c 79 20 6c 69 6e 6b 65 64 20 65  tically linked e
2ec50 78 74 65 6e 73 69 6f 6e 73 2e 0a 2a 2f 0a 73 74  xtensions..*/.st
2ec60 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2ec70 54 43 4c 41 50 49 20 74 63 6c 4c 6f 61 64 53 74  TCLAPI tclLoadSt
2ec80 61 74 69 63 45 78 74 65 6e 73 69 6f 6e 43 6d 64  aticExtensionCmd
2ec90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2eca0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2ecb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2ecc0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2ecd0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2ece0 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  .){.  extern int
2ecf0 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f   sqlite3_amatch_
2ed00 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
2ed10 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2ed20 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2ed30 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
2ed40 73 71 6c 69 74 65 33 5f 63 61 72 72 61 79 5f 69  sqlite3_carray_i
2ed50 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2ed60 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2ed70 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2ed80 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2ed90 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65 5f 69  qlite3_closure_i
2eda0 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2edb0 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2edc0 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2edd0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2ede0 71 6c 69 74 65 33 5f 63 73 76 5f 69 6e 69 74 28  qlite3_csv_init(
2edf0 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2ee00 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2ee10 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2ee20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2ee30 65 33 5f 65 76 61 6c 5f 69 6e 69 74 28 73 71 6c  e3_eval_init(sql
2ee40 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2ee50 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2ee60 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2ee70 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2ee80 66 69 6c 65 69 6f 5f 69 6e 69 74 28 73 71 6c 69  fileio_init(sqli
2ee90 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2eea0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2eeb0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2eec0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
2eed0 75 7a 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69 74  uzzer_init(sqlit
2eee0 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2eef0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2ef00 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2ef10 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 65  n int sqlite3_ie
2ef20 65 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ee_init(sqlite3*
2ef30 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2ef40 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2ef50 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2ef60 6e 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63  nt sqlite3_nextc
2ef70 68 61 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  har_init(sqlite3
2ef80 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2ef90 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2efa0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2efb0 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 65 72 63  int sqlite3_perc
2efc0 65 6e 74 69 6c 65 5f 69 6e 69 74 28 73 71 6c 69  entile_init(sqli
2efd0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2efe0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2eff0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2f000 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 72  rn int sqlite3_r
2f010 65 67 65 78 70 5f 69 6e 69 74 28 73 71 6c 69 74  egexp_init(sqlit
2f020 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2f030 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2f040 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2f050 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65  n int sqlite3_se
2f060 72 69 65 73 5f 69 6e 69 74 28 73 71 6c 69 74 65  ries_init(sqlite
2f070 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2f080 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2f090 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2f0a0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 70 65   int sqlite3_spe
2f0b0 6c 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c 69 74  llfix_init(sqlit
2f0c0 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2f0d0 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2f0e0 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
2f0f0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  n int sqlite3_to
2f100 74 79 70 65 5f 69 6e 69 74 28 73 71 6c 69 74 65  type_init(sqlite
2f110 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2f120 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2f130 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2f140 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 68 6f   int sqlite3_who
2f150 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28 73 71  lenumber_init(sq
2f160 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
2f170 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
2f180 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 73 74  routines*);.  st
2f190 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2f1a0 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
2f1b0 61 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20  ar *zExtName;.  
2f1c0 20 20 69 6e 74 20 28 2a 70 49 6e 69 74 29 28 73    int (*pInit)(s
2f1d0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
2f1e0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
2f1f0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d  _routines*);.  }
2f200 20 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20   aExtension[] = 
2f210 7b 0a 20 20 20 20 7b 20 22 61 6d 61 74 63 68 22  {.    { "amatch"
2f220 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f230 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f   sqlite3_amatch_
2f240 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
2f250 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 61 72     },.    { "car
2f260 72 61 79 22 2c 20 20 20 20 20 20 20 20 20 20 20  ray",           
2f270 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 61 72       sqlite3_car
2f280 72 61 79 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ray_init        
2f290 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2f2a0 22 63 6c 6f 73 75 72 65 22 2c 20 20 20 20 20 20  "closure",      
2f2b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f2c0 5f 63 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20 20  _closure_init   
2f2d0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2f2e0 20 20 7b 20 22 63 73 76 22 2c 20 20 20 20 20 20    { "csv",      
2f2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2f300 69 74 65 33 5f 63 73 76 5f 69 6e 69 74 20 20 20  ite3_csv_init   
2f310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2f320 2c 0a 20 20 20 20 7b 20 22 65 76 61 6c 22 2c 20  ,.    { "eval", 
2f330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f340 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e   sqlite3_eval_in
2f350 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
2f360 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66 69 6c     },.    { "fil
2f370 65 69 6f 22 2c 20 20 20 20 20 20 20 20 20 20 20  eio",           
2f380 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
2f390 65 69 6f 5f 69 6e 69 74 20 20 20 20 20 20 20 20  eio_init        
2f3a0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2f3b0 22 66 75 7a 7a 65 72 22 2c 20 20 20 20 20 20 20  "fuzzer",       
2f3c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f3d0 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 20 20 20 20  _fuzzer_init    
2f3e0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2f3f0 20 20 7b 20 22 69 65 65 65 37 35 34 22 2c 20 20    { "ieee754",  
2f400 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2f410 69 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 20 20  ite3_ieee_init  
2f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2f430 2c 0a 20 20 20 20 7b 20 22 6e 65 78 74 63 68 61  ,.    { "nextcha
2f440 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
2f450 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61   sqlite3_nextcha
2f460 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  r_init          
2f470 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70 65 72     },.    { "per
2f480 63 65 6e 74 69 6c 65 22 2c 20 20 20 20 20 20 20  centile",       
2f490 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70 65 72       sqlite3_per
2f4a0 63 65 6e 74 69 6c 65 5f 69 6e 69 74 20 20 20 20  centile_init    
2f4b0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2f4c0 22 72 65 67 65 78 70 22 2c 20 20 20 20 20 20 20  "regexp",       
2f4d0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f4e0 5f 72 65 67 65 78 70 5f 69 6e 69 74 20 20 20 20  _regexp_init    
2f4f0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2f500 20 20 7b 20 22 73 65 72 69 65 73 22 2c 20 20 20    { "series",   
2f510 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2f520 69 74 65 33 5f 73 65 72 69 65 73 5f 69 6e 69 74  ite3_series_init
2f530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2f540 2c 0a 20 20 20 20 7b 20 22 73 70 65 6c 6c 66 69  ,.    { "spellfi
2f550 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
2f560 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69   sqlite3_spellfi
2f570 78 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  x_init          
2f580 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74     },.    { "tot
2f590 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ype",           
2f5a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 74       sqlite3_tot
2f5b0 79 70 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20  ype_init        
2f5c0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
2f5d0 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20 20  "wholenumber",  
2f5e0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2f5f0 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69  _wholenumber_ini
2f600 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  t          },.  
2f610 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  };.  sqlite3 *db
2f620 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
2f630 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 2c 20  zName;.  int i, 
2f640 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  j, rc;.  char *z
2f650 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 66  ErrMsg = 0;.  if
2f660 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20  ( objc<3 ){.    
2f670 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2f680 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2f690 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e 2e 22 29  , "DB NAME ...")
2f6a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2f6b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2f6c0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
2f6d0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
2f6e0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
2f6f0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
2f700 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 6a 3d  _ERROR;.  for(j=
2f710 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b 29 7b  2; j<objc; j++){
2f720 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c  .    zName = Tcl
2f730 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2f740 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  j]);.    for(i=0
2f750 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 45  ; i<ArraySize(aE
2f760 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b 29 7b  xtension); i++){
2f770 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
2f780 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74 65 6e 73  p(zName, aExtens
2f790 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d 65 29  ion[i].zExtName)
2f7a0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
2f7b0 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72   }.    if( i>=Ar
2f7c0 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73 69  raySize(aExtensi
2f7d0 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  on) ){.      Tcl
2f7e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
2f7f0 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 65  terp, "no such e
2f800 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a 4e 61  xtension: ", zNa
2f810 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
2f820 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
2f830 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
2f840 20 69 66 28 20 61 45 78 74 65 6e 73 69 6f 6e 5b   if( aExtension[
2f850 69 5d 2e 70 49 6e 69 74 20 29 7b 0a 20 20 20 20  i].pInit ){.    
2f860 20 20 72 63 20 3d 20 61 45 78 74 65 6e 73 69 6f    rc = aExtensio
2f870 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c 20 26  n[i].pInit(db, &
2f880 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20  zErrMsg, 0);.   
2f890 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
2f8a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
2f8b0 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21 3d    }.    if( rc!=
2f8c0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 7a 45 72  SQLITE_OK || zEr
2f8d0 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 54 63  rMsg ){.      Tc
2f8e0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2f8f0 6e 74 65 72 70 2c 20 22 69 6e 69 74 69 61 6c 69  nterp, "initiali
2f900 7a 61 74 69 6f 6e 20 6f 66 20 22 2c 20 7a 4e 61  zation of ", zNa
2f910 6d 65 2c 20 22 20 66 61 69 6c 65 64 3a 20 22 2c  me, " failed: ",
2f920 20 7a 45 72 72 4d 73 67 2c 0a 20 20 20 20 20 20   zErrMsg,.      
2f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f940 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2f950 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2f960 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
2f970 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2f980 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2f990 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2f9a0 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f  *.**     sorter_
2f9b0 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20 42 4f  test_fakeheap BO
2f9c0 4f 4c 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20  OL.**.*/.static 
2f9d0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2f9e0 49 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61  I sorter_test_fa
2f9f0 6b 65 68 65 61 70 28 0a 20 20 76 6f 69 64 20 2a  keheap(.  void *
2fa00 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
2fa10 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2fa20 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2fa30 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2fa40 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
2fa50 62 41 72 67 3b 0a 20 20 69 66 28 20 6f 62 6a 63  bArg;.  if( objc
2fa60 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
2fa70 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2fa80 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 42 4f  rp, 1, objv, "BO
2fa90 4f 4c 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OL");.    return
2faa0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2fab0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f  .  if( Tcl_GetBo
2fac0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
2fad0 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 62  erp, objv[1], &b
2fae0 41 72 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  Arg) ){.    retu
2faf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2fb00 7d 0a 0a 20 20 69 66 28 20 62 41 72 67 20 29 7b  }..  if( bArg ){
2fb10 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2fb20 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2fb30 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ap==0 ){.      s
2fb40 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2fb50 69 67 2e 70 48 65 61 70 20 3d 20 53 51 4c 49 54  ig.pHeap = SQLIT
2fb60 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 2d 31 29  E_INT_TO_PTR(-1)
2fb70 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
2fb80 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
2fb90 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65  GlobalConfig.pHe
2fba0 61 70 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ap==SQLITE_INT_T
2fbb0 4f 5f 50 54 52 28 2d 31 29 20 29 7b 0a 20 20 20  O_PTR(-1) ){.   
2fbc0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2fbd0 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 30  Config.pHeap = 0
2fbe0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 54  ;.    }.  }..  T
2fbf0 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
2fc00 6e 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e  nterp);.  return
2fc10 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
2fc20 2a 20 20 20 20 20 73 6f 72 74 65 72 5f 74 65 73  *     sorter_tes
2fc30 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20 44  t_sort4_helper D
2fc40 42 20 53 51 4c 31 20 4e 53 54 45 50 20 53 51 4c  B SQL1 NSTEP SQL
2fc50 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  2.**.** Compile 
2fc60 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 24 53  SQL statement $S
2fc70 51 4c 31 20 61 6e 64 20 73 74 65 70 20 69 74 20  QL1 and step it 
2fc80 24 4e 53 54 45 50 20 74 69 6d 65 73 2e 20 46 6f  $NSTEP times. Fo
2fc90 72 20 65 61 63 68 20 72 6f 77 2c 20 0a 2a 2a 20  r each row, .** 
2fca0 63 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 6c  check that the l
2fcb0 65 66 74 6d 6f 73 74 20 61 6e 64 20 72 69 67 68  eftmost and righ
2fcc0 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73 20 72 65  tmost columns re
2fcd0 74 75 72 6e 65 64 20 61 72 65 20 62 6f 74 68 20  turned are both 
2fce0 69 6e 74 65 67 65 72 73 2c 0a 2a 2a 20 61 6e 64  integers,.** and
2fcf0 20 74 68 61 74 20 62 6f 74 68 20 63 6f 6e 74 61   that both conta
2fd00 69 6e 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75  in the same valu
2fd10 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 65 78  e..**.** Then ex
2fd20 65 63 75 74 65 20 73 74 61 74 65 6d 65 6e 74 20  ecute statement 
2fd30 24 53 51 4c 32 2e 20 43 68 65 63 6b 20 74 68 61  $SQL2. Check tha
2fd40 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
2fd50 72 65 74 75 72 6e 73 20 74 68 65 20 73 61 6d 65  returns the same
2fd60 0a 2a 2a 20 73 65 74 20 6f 66 20 69 6e 74 65 67  .** set of integ
2fd70 65 72 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ers in the same 
2fd80 6f 72 64 65 72 20 61 73 20 69 6e 20 74 68 65 20  order as in the 
2fd90 70 72 65 76 69 6f 75 73 20 73 74 65 70 20 28 75  previous step (u
2fda0 73 69 6e 67 20 24 53 51 4c 31 29 2e 0a 2a 2f 0a  sing $SQL1)..*/.
2fdb0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
2fdc0 45 5f 54 43 4c 41 50 49 20 73 6f 72 74 65 72 5f  E_TCLAPI sorter_
2fdd0 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65  test_sort4_helpe
2fde0 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  r(.  void * clie
2fdf0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2fe00 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2fe10 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2fe20 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2fe30 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ].){.  const cha
2fe40 72 20 2a 7a 53 71 6c 31 3b 0a 20 20 63 6f 6e 73  r *zSql1;.  cons
2fe50 74 20 63 68 61 72 20 2a 7a 53 71 6c 32 3b 0a 20  t char *zSql2;. 
2fe60 20 69 6e 74 20 6e 53 74 65 70 3b 20 0a 20 20 69   int nStep; .  i
2fe70 6e 74 20 69 53 74 65 70 3b 20 0a 20 20 75 6e 73  nt iStep; .  uns
2fe80 69 67 6e 65 64 20 69 6e 74 20 69 43 6b 73 75 6d  igned int iCksum
2fe90 31 20 3d 20 30 3b 20 0a 20 20 75 6e 73 69 67 6e  1 = 0; .  unsign
2fea0 65 64 20 69 6e 74 20 69 43 6b 73 75 6d 32 20 3d  ed int iCksum2 =
2feb0 20 30 3b 20 0a 20 20 69 6e 74 20 72 63 3b 0a 20   0; .  int rc;. 
2fec0 20 69 6e 74 20 69 42 3b 0a 20 20 73 71 6c 69 74   int iB;.  sqlit
2fed0 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c 69 74 65  e3 *db;.  sqlite
2fee0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
2fef0 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20   .  if( objc!=5 
2ff00 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2ff10 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2ff20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53 51 4c  1, objv, "DB SQL
2ff30 31 20 4e 53 54 45 50 20 53 51 4c 32 22 29 3b 0a  1 NSTEP SQL2");.
2ff40 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ff50 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
2ff60 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
2ff70 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
2ff80 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
2ff90 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
2ffa0 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 31 20 3d  ERROR;.  zSql1 =
2ffb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2ffc0 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[2]);.  if( T
2ffd0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
2ffe0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
2fff0 2c 20 26 6e 53 74 65 70 29 20 29 20 72 65 74 75  , &nStep) ) retu
30000 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
30010 7a 53 71 6c 32 20 3d 20 54 63 6c 5f 47 65 74 53  zSql2 = Tcl_GetS
30020 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a  tring(objv[4]);.
30030 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
30040 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
30050 53 71 6c 31 2c 20 2d 31 2c 20 26 70 53 74 6d 74  Sql1, -1, &pStmt
30060 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 0);.  if( rc!=
30070 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
30080 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a 20 20 69   sql_error;..  i
30090 42 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  B = sqlite3_colu
300a0 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 2d  mn_count(pStmt)-
300b0 31 3b 0a 20 20 66 6f 72 28 69 53 74 65 70 3d 30  1;.  for(iStep=0
300c0 3b 20 69 53 74 65 70 3c 6e 53 74 65 70 20 26 26  ; iStep<nStep &&
300d0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
300e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
300f0 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20 20  ; iStep++){.    
30100 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65 33 5f  int a = sqlite3_
30110 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
30120 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 21  , 0);.    if( a!
30130 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  =sqlite3_column_
30140 69 6e 74 28 70 53 74 6d 74 2c 20 69 42 29 20 29  int(pStmt, iB) )
30150 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
30160 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
30170 20 22 64 61 74 61 20 65 72 72 6f 72 3a 20 28 61   "data error: (a
30180 21 3d 62 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  !=b)", 0);.     
30190 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
301a0 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 43  R;.    }..    iC
301b0 6b 73 75 6d 31 20 2b 3d 20 28 69 43 6b 73 75 6d  ksum1 += (iCksum
301c0 31 20 3c 3c 20 33 29 20 2b 20 28 75 6e 73 69 67  1 << 3) + (unsig
301d0 6e 65 64 20 69 6e 74 29 61 3b 0a 20 20 7d 0a 20  ned int)a;.  }. 
301e0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
301f0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
30200 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
30210 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72  OK ) goto sql_er
30220 72 6f 72 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ror;..  rc = sql
30230 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
30240 64 62 2c 20 7a 53 71 6c 32 2c 20 2d 31 2c 20 26  db, zSql2, -1, &
30250 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28  pStmt, 0);.  if(
30260 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
30270 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b   goto sql_error;
30280 0a 20 20 66 6f 72 28 69 53 74 65 70 3d 30 3b 20  .  for(iStep=0; 
30290 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
302a0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
302b0 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20 20 20 69   iStep++){.    i
302c0 6e 74 20 61 20 3d 20 73 71 6c 69 74 65 33 5f 63  nt a = sqlite3_c
302d0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
302e0 20 30 29 3b 0a 20 20 20 20 69 43 6b 73 75 6d 32   0);.    iCksum2
302f0 20 2b 3d 20 28 69 43 6b 73 75 6d 32 20 3c 3c 20   += (iCksum2 << 
30300 33 29 20 2b 20 28 75 6e 73 69 67 6e 65 64 20 69  3) + (unsigned i
30310 6e 74 29 61 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  nt)a;.  }.  rc =
30320 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
30330 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  e(pStmt);.  if( 
30340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
30350 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a  goto sql_error;.
30360 0a 20 20 69 66 28 20 69 43 6b 73 75 6d 31 21 3d  .  if( iCksum1!=
30370 69 43 6b 73 75 6d 32 20 29 7b 0a 20 20 20 20 54  iCksum2 ){.    T
30380 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
30390 69 6e 74 65 72 70 2c 20 22 63 68 65 63 6b 73 75  interp, "checksu
303a0 6d 20 6d 69 73 6d 61 74 63 68 22 2c 20 30 29 3b  m mismatch", 0);
303b0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
303c0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
303d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 73 71  turn TCL_OK;. sq
303e0 6c 5f 65 72 72 6f 72 3a 0a 20 20 54 63 6c 5f 41  l_error:.  Tcl_A
303f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
30400 72 70 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a 20  rp, "sql error: 
30410 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
30420 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 72 65 74  g(db), 0);.  ret
30430 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d  urn TCL_ERROR;.}
30440 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ...#ifdef SQLITE
30450 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
30460 54 49 4f 4e 0a 23 69 6e 63 6c 75 64 65 20 22 73  TION.#include "s
30470 71 6c 69 74 65 33 75 73 65 72 61 75 74 68 2e 68  qlite3userauth.h
30480 22 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  "./*.** tclcmd: 
30490 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75   sqlite3_user_au
304a0 74 68 65 6e 74 69 63 61 74 65 20 44 42 20 55 53  thenticate DB US
304b0 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 0a  ERNAME PASSWORD.
304c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
304d0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
304e0 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61  _user_authentica
304f0 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  te(.  ClientData
30500 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
30510 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
30520 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
30530 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
30540 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
30550 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
30560 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
30570 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
30580 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
30590 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
305a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
305b0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
305c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
305d0 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30 3b  char *zUser = 0;
305e0 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77 64  .  char *zPasswd
305f0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61 73   = 0;.  int nPas
30600 73 77 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  swd = 0;.  sqlit
30610 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
30620 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
30630 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
30640 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
30650 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53   1, objv, "DB US
30660 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 22  ERNAME PASSWORD"
30670 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
30680 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
30690 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
306a0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
306b0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
306c0 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
306d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
306e0 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f  }.  zUser = Tcl_
306f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
30700 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d 20  ]);.  zPasswd = 
30710 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
30720 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e  mObj(objv[3], &n
30730 50 61 73 73 77 64 29 3b 0a 20 20 72 63 20 3d 20  Passwd);.  rc = 
30740 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74  sqlite3_user_aut
30750 68 65 6e 74 69 63 61 74 65 28 64 62 2c 20 7a 55  henticate(db, zU
30760 73 65 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50  ser, zPasswd, nP
30770 61 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f 53 65  asswd);.  Tcl_Se
30780 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
30790 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
307a0 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
307b0 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
307c0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
307d0 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  /* SQLITE_USER_A
307e0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f  UTHENTICATION */
307f0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
30800 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
30810 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ION./*.** tclcmd
30820 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f  :  sqlite3_user_
30830 61 64 64 20 44 42 20 55 53 45 52 4e 41 4d 45 20  add DB USERNAME 
30840 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e  PASSWORD ISADMIN
30850 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
30860 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
30870 74 5f 75 73 65 72 5f 61 64 64 28 0a 20 20 43 6c  t_user_add(.  Cl
30880 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
30890 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
308a0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
308b0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
308c0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
308d0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
308e0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
308f0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
30900 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
30910 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
30920 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
30930 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
30940 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
30950 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55  */.){.  char *zU
30960 73 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ser = 0;.  char 
30970 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20  *zPasswd = 0;.  
30980 69 6e 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b  int nPasswd = 0;
30990 0a 20 20 69 6e 74 20 69 73 41 64 6d 69 6e 20 3d  .  int isAdmin =
309a0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
309b0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
309c0 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
309d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
309e0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
309f0 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d  bjv, "DB USERNAM
30a00 45 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d  E PASSWORD ISADM
30a10 49 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IN");.    return
30a20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
30a30 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
30a40 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
30a50 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
30a60 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
30a70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
30a80 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54  .  }.  zUser = T
30a90 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
30aa0 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64  v[2]);.  zPasswd
30ab0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
30ac0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
30ad0 20 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63   &nPasswd);.  Tc
30ae0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
30af0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
30b00 5b 34 5d 2c 20 26 69 73 41 64 6d 69 6e 29 3b 0a  [4], &isAdmin);.
30b10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75    rc = sqlite3_u
30b20 73 65 72 5f 61 64 64 28 64 62 2c 20 7a 55 73 65  ser_add(db, zUse
30b30 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50 61 73  r, zPasswd, nPas
30b40 73 77 64 2c 20 69 73 41 64 6d 69 6e 29 3b 0a 20  swd, isAdmin);. 
30b50 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
30b60 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
30b70 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
30b80 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
30b90 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
30ba0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
30bb0 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
30bc0 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  TION */..#ifdef 
30bd0 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
30be0 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  ENTICATION./*.**
30bf0 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
30c00 33 5f 75 73 65 72 5f 63 68 61 6e 67 65 20 44 42  3_user_change DB
30c10 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
30c20 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f 0a 73 74  RD ISADMIN.*/.st
30c30 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
30c40 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73 65 72  TCLAPI test_user
30c50 5f 63 68 61 6e 67 65 28 0a 20 20 43 6c 69 65 6e  _change(.  Clien
30c60 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
30c70 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
30c80 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
30c90 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
30ca0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
30cb0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
30cc0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
30cd0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
30ce0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
30cf0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
30d00 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
30d10 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
30d20 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
30d30 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72  ){.  char *zUser
30d40 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50   = 0;.  char *zP
30d50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74  asswd = 0;.  int
30d60 20 6e 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20   nPasswd = 0;.  
30d70 69 6e 74 20 69 73 41 64 6d 69 6e 20 3d 20 30 3b  int isAdmin = 0;
30d80 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
30d90 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
30da0 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20   objc!=5 ){.    
30db0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
30dc0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
30dd0 2c 20 22 44 42 20 55 53 45 52 4e 41 4d 45 20 50  , "DB USERNAME P
30de0 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 22  ASSWORD ISADMIN"
30df0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
30e00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
30e10 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
30e20 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
30e30 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
30e40 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
30e50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
30e60 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c 5f  }.  zUser = Tcl_
30e70 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
30e80 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d 20  ]);.  zPasswd = 
30e90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
30ea0 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e  mObj(objv[3], &n
30eb0 50 61 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f 47  Passwd);.  Tcl_G
30ec0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
30ed0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
30ee0 2c 20 26 69 73 41 64 6d 69 6e 29 3b 0a 20 20 72  , &isAdmin);.  r
30ef0 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  c = sqlite3_user
30f00 5f 63 68 61 6e 67 65 28 64 62 2c 20 7a 55 73 65  _change(db, zUse
30f10 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e 50 61 73  r, zPasswd, nPas
30f20 73 77 64 2c 20 69 73 41 64 6d 69 6e 29 3b 0a 20  swd, isAdmin);. 
30f30 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
30f40 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
30f50 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
30f60 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
30f70 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
30f80 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
30f90 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
30fa0 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64 65 66 20  TION */..#ifdef 
30fb0 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
30fc0 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a  ENTICATION./*.**
30fd0 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
30fe0 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 20 44 42  3_user_delete DB
30ff0 20 55 53 45 52 4e 41 4d 45 0a 2a 2f 0a 73 74 61   USERNAME.*/.sta
31000 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
31010 43 4c 41 50 49 20 74 65 73 74 5f 75 73 65 72 5f  CLAPI test_user_
31020 64 65 6c 65 74 65 28 0a 20 20 43 6c 69 65 6e 74  delete(.  Client
31030 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
31040 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
31050 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
31060 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
31070 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
31080 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
31090 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
310a0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
310b0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
310c0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
310d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
310e0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
310f0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
31100 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20  {.  char *zUser 
31110 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  = 0;.  sqlite3 *
31120 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
31130 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
31140 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
31150 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
31160 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41  objv, "DB USERNA
31170 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ME");.    return
31180 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
31190 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
311a0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
311b0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
311c0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
311d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
311e0 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54  .  }.  zUser = T
311f0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
31200 76 5b 32 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71  v[2]);.  rc = sq
31210 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74  lite3_user_delet
31220 65 28 64 62 2c 20 7a 55 73 65 72 29 3b 0a 20 20  e(db, zUser);.  
31230 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
31240 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
31250 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
31260 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
31270 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23  turn TCL_OK;.}.#
31280 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
31290 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
312a0 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74 63  ION */../*.** tc
312b0 6c 63 6d 64 3a 20 62 61 64 5f 62 65 68 61 76 69  lcmd: bad_behavi
312c0 6f 72 20 54 59 50 45 0a 2a 2a 0a 2a 2a 20 44 6f  or TYPE.**.** Do
312d0 20 73 6f 6d 65 20 74 68 69 6e 67 73 20 74 68 61   some things tha
312e0 74 20 73 68 6f 75 6c 64 20 74 72 69 67 67 65 72  t should trigger
312f0 20 61 20 76 61 6c 67 72 69 6e 64 20 6f 72 20 2d   a valgrind or -
31300 66 73 61 6e 69 74 69 7a 65 3d 75 6e 64 65 66 69  fsanitize=undefi
31310 6e 65 64 0a 2a 2a 20 77 61 72 6e 69 6e 67 2e 20  ned.** warning. 
31320 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
31330 20 76 65 72 69 66 79 20 74 68 61 74 20 65 72 72   verify that err
31340 6f 72 73 20 61 6e 64 20 77 61 72 6e 69 6e 67 73  ors and warnings
31350 20 6f 75 74 70 75 74 20 62 79 20 74 68 6f 73 65   output by those
31360 0a 2a 2a 20 74 6f 6f 6c 73 20 61 72 65 20 64 65  .** tools are de
31370 74 65 63 74 65 64 20 62 79 20 74 68 65 20 74 65  tected by the te
31380 73 74 20 73 63 72 69 70 74 73 2e 0a 2a 2a 0a 2a  st scripts..**.*
31390 2a 20 20 20 20 20 20 20 54 59 50 45 20 20 20 20  *       TYPE    
313a0 20 20 20 42 45 48 41 56 49 4f 52 0a 2a 2a 20 20     BEHAVIOR.**  
313b0 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20       1          
313c0 4f 76 65 72 66 6c 6f 77 20 61 20 73 69 67 6e 65  Overflow a signe
313d0 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20 20 20 20  d integer.**    
313e0 20 20 20 32 20 20 20 20 20 20 20 20 20 20 4a 75     2          Ju
313f0 6d 70 20 62 61 73 65 64 20 6f 6e 20 61 6e 20 75  mp based on an u
31400 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 76 61 72  ninitialized var
31410 69 61 62 6c 65 0a 2a 2a 20 20 20 20 20 20 20 33  iable.**       3
31420 20 20 20 20 20 20 20 20 20 20 52 65 61 64 20 61            Read a
31430 66 74 65 72 20 66 72 65 65 0a 2a 2a 20 20 20 20  fter free.**    
31440 20 20 20 34 20 20 20 20 20 20 20 20 20 20 50 61     4          Pa
31450 6e 69 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nic.*/.static in
31460 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
31470 74 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69 6f  test_bad_behavio
31480 72 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  r(.  ClientData 
31490 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
314a0 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
314b0 65 67 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  eger containing 
314c0 7a 65 72 6f 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  zero */.  Tcl_In
314d0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
314e0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
314f0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
31500 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
31510 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
31520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
31530 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
31540 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
31550 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
31560 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
31570 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
31580 74 20 69 54 79 70 65 3b 0a 20 20 69 6e 74 20 78  t iType;.  int x
31590 79 7a 3b 0a 20 20 69 6e 74 20 69 20 3d 20 2a 28  yz;.  int i = *(
315a0 69 6e 74 2a 29 63 6c 69 65 6e 74 44 61 74 61 3b  int*)clientData;
315b0 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69 6e 74 20  .  int j;.  int 
315c0 77 5b 31 30 5d 3b 0a 20 20 69 6e 74 20 2a 61 3b  w[10];.  int *a;
315d0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
315e0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
315f0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
31600 2c 20 6f 62 6a 76 2c 20 22 54 59 50 45 22 29 3b  , objv, "TYPE");
31610 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
31620 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
31630 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
31640 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
31650 31 5d 2c 20 26 69 54 79 70 65 29 20 29 20 72 65  1], &iType) ) re
31660 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
31670 20 20 73 77 69 74 63 68 28 20 69 54 79 70 65 20    switch( iType 
31680 29 7b 0a 20 20 20 20 63 61 73 65 20 31 3a 20 7b  ){.    case 1: {
31690 0a 20 20 20 20 20 20 78 79 7a 20 3d 20 30 78 37  .      xyz = 0x7
316a0 66 66 66 66 66 30 30 20 2d 20 69 3b 0a 20 20 20  fffff00 - i;.   
316b0 20 20 20 78 79 7a 20 2b 3d 20 30 78 31 30 30 3b     xyz += 0x100;
316c0 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
316d0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
316e0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 78 79  Tcl_NewIntObj(xy
316f0 7a 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  z));.      break
31700 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
31710 20 32 3a 20 7b 0a 20 20 20 20 20 20 77 5b 31 5d   2: {.      w[1]
31720 20 3d 20 35 3b 0a 20 20 20 20 20 20 69 66 28 20   = 5;.      if( 
31730 77 5b 69 5d 3e 30 20 29 20 77 5b 31 5d 2b 2b 3b  w[i]>0 ) w[1]++;
31740 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
31750 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
31760 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 77 5b  Tcl_NewIntObj(w[
31770 31 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  1]));.      brea
31780 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
31790 65 20 33 3a 20 7b 0a 20 20 20 20 20 20 61 20 3d  e 3: {.      a =
317a0 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28   malloc( sizeof(
317b0 69 6e 74 29 2a 31 30 20 29 3b 0a 20 20 20 20 20  int)*10 );.     
317c0 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31 30 3b 20   for(j=0; j<10; 
317d0 6a 2b 2b 29 20 61 5b 6a 5d 20 3d 20 6a 3b 0a 20  j++) a[j] = j;. 
317e0 20 20 20 20 20 66 72 65 65 28 61 29 3b 0a 20 20       free(a);.  
317f0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
31800 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
31810 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 5b 69 5d 29  _NewIntObj(a[i])
31820 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
31830 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 34      }.    case 4
31840 3a 20 7b 0a 20 20 20 20 20 20 54 63 6c 5f 50 61  : {.      Tcl_Pa
31850 6e 69 63 28 22 44 65 6c 69 62 65 72 61 74 65 20  nic("Deliberate 
31860 70 61 6e 69 63 22 29 3b 0a 20 20 20 20 20 20 62  panic");.      b
31870 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
31880 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
31890 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  .}  ../*.** tclc
318a0 6d 64 3a 20 20 20 72 65 67 69 73 74 65 72 5f 64  md:   register_d
318b0 62 73 74 61 74 5f 76 74 61 62 20 44 42 0a 2a 2a  bstat_vtab DB.**
318c0 0a 2a 2a 20 43 61 75 73 65 20 74 68 65 20 64 62  .** Cause the db
318d0 73 74 61 74 20 76 69 72 74 75 61 6c 20 74 61 62  stat virtual tab
318e0 6c 65 20 74 6f 20 62 65 20 61 76 61 69 6c 61 62  le to be availab
318f0 6c 65 20 6f 6e 20 74 68 65 20 63 6f 6e 6e 65 63  le on the connec
31900 74 69 6f 6e 20 44 42 0a 2a 2f 0a 73 74 61 74 69  tion DB.*/.stati
31910 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
31920 41 50 49 20 74 65 73 74 5f 72 65 67 69 73 74 65  API test_registe
31930 72 5f 64 62 73 74 61 74 5f 76 74 61 62 28 0a 20  r_dbstat_vtab(. 
31940 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74   void *clientDat
31950 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
31960 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
31970 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
31980 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
31990 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
319a0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
319b0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
319c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 62 73 74  lt(interp, "dbst
319d0 61 74 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  at not available
319e0 20 62 65 63 61 75 73 65 20 6f 66 20 22 0a 20 20   because of ".  
319f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a00 20 20 20 20 20 20 20 20 20 22 53 51 4c 49 54 45           "SQLITE
31a10 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
31a20 4c 45 22 2c 20 28 76 6f 69 64 2a 29 30 29 3b 0a  LE", (void*)0);.
31a30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
31a40 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 74 72 75  OR;.#else.  stru
31a50 63 74 20 53 71 6c 69 74 65 44 62 20 7b 20 73 71  ct SqliteDb { sq
31a60 6c 69 74 65 33 20 2a 64 62 3b 20 7d 3b 0a 20 20  lite3 *db; };.  
31a70 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 54 63 6c  char *zDb;.  Tcl
31a80 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f  _CmdInfo cmdInfo
31a90 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
31aa0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
31ab0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
31ac0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
31ad0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
31ae0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 44  ERROR;.  }..  zD
31af0 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
31b00 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 69 66  g(objv[1]);.  if
31b10 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64  ( Tcl_GetCommand
31b20 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
31b30 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
31b40 20 20 20 73 71 6c 69 74 65 33 2a 20 64 62 20 3d     sqlite3* db =
31b50 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
31b60 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
31b70 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
31b80 20 20 20 20 73 71 6c 69 74 65 33 44 62 73 74 61      sqlite3Dbsta
31b90 74 52 65 67 69 73 74 65 72 28 64 62 29 3b 0a 20  tRegister(db);. 
31ba0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
31bb0 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  OK;.#endif /* SQ
31bc0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
31bd0 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  LTABLE */.}../*.
31be0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c  ** tclcmd:   sql
31bf0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20 44  ite3_db_config D
31c00 42 20 53 45 54 54 49 4e 47 20 56 41 4c 55 45 0a  B SETTING VALUE.
31c10 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c  **.** Invoke sql
31c20 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 29  ite3_db_config()
31c30 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20   for one of the 
31c40 73 65 74 74 69 6e 67 20 76 61 6c 75 65 73 2e 0a  setting values..
31c50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
31c60 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
31c70 5f 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66  _sqlite3_db_conf
31c80 69 67 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  ig(.  void *clie
31c90 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
31ca0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
31cb0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
31cc0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
31cd0 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  ].){.  static co
31ce0 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
31cf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
31d00 6d 65 3b 0a 20 20 20 20 69 6e 74 20 65 56 61 6c  me;.    int eVal
31d10 3b 0a 20 20 7d 20 61 53 65 74 74 69 6e 67 5b 5d  ;.  } aSetting[]
31d20 20 3d 20 7b 0a 20 20 20 20 7b 20 22 46 4b 45 59   = {.    { "FKEY
31d30 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
31d40 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
31d50 41 42 4c 45 5f 46 4b 45 59 20 7d 2c 0a 20 20 20  ABLE_FKEY },.   
31d60 20 7b 20 22 54 52 49 47 47 45 52 22 2c 20 20 20   { "TRIGGER",   
31d70 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43        SQLITE_DBC
31d80 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52 49  ONFIG_ENABLE_TRI
31d90 47 47 45 52 20 7d 2c 0a 20 20 20 20 7b 20 22 46  GGER },.    { "F
31da0 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52 22 2c 20  TS3_TOKENIZER", 
31db0 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
31dc0 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b  _ENABLE_FTS3_TOK
31dd0 45 4e 49 5a 45 52 20 7d 2c 0a 20 20 20 20 7b 20  ENIZER },.    { 
31de0 22 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 22  "LOAD_EXTENSION"
31df0 2c 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  ,  SQLITE_DBCONF
31e00 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45  IG_ENABLE_LOAD_E
31e10 58 54 45 4e 53 49 4f 4e 20 7d 2c 0a 20 20 7d 3b  XTENSION },.  };
31e20 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
31e30 76 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  v;.  const char 
31e40 2a 7a 53 65 74 74 69 6e 67 3b 0a 20 20 73 71 6c  *zSetting;.  sql
31e50 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
31e60 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
31e70 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
31e80 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
31e90 2c 20 22 44 42 20 53 45 54 54 49 4e 47 20 56 41  , "DB SETTING VA
31ea0 4c 55 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  LUE");.    retur
31eb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
31ec0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
31ed0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
31ee0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
31ef0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
31f00 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
31f10 53 65 74 74 69 6e 67 20 3d 20 54 63 6c 5f 47 65  Setting = Tcl_Ge
31f20 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
31f30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
31f40 73 74 72 67 6c 6f 62 28 22 53 51 4c 49 54 45 5f  strglob("SQLITE_
31f50 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29 3d 3d 30  *", zSetting)==0
31f60 20 29 20 7a 53 65 74 74 69 6e 67 20 2b 3d 20 37   ) zSetting += 7
31f70 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
31f80 73 74 72 67 6c 6f 62 28 22 44 42 43 4f 4e 46 49  strglob("DBCONFI
31f90 47 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29 3d  G_*", zSetting)=
31fa0 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b 3d  =0 ) zSetting +=
31fb0 20 39 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   9;.  if( sqlite
31fc0 33 5f 73 74 72 67 6c 6f 62 28 22 45 4e 41 42 4c  3_strglob("ENABL
31fd0 45 5f 2a 22 2c 20 7a 53 65 74 74 69 6e 67 29 3d  E_*", zSetting)=
31fe0 3d 30 20 29 20 7a 53 65 74 74 69 6e 67 20 2b 3d  =0 ) zSetting +=
31ff0 20 37 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   7;.  for(i=0; i
32000 3c 41 72 72 61 79 53 69 7a 65 28 61 53 65 74 74  <ArraySize(aSett
32010 69 6e 67 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ing); i++){.    
32020 69 66 28 20 73 74 72 63 6d 70 28 7a 53 65 74 74  if( strcmp(zSett
32030 69 6e 67 2c 20 61 53 65 74 74 69 6e 67 5b 69 5d  ing, aSetting[i]
32040 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 20 62 72 65  .zName)==0 ) bre
32050 61 6b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e  ak;.  }.  if( i>
32060 3d 41 72 72 61 79 53 69 7a 65 28 61 53 65 74 74  =ArraySize(aSett
32070 69 6e 67 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ing) ){.    Tcl_
32080 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
32090 65 72 70 2c 0a 20 20 20 20 20 20 54 63 6c 5f 4e  erp,.      Tcl_N
320a0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 75 6e 6b  ewStringObj("unk
320b0 6e 6f 77 6e 20 73 71 6c 69 74 65 33 5f 64 62 5f  nown sqlite3_db_
320c0 63 6f 6e 66 69 67 20 73 65 74 74 69 6e 67 22 2c  config setting",
320d0 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72   -1));.    retur
320e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
320f0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
32100 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
32110 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 29 20 29 20   objv[3], &v) ) 
32120 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
32130 3b 0a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  ;.  sqlite3_db_c
32140 6f 6e 66 69 67 28 64 62 2c 20 61 53 65 74 74 69  onfig(db, aSetti
32150 6e 67 5b 69 5d 2e 65 56 61 6c 2c 20 76 2c 20 26  ng[i].eVal, v, &
32160 76 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  v);.  Tcl_SetObj
32170 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
32180 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 76 29 29  cl_NewIntObj(v))
32190 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
321a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  K;.}../*.** Chan
321b0 67 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ge the name of t
321c0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
321d0 20 73 63 68 65 6d 61 20 66 72 6f 6d 20 22 6d 61   schema from "ma
321e0 69 6e 22 20 74 6f 20 22 69 63 65 63 75 62 65 22  in" to "icecube"
321f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
32200 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
32210 73 74 5f 64 62 63 6f 6e 66 69 67 5f 6d 61 69 6e  st_dbconfig_main
32220 64 62 6e 61 6d 65 5f 69 63 65 63 75 62 65 28 0a  dbname_icecube(.
32230 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
32240 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
32250 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
32260 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
32270 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
32280 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
32290 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 65 78 74  lite3 *db;.  ext
322a0 65 72 6e 20 69 6e 74 20 67 65 74 44 62 50 6f 69  ern int getDbPoi
322b0 6e 74 65 72 28 54 63 6c 5f 49 6e 74 65 72 70 2a  nter(Tcl_Interp*
322c0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 73  , const char*, s
322d0 71 6c 69 74 65 33 2a 2a 29 3b 0a 20 20 69 66 28  qlite3**);.  if(
322e0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
322f0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
32300 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
32310 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72 65 74  , "DB");.    ret
32320 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
32330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20   }else{.    if( 
32340 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
32350 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
32360 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
32370 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
32380 52 52 4f 52 3b 0a 20 20 20 20 72 63 20 3d 20 73  RROR;.    rc = s
32390 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
323a0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
323b0 4e 46 49 47 5f 4d 41 49 4e 44 42 4e 41 4d 45 2c  NFIG_MAINDBNAME,
323c0 20 22 69 63 65 63 75 62 65 22 29 3b 0a 20 20 20   "icecube");.   
323d0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
323e0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
323f0 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
32400 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
32410 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
32420 67 69 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20  gister commands 
32430 77 69 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74  with the TCL int
32440 65 72 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74  erpreter..*/.int
32450 20 53 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69   Sqlitetest1_Ini
32460 74 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  t(Tcl_Interp *in
32470 74 65 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20  terp){.  extern 
32480 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72  int sqlite3_sear
32490 63 68 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  ch_count;.  exte
324a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66  rn int sqlite3_f
324b0 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  ound_count;.  ex
324c0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
324d0 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74  _interrupt_count
324e0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
324f0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65  qlite3_open_file
32500 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
32510 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72   int sqlite3_sor
32520 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  t_count;.  exter
32530 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75  n int sqlite3_cu
32540 72 72 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20  rrent_time;.#if 
32550 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26  SQLITE_OS_UNIX &
32560 26 20 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c  & defined(__APPL
32570 45 5f 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45  E__) && SQLITE_E
32580 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54  NABLE_LOCKING_ST
32590 59 4c 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  YLE.  extern int
325a0 20 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f   sqlite3_hostid_
325b0 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78  num;.#endif.  ex
325c0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
325d0 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20  _max_blobsize;. 
325e0 20 65 78 74 65 72 6e 20 69 6e 74 20 53 51 4c 49   extern int SQLI
325f0 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65  TE_TCLAPI sqlite
32600 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
32610 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20  eReport(void*,. 
32620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32640 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74           Tcl_Int
32650 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a  erp*,int,Tcl_Obj
32660 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74  *CONST*);.  stat
32670 69 63 20 69 6e 74 20 69 5a 65 72 6f 20 3d 20 30  ic int iZero = 0
32680 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
32690 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
326a0 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 43  Name;.     Tcl_C
326b0 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20  mdProc *xProc;. 
326c0 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20   } aCmd[] = {.  
326d0 20 20 20 7b 20 22 64 62 5f 65 6e 74 65 72 22 2c     { "db_enter",
326e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
326f0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
32700 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20 20 20 20  oc*)db_enter    
32710 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
32720 20 20 20 7b 20 22 64 62 5f 6c 65 61 76 65 22 2c     { "db_leave",
32730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32740 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
32750 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20 20 20 20  oc*)db_leave    
32760 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
32770 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
32780 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20  rintf_int",     
32790 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
327a0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
327b0 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20 20  ntf_int    },.  
327c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
327d0 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20 20  rintf_int64",   
327e0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
327f0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
32800 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20 20  ntf_int64  },.  
32810 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
32820 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20 20 20  rintf_long",    
32830 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
32840 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
32850 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a 20 20  ntf_long   },.  
32860 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
32870 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20 20  rintf_str",     
32880 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
32890 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
328a0 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20 20  ntf_str    },.  
328b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e     { "sqlite3_sn
328c0 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20  printf_str",    
328d0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
328e0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70 72  oc*)sqlite3_snpr
328f0 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20 20  intf_str   },.  
32900 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
32910 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c 20  rintf_stronly", 
32920 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
32930 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
32940 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20 20  ntf_stronly},.  
32950 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
32960 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20 20  rintf_double",  
32970 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
32980 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
32990 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20 20  ntf_double },.  
329a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
329b0 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20 20  rintf_scaled",  
329c0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
329d0 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69  oc*)sqlite3_mpri
329e0 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20 20  ntf_scaled },.  
329f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
32a00 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 22  rintf_hexdouble"
32a10 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63  ,   (Tcl_CmdProc
32a20 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  *)sqlite3_mprint
32a30 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20 20  f_hexdouble},.  
32a40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
32a50 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20 20  rintf_z_test",  
32a60 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
32a70 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66  oc*)test_mprintf
32a80 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  _z        },.   
32a90 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70 72    { "sqlite3_mpr
32aa0 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20 20  intf_n_test",   
32ab0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
32ac0 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  c*)test_mprintf_
32ad0 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  n        },.    
32ae0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70 72   { "sqlite3_snpr
32af0 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20 20  intf_int",      
32b00 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
32b10 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f  *)test_snprintf_
32b20 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  int     },.     
32b30 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  { "sqlite3_last_
32b40 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20 20  insert_rowid",  
32b50 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
32b60 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64  )test_last_rowid
32b70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
32b80 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70   "sqlite3_exec_p
32b90 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20 20  rintf",         
32ba0 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
32bb0 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66  test_exec_printf
32bc0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
32bd0 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65  "sqlite3_exec_he
32be0 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  x",             
32bf0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
32c00 65 73 74 5f 65 78 65 63 5f 68 65 78 20 20 20 20  est_exec_hex    
32c10 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
32c20 73 71 6c 69 74 65 33 5f 65 78 65 63 22 2c 20 20  sqlite3_exec",  
32c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32c40 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
32c50 73 74 5f 65 78 65 63 20 20 20 20 20 20 20 20 20  st_exec         
32c60 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
32c70 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 22 2c  qlite3_exec_nr",
32c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
32c90 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
32ca0 74 5f 65 78 65 63 5f 6e 72 20 20 20 20 20 20 20  t_exec_nr       
32cb0 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51     },.#ifndef SQ
32cc0 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41  LITE_OMIT_GET_TA
32cd0 42 4c 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  BLE.     { "sqli
32ce0 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
32cf0 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54 63 6c  intf",      (Tcl
32d00 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 67  _CmdProc*)test_g
32d10 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 20  et_table_printf 
32d20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
32d30 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 22   "sqlite3_close"
32d40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
32d50 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
32d60 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73  sqlite_test_clos
32d70 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  e     },.     { 
32d80 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76  "sqlite3_close_v
32d90 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  2",             
32da0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
32db0 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65  qlite_test_close
32dc0 5f 76 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  _v2  },.     { "
32dd0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
32de0 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20  unction",       
32df0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
32e00 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
32e10 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  on  },.     { "s
32e20 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67  qlite3_create_ag
32e30 67 72 65 67 61 74 65 22 2c 20 20 20 20 20 20 28  gregate",      (
32e40 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
32e50 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
32e60 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  te },.     { "sq
32e70 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74 65  lite_register_te
32e80 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28 54  st_function", (T
32e90 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
32ea0 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 20 20  _register_func  
32eb0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
32ec0 69 74 65 5f 61 62 6f 72 74 22 2c 20 20 20 20 20  ite_abort",     
32ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
32ee0 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74  l_CmdProc*)sqlit
32ef0 65 5f 61 62 6f 72 74 20 20 20 20 20 20 20 20 20  e_abort         
32f00 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
32f10 74 65 5f 62 69 6e 64 22 2c 20 20 20 20 20 20 20  te_bind",       
32f20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
32f30 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62  _CmdProc*)test_b
32f40 69 6e 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ind             
32f50 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72 65 61 6b  },.     { "break
32f60 70 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20  point",         
32f70 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
32f80 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 72  CmdProc*)test_br
32f90 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20 7d  eakpoint       }
32fa0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
32fb0 33 5f 6b 65 79 22 2c 20 20 20 20 20 20 20 20 20  3_key",         
32fc0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
32fd0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65 79  mdProc*)test_key
32fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
32ff0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33000 5f 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20 20  _rekey",        
33010 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
33020 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b 65  dProc*)test_reke
33030 79 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  y            },.
33040 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 73       { "sqlite_s
33050 65 74 5f 6d 61 67 69 63 22 2c 20 20 20 20 20 20  et_magic",      
33060 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
33070 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65 74  Proc*)sqlite_set
33080 5f 6d 61 67 69 63 20 20 20 20 20 20 7d 2c 0a 20  _magic      },. 
33090 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 69      { "sqlite3_i
330a0 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20 20 20  nterrupt",      
330b0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
330c0 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74 65 72 72  roc*)test_interr
330d0 75 70 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  upt        },.  
330e0 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c     { "sqlite_del
330f0 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20  ete_function",  
33100 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
33110 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63 74  oc*)delete_funct
33120 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  ion       },.   
33130 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c 65    { "sqlite_dele
33140 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20 20  te_collation",  
33150 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
33160 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74  c*)delete_collat
33170 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  ion      },.    
33180 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f   { "sqlite3_get_
33190 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20 20  autocommit",    
331a0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
331b0 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  *)get_autocommit
331c0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
331d0 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 61 63 6b  { "sqlite3_stack
331e0 5f 75 73 65 64 22 2c 20 20 20 20 20 20 20 20 20  _used",         
331f0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
33200 29 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64  )test_stack_used
33210 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
33220 20 22 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74   "sqlite3_busy_t
33230 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20 20  imeout",        
33240 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
33250 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f 75  test_busy_timeou
33260 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  t     },.     { 
33270 22 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20  "printf",       
33280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33290 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
332a0 65 73 74 5f 70 72 69 6e 74 66 20 20 20 20 20 20  est_printf      
332b0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
332c0 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 22 2c  sqlite3IoTrace",
332d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
332e0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
332f0 5f 69 6f 5f 74 72 61 63 65 20 20 20 20 20 20 20  _io_trace       
33300 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 63 6c 61    },.     { "cla
33310 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72  ng_sanitize_addr
33320 65 73 73 22 2c 20 20 20 20 20 20 20 20 28 54 63  ess",        (Tc
33330 6c 5f 43 6d 64 50 72 6f 63 2a 29 63 6c 61 6e 67  l_CmdProc*)clang
33340 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65 73  _sanitize_addres
33350 73 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74  s },.  };.  stat
33360 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
33370 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
33380 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f     Tcl_ObjCmdPro
33390 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20 76  c *xProc;.     v
333a0 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 3b  oid *clientData;
333b0 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20 3d  .  } aObjCmd[] =
333c0 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74   {.     { "sqlit
333d0 65 33 5f 64 62 5f 63 6f 6e 66 69 67 22 2c 20 20  e3_db_config",  
333e0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
333f0 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
33400 67 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  g, 0 },.     { "
33410 62 61 64 5f 62 65 68 61 76 69 6f 72 22 2c 20 20  bad_behavior",  
33420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33430 74 65 73 74 5f 62 61 64 5f 62 65 68 61 76 69 6f  test_bad_behavio
33440 72 2c 20 20 28 76 6f 69 64 2a 29 26 69 5a 65 72  r,  (void*)&iZer
33450 6f 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 67  o },.     { "reg
33460 69 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61  ister_dbstat_vta
33470 62 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  b",          tes
33480 74 5f 72 65 67 69 73 74 65 72 5f 64 62 73 74 61  t_register_dbsta
33490 74 5f 76 74 61 62 20 20 7d 2c 0a 20 20 20 20 20  t_vtab  },.     
334a0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  { "sqlite3_conne
334b0 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20  ction_pointer", 
334c0 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f     get_sqlite_po
334d0 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20  inter, 0 },.    
334e0 20 7b 20 22 69 6e 74 61 72 72 61 79 5f 61 64 64   { "intarray_add
334f0 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
33500 20 20 20 20 74 65 73 74 5f 69 6e 74 61 72 72 61      test_intarra
33510 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a 20 20 20  y_addr, 0 },.   
33520 20 20 7b 20 22 69 6e 74 36 34 61 72 72 61 79 5f    { "int64array_
33530 61 64 64 72 22 2c 20 20 20 20 20 20 20 20 20 20  addr",          
33540 20 20 20 20 20 74 65 73 74 5f 69 6e 74 36 34 61       test_int64a
33550 72 72 61 79 5f 61 64 64 72 2c 20 30 20 7d 2c 0a  rray_addr, 0 },.
33560 20 20 20 20 20 7b 20 22 64 6f 75 62 6c 65 61 72       { "doublear
33570 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20 20  ray_addr",      
33580 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 6f 75          test_dou
33590 62 6c 65 61 72 72 61 79 5f 61 64 64 72 2c 20 30  blearray_addr, 0
335a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74   },.     { "text
335b0 61 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20  array_addr",    
335c0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
335d0 5f 74 65 78 74 61 72 72 61 79 5f 61 64 64 72 2c  _textarray_addr,
335e0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
335f0 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c  lite3_bind_int",
33600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
33610 73 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20  st_bind_int,    
33620 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73    0 },.     { "s
33630 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f  qlite3_bind_zero
33640 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 74  blob",         t
33650 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  est_bind_zeroblo
33660 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  b, 0 },.     { "
33670 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
33680 6f 62 6c 6f 62 36 34 22 2c 20 20 20 20 20 20 20  oblob64",       
33690 74 65 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c  test_bind_zerobl
336a0 6f 62 36 34 2c 20 30 20 7d 2c 0a 20 20 20 20 20  ob64, 0 },.     
336b0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
336c0 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  int64",         
336d0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74     test_bind_int
336e0 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  64,    0 },.    
336f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
33700 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20  _double",       
33710 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 64 6f      test_bind_do
33720 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20  uble,   0 },.   
33730 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
33740 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20 20 20 20  d_null",        
33750 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 6e       test_bind_n
33760 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ull     ,0 },.  
33770 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
33780 6e 64 5f 74 65 78 74 22 2c 20 20 20 20 20 20 20  nd_text",       
33790 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
337a0 74 65 78 74 20 20 20 20 20 2c 30 20 7d 2c 0a 20  text     ,0 },. 
337b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
337c0 69 6e 64 5f 74 65 78 74 31 36 22 2c 20 20 20 20  ind_text16",    
337d0 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
337e0 5f 74 65 78 74 31 36 20 20 20 2c 30 20 7d 2c 0a  _text16   ,0 },.
337f0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33800 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20 20 20 20  bind_blob",     
33810 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
33820 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30 20 7d 2c  d_blob     ,0 },
33830 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33840 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
33850 63 6f 75 6e 74 22 2c 20 20 74 65 73 74 5f 62 69  count",  test_bi
33860 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75  nd_parameter_cou
33870 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  nt, 0},.     { "
33880 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72  sqlite3_bind_par
33890 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c 20 20 20  ameter_name",   
338a0 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65  test_bind_parame
338b0 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20  ter_name,  0},. 
338c0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
338d0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
338e0 64 65 78 22 2c 20 20 74 65 73 74 5f 62 69 6e 64  dex",  test_bind
338f0 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
33900 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
33910 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64  lite3_clear_bind
33920 69 6e 67 73 22 2c 20 20 20 20 20 20 20 20 74 65  ings",        te
33930 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  st_clear_binding
33940 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73  s, 0},.     { "s
33950 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c 20 20  qlite3_sleep",  
33960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
33970 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20 20 20  est_sleep,      
33980 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
33990 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 22  sqlite3_errcode"
339a0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
339b0 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20 20 20  test_errcode    
339c0 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
339d0 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65  "sqlite3_extende
339e0 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20 20 20  d_errcode",     
339f0 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65   test_ex_errcode
33a00 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
33a10 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   "sqlite3_errmsg
33a20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
33a30 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20 20 20    test_errmsg   
33a40 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
33a50 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  { "sqlite3_errms
33a60 67 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  g16",           
33a70 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36     test_errmsg16
33a80 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
33a90 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65 6e   { "sqlite3_open
33aa0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
33ab0 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20 20 20      test_open   
33ac0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
33ad0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70 65    { "sqlite3_ope
33ae0 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20 20 20  n16",           
33af0 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 31 36       test_open16
33b00 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
33b10 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
33b20 65 6e 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  en_v2",         
33b30 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 5f        test_open_
33b40 76 32 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  v2       ,0 },. 
33b50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
33b60 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20 20 20  omplete16",     
33b70 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6d 70         test_comp
33b80 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d 2c 0a  lete16    ,0 },.
33b90 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33ba0 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20 20 20  _prepare",      
33bb0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70 72           test_pr
33bc0 65 70 61 72 65 20 20 20 20 20 20 20 2c 30 20 7d  epare       ,0 }
33bd0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
33be0 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20 20 20  3_prepare16",   
33bf0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 70            test_p
33c00 72 65 70 61 72 65 31 36 20 20 20 20 20 2c 30 20  repare16     ,0 
33c10 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
33c20 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22 2c 20  e3_prepare_v2", 
33c30 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
33c40 70 72 65 70 61 72 65 5f 76 32 20 20 20 20 2c 30  prepare_v2    ,0
33c50 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
33c60 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  te3_prepare_tkt3
33c70 31 33 34 22 2c 20 20 20 20 20 20 20 74 65 73 74  134",       test
33c80 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34  _prepare_tkt3134
33c90 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  , 0},.     { "sq
33ca0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 5f  lite3_prepare16_
33cb0 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 74 65  v2",          te
33cc0 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76 32 20  st_prepare16_v2 
33cd0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
33ce0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 22  qlite3_finalize"
33cf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74  ,              t
33d00 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20 20 20  est_finalize    
33d10 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
33d20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
33d30 74 75 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  tus",           
33d40 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75 73  test_stmt_status
33d50 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
33d60 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74 22 2c  "sqlite3_reset",
33d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d80 20 74 65 73 74 5f 72 65 73 65 74 20 20 20 20 20   test_reset     
33d90 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
33da0 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65   "sqlite3_expire
33db0 64 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  d",             
33dc0 20 20 74 65 73 74 5f 65 78 70 69 72 65 64 20 20    test_expired  
33dd0 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
33de0 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61 6e 73  { "sqlite3_trans
33df0 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20  fer_bindings",  
33e00 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72     test_transfer
33e10 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20 20 20  _bind ,0 },.    
33e20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68 61 6e   { "sqlite3_chan
33e30 67 65 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  ges",           
33e40 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67 65 73      test_changes
33e50 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
33e60 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 65    { "sqlite3_ste
33e70 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
33e80 20 20 20 20 20 74 65 73 74 5f 73 74 65 70 20 20       test_step  
33e90 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
33ea0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 71     { "sqlite3_sq
33eb0 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  l",             
33ec0 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 20 20        test_sql  
33ed0 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
33ee0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
33ef0 78 70 61 6e 64 65 64 5f 73 71 6c 22 2c 20 20 20  xpanded_sql",   
33f00 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f 73         test_ex_s
33f10 71 6c 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ql        ,0 },.
33f20 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
33f30 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20 20  next_stmt",     
33f40 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65 78          test_nex
33f50 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d 2c  t_stmt     ,0 },
33f60 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
33f70 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22 2c  _stmt_readonly",
33f80 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74           test_st
33f90 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20 7d  mt_readonly ,0 }
33fa0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
33fb0 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20 20 20  3_stmt_busy",   
33fc0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73            test_s
33fd0 74 6d 74 5f 62 75 73 79 20 20 20 20 20 2c 30 20  tmt_busy     ,0 
33fe0 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 73 5f  },.     { "uses_
33ff0 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20 20  stmt_journal",  
34000 20 20 20 20 20 20 20 20 20 20 20 75 73 65 73 5f             uses_
34010 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30 20  stmt_journal ,0 
34020 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
34030 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
34040 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73 74  ry",        test
34050 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c  _release_memory,
34060 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
34070 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65  "sqlite3_db_rele
34080 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20  ase_memory",    
34090 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65   test_db_release
340a0 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20 20  _memory,  0},.  
340b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62     { "sqlite3_db
340c0 5f 63 61 63 68 65 66 6c 75 73 68 22 2c 20 20 20  _cacheflush",   
340d0 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f 63 61        test_db_ca
340e0 63 68 65 66 6c 75 73 68 2c 20 20 20 20 20 20 30  cheflush,      0
340f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34100 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 22  e3_system_errno"
34110 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ,          test_
34120 73 79 73 74 65 6d 5f 65 72 72 6e 6f 2c 20 20 20  system_errno,   
34130 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
34140 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
34150 61 6d 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ame",           
34160 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  test_db_filename
34170 2c 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20  ,        0},.   
34180 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f    { "sqlite3_db_
34190 72 65 61 64 6f 6e 6c 79 22 2c 20 20 20 20 20 20  readonly",      
341a0 20 20 20 20 20 74 65 73 74 5f 64 62 5f 72 65 61       test_db_rea
341b0 64 6f 6e 6c 79 2c 20 20 20 20 20 20 20 20 30 7d  donly,        0}
341c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
341d0 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
341e0 74 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73  t",       test_s
341f0 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 2c 20  oft_heap_limit, 
34200 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
34210 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
34220 65 61 6e 75 70 22 2c 20 20 20 20 20 20 20 20 74  eanup",        t
34230 65 73 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  est_thread_clean
34240 75 70 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20  up,     0},.    
34250 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65   { "sqlite3_page
34260 72 5f 72 65 66 63 6f 75 6e 74 73 22 2c 20 20 20  r_refcounts",   
34270 20 20 20 20 74 65 73 74 5f 70 61 67 65 72 5f 72      test_pager_r
34280 65 66 63 6f 75 6e 74 73 2c 20 20 20 20 30 7d 2c  efcounts,    0},
34290 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ..     { "sqlite
342a0 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
342b0 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 6c  ",        test_l
342c0 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 2c 20 20  oad_extension,  
342d0 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73     0},.     { "s
342e0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f  qlite3_enable_lo
342f0 61 64 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74  ad_extension", t
34300 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 2c  est_enable_load,
34310 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
34320 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65   { "sqlite3_exte
34330 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
34340 73 22 2c 20 74 65 73 74 5f 65 78 74 65 6e 64 65  s", test_extende
34350 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 2c 20  d_result_codes, 
34360 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
34370 74 65 33 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20  te3_limit",     
34380 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
34390 5f 6c 69 6d 69 74 2c 20 20 20 20 20 20 20 20 20  _limit,         
343a0 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20          0},.    
343b0 20 7b 20 22 64 62 63 6f 6e 66 69 67 5f 6d 61 69   { "dbconfig_mai
343c0 6e 64 62 6e 61 6d 65 5f 69 63 65 63 75 62 65 22  ndbname_icecube"
343d0 2c 20 20 20 74 65 73 74 5f 64 62 63 6f 6e 66 69  ,   test_dbconfi
343e0 67 5f 6d 61 69 6e 64 62 6e 61 6d 65 5f 69 63 65  g_maindbname_ice
343f0 63 75 62 65 20 7d 2c 0a 0a 20 20 20 20 20 7b 20  cube },..     { 
34400 22 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65  "save_prng_state
34410 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
34420 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74 65   save_prng_state
34430 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  ,    0 },.     {
34440 20 22 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73   "restore_prng_s
34450 74 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20  tate",          
34460 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73    restore_prng_s
34470 74 61 74 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20  tate, 0 },.     
34480 7b 20 22 72 65 73 65 74 5f 70 72 6e 67 5f 73 74  { "reset_prng_st
34490 61 74 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ate",           
344a0 20 20 20 72 65 73 65 74 5f 70 72 6e 67 5f 73 74     reset_prng_st
344b0 61 74 65 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20  ate,   0 },.    
344c0 20 7b 20 22 64 61 74 61 62 61 73 65 5f 6e 65 76   { "database_nev
344d0 65 72 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20  er_corrupt",    
344e0 20 20 20 20 64 61 74 61 62 61 73 65 5f 6e 65 76      database_nev
344f0 65 72 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a  er_corrupt, 0},.
34500 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65       { "database
34510 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 22  _may_be_corrupt"
34520 2c 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  ,       database
34530 5f 6d 61 79 5f 62 65 5f 63 6f 72 72 75 70 74 2c  _may_be_corrupt,
34540 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 6f 70 74   0},.     { "opt
34550 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f  imization_contro
34560 6c 22 2c 20 20 20 20 20 20 20 20 20 20 6f 70 74  l",          opt
34570 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f  imization_contro
34580 6c 2c 30 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45  l,0},.#if SQLITE
34590 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20 7b 20 22  _OS_WIN.     { "
345a0 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69 6c 65 22  lock_win32_file"
345b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
345c0 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 2c  win32_file_lock,
345d0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20      0 },.     { 
345e0 22 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70 61  "exists_win32_pa
345f0 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  th",            
34600 20 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61   win32_exists_pa
34610 74 68 2c 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b  th,  0 },.     {
34620 20 22 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c   "find_win32_fil
34630 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
34640 20 20 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c    win32_find_fil
34650 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 20  e,    0 },.     
34660 7b 20 22 64 65 6c 65 74 65 5f 77 69 6e 33 32 5f  { "delete_win32_
34670 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  file",          
34680 20 20 20 77 69 6e 33 32 5f 64 65 6c 65 74 65 5f     win32_delete_
34690 66 69 6c 65 2c 20 20 30 20 7d 2c 0a 20 20 20 20  file,  0 },.    
346a0 20 7b 20 22 6d 61 6b 65 5f 77 69 6e 33 32 5f 64   { "make_win32_d
346b0 69 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ir",            
346c0 20 20 20 20 77 69 6e 33 32 5f 6d 6b 64 69 72 2c      win32_mkdir,
346d0 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20          0 },.   
346e0 20 20 7b 20 22 72 65 6d 6f 76 65 5f 77 69 6e 33    { "remove_win3
346f0 32 5f 64 69 72 22 2c 20 20 20 20 20 20 20 20 20  2_dir",         
34700 20 20 20 20 20 77 69 6e 33 32 5f 72 6d 64 69 72       win32_rmdir
34710 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 23 65  ,        0 },.#e
34720 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 74 63 6c  ndif.     { "tcl
34730 5f 6f 62 6a 70 72 6f 63 22 2c 20 20 20 20 20 20  _objproc",      
34740 20 20 20 20 20 20 20 20 20 20 20 20 20 72 75 6e               run
34750 41 73 4f 62 6a 50 72 6f 63 2c 20 20 20 20 20 20  AsObjProc,      
34760 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 73   0 },..     /* s
34770 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 2a 28  qlite3_column_*(
34780 29 20 41 50 49 20 2a 2f 0a 20 20 20 20 20 7b 20  ) API */.     { 
34790 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
347a0 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20  count",         
347b0 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75   test_column_cou
347c0 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  nt  ,0 },.     {
347d0 20 22 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 63   "sqlite3_data_c
347e0 6f 75 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  ount",          
347f0 20 20 74 65 73 74 5f 64 61 74 61 5f 63 6f 75 6e    test_data_coun
34800 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  t    ,0 },.     
34810 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
34820 6e 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 20  n_type",        
34830 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 74     test_column_t
34840 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  ype   ,0 },.    
34850 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
34860 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20  mn_blob",       
34870 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
34880 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a 20 20 20  blob   ,0 },.   
34890 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
348a0 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  umn_double",    
348b0 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e       test_column
348c0 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c 0a 20 20  _double ,0 },.  
348d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
348e0 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20 20 20 20  lumn_int64",    
348f0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
34900 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d 2c 0a 20  n_int64  ,0 },. 
34910 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
34920 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20 20 20 74  olumn_text",   t
34930 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20  est_stmt_utf8,  
34940 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
34950 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c 0a 20 20  olumn_text },.  
34960 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
34970 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20 20 74 65  lumn_name",   te
34980 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 20 20 28  st_stmt_utf8,  (
34990 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
349a0 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a 20 20 20  lumn_name },.   
349b0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c    { "sqlite3_col
349c0 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20 74 65 73  umn_int",    tes
349d0 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76  t_stmt_int,   (v
349e0 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
349f0 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20 20 20 20  umn_int  },.    
34a00 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
34a10 6d 6e 5f 62 79 74 65 73 22 2c 20 20 74 65 73 74  mn_bytes",  test
34a20 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20 28 76 6f  _stmt_int,   (vo
34a30 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
34a40 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23 69 66 6e 64  mn_bytes},.#ifnd
34a50 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
34a60 45 43 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22  ECLTYPE.     { "
34a70 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
34a80 65 63 6c 74 79 70 65 22 2c 74 65 73 74 5f 73 74  ecltype",test_st
34a90 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
34aa0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
34ab0 63 6c 74 79 70 65 7d 2c 0a 23 65 6e 64 69 66 0a  cltype},.#endif.
34ac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
34ad0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
34ae0 44 41 54 41 0a 7b 20 22 73 71 6c 69 74 65 33 5f  DATA.{ "sqlite3_
34af0 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f  column_database_
34b00 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f  name",test_stmt_
34b10 75 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69  utf8,(void*)sqli
34b20 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62  te3_column_datab
34b30 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71  ase_name},.{ "sq
34b40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
34b50 6c 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  le_name",test_st
34b60 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
34b70 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
34b80 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20 22 73 71  ble_name},.{ "sq
34b90 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
34ba0 67 69 6e 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73  gin_name",test_s
34bb0 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29  tmt_utf8,(void*)
34bc0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f  sqlite3_column_o
34bd0 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a 23 65 6e  rigin_name},.#en
34be0 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  dif..#ifndef SQL
34bf0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
34c00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
34c10 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 22 2c 20  olumn_bytes16", 
34c20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 28  test_stmt_int, (
34c30 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
34c40 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20 7d 2c 0a  lumn_bytes16 },.
34c50 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34c60 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 22 2c 20  column_text16", 
34c70 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36   test_stmt_utf16
34c80 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
34c90 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36 7d 2c  _column_text16},
34ca0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34cb0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 22 2c  _column_name16",
34cc0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31    test_stmt_utf1
34cd0 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  6, (void*)sqlite
34ce0 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31 36 7d  3_column_name16}
34cf0 2c 0a 20 20 20 20 20 7b 20 22 61 64 64 5f 61 6c  ,.     { "add_al
34d00 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c  ignment_test_col
34d10 6c 61 74 69 6f 6e 73 22 2c 20 61 64 64 5f 61 6c  lations", add_al
34d20 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c  ignment_test_col
34d30 6c 61 74 69 6f 6e 73 2c 20 30 20 20 20 20 20 20  lations, 0      
34d40 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  },.#ifndef SQLIT
34d50 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a  E_OMIT_DECLTYPE.
34d60 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34d70 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31  column_decltype1
34d80 36 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  6",test_stmt_utf
34d90 31 36 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  16,(void*)sqlite
34da0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
34db0 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66  e16},.#endif.#if
34dc0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
34dd0 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54  E_COLUMN_METADAT
34de0 41 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  A.{"sqlite3_colu
34df0 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65  mn_database_name
34e00 31 36 22 2c 0a 20 20 74 65 73 74 5f 73 74 6d 74  16",.  test_stmt
34e10 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73  _utf16, (void*)s
34e20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
34e30 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 7d 2c 0a  tabase_name16},.
34e40 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  {"sqlite3_column
34e50 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 22 2c 20  _table_name16", 
34e60 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c  test_stmt_utf16,
34e70 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
34e80 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
34e90 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f  e16},.{"sqlite3_
34ea0 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
34eb0 6d 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74  me16", test_stmt
34ec0 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73  _utf16, (void*)s
34ed0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72  qlite3_column_or
34ee0 69 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 23 65  igin_name16},.#e
34ef0 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20 20 20 20  ndif.#endif.    
34f00 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
34f10 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 22  te_collation_v2"
34f20 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f 63 6f  , test_create_co
34f30 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c  llation_v2, 0 },
34f40 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34f50 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 22  _global_recover"
34f60 2c 20 20 20 20 20 74 65 73 74 5f 67 6c 6f 62 61  ,     test_globa
34f70 6c 5f 72 65 63 6f 76 65 72 2c 20 30 20 20 20 7d  l_recover, 0   }
34f80 2c 0a 20 20 20 20 20 7b 20 22 77 6f 72 6b 69 6e  ,.     { "workin
34f90 67 5f 36 34 62 69 74 5f 69 6e 74 22 2c 20 20 20  g_64bit_int",   
34fa0 20 20 20 20 20 20 20 77 6f 72 6b 69 6e 67 5f 36         working_6
34fb0 34 62 69 74 5f 69 6e 74 2c 20 20 20 30 20 20 20  4bit_int,   0   
34fc0 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 75  },.     { "vfs_u
34fd0 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c 20 20 20 20  nlink_test",    
34fe0 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e 6c 69          vfs_unli
34ff0 6e 6b 5f 74 65 73 74 2c 20 20 20 20 20 30 20 20  nk_test,     0  
35000 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73 5f   },.     { "vfs_
35010 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 22 2c 20  initfail_test", 
35020 20 20 20 20 20 20 20 20 20 76 66 73 5f 69 6e 69           vfs_ini
35030 74 66 61 69 6c 5f 74 65 73 74 2c 20 20 20 30 20  tfail_test,   0 
35040 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66 73    },.     { "vfs
35050 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 22  _unregister_all"
35060 2c 20 20 20 20 20 20 20 20 20 76 66 73 5f 75 6e  ,         vfs_un
35070 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20 30  register_all,  0
35080 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66     },.     { "vf
35090 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
350a0 22 2c 20 20 20 20 20 20 20 20 20 76 66 73 5f 72  ",         vfs_r
350b0 65 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c 20 20  eregister_all,  
350c0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
350d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
350e0 22 2c 20 20 20 20 20 20 20 20 20 20 66 69 6c 65  ",          file
350f0 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 2c 20 20  _control_test,  
35100 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
35110 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73  file_control_las
35120 74 65 72 72 6e 6f 5f 74 65 73 74 22 2c 20 66 69  terrno_test", fi
35130 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65  le_control_laste
35140 72 72 6e 6f 5f 74 65 73 74 2c 20 20 30 20 20 20  rrno_test,  0   
35150 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
35160 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78  control_lockprox
35170 79 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f  y_test", file_co
35180 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
35190 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20  test,  0   },.  
351a0 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
351b0 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73  ol_chunksize_tes
351c0 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  t", file_control
351d0 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 2c  _chunksize_test,
351e0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
351f0 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69  "file_control_si
35200 7a 65 68 69 6e 74 5f 74 65 73 74 22 2c 20 20 66  zehint_test",  f
35210 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65  ile_control_size
35220 68 69 6e 74 5f 74 65 73 74 2c 20 20 20 30 20 20  hint_test,   0  
35230 20 7d 2c 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   },.#if SQLITE_O
35240 53 5f 57 49 4e 0a 20 20 20 20 20 7b 20 22 66 69  S_WIN.     { "fi
35250 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32  le_control_win32
35260 5f 61 76 5f 72 65 74 72 79 22 2c 20 66 69 6c 65  _av_retry", file
35270 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
35280 76 5f 72 65 74 72 79 2c 20 20 30 20 20 20 7d 2c  v_retry,  0   },
35290 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
352a0 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f  ntrol_win32_set_
352b0 68 61 6e 64 6c 65 22 2c 20 66 69 6c 65 5f 63 6f  handle", file_co
352c0 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74 5f  ntrol_win32_set_
352d0 68 61 6e 64 6c 65 2c 20 30 20 20 7d 2c 0a 23 65  handle, 0  },.#e
352e0 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 66 69 6c  ndif.     { "fil
352f0 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73  e_control_persis
35300 74 5f 77 61 6c 22 2c 20 20 20 20 66 69 6c 65 5f  t_wal",    file_
35310 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
35320 77 61 6c 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a  wal,     0   },.
35330 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e       { "file_con
35340 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f  trol_powersafe_o
35350 76 65 72 77 72 69 74 65 22 2c 66 69 6c 65 5f 63  verwrite",file_c
35360 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65  ontrol_powersafe
35370 5f 6f 76 65 72 77 72 69 74 65 2c 30 7d 2c 0a 20  _overwrite,0},. 
35380 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
35390 72 6f 6c 5f 76 66 73 6e 61 6d 65 22 2c 20 20 20  rol_vfsname",   
353a0 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f       file_contro
353b0 6c 5f 76 66 73 6e 61 6d 65 2c 20 20 20 20 20 20  l_vfsname,      
353c0 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
353d0 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74   "file_control_t
353e0 65 6d 70 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20  empfilename",   
353f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d  file_control_tem
35400 70 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 30 20  pfilename,    0 
35410 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
35420 69 74 65 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20  ite3_vfs_list", 
35430 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 6c 69            vfs_li
35440 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20  st,     0   },. 
35450 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
35460 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
35470 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65 5f  2", test_create_
35480 66 75 6e 63 74 69 6f 6e 5f 76 32 2c 20 30 20 7d  function_v2, 0 }
35490 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75 6e 63 74  ,..     /* Funct
354a0 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a  ions from os.h *
354b0 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
354c0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
354d0 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
354e0 6c 61 74 65 22 2c 20 20 20 20 20 20 20 20 74 65  late",        te
354f0 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20  st_collate, 0   
35500 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
35510 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c   { "add_test_col
35520 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c 20 74 65  late_needed", te
35530 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65  st_collate_neede
35540 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20 20 20 20  d, 0     },.    
35550 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 66 75 6e   { "add_test_fun
35560 63 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 74 65  ction",       te
35570 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20  st_function, 0  
35580 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
35590 20 7b 20 22 61 64 64 5f 74 65 73 74 5f 75 74 66   { "add_test_utf
355a0 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 22 2c 20  16bin_collate", 
355b0 20 20 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e     test_utf16bin
355c0 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20  _collate, 0     
355d0 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20     },.#endif.   
355e0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 65 73    { "sqlite3_tes
355f0 74 5f 65 72 72 73 74 72 22 2c 20 20 20 20 20 74  t_errstr",     t
35600 65 73 74 5f 65 72 72 73 74 72 2c 20 30 20 20 20  est_errstr, 0   
35610 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
35620 20 20 7b 20 22 74 63 6c 5f 76 61 72 69 61 62 6c    { "tcl_variabl
35630 65 5f 74 79 70 65 22 2c 20 20 20 20 20 20 20 74  e_type",       t
35640 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
35650 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a 23 69 66  , 0       },.#if
35660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
35670 5f 53 48 41 52 45 44 5f 43 41 43 48 45 0a 20 20  _SHARED_CACHE.  
35680 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
35690 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68  able_shared_cach
356a0 65 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  e", test_enable_
356b0 73 68 61 72 65 64 2c 20 30 20 20 7d 2c 0a 20 20  shared, 0  },.  
356c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 68     { "sqlite3_sh
356d0 61 72 65 64 5f 63 61 63 68 65 5f 72 65 70 6f 72  ared_cache_repor
356e0 74 22 2c 20 73 71 6c 69 74 65 33 42 74 72 65 65  t", sqlite3Btree
356f0 53 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72  SharedCacheRepor
35700 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  t, 0},.#endif.  
35710 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69     { "sqlite3_li
35720 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 22  bversion_number"
35730 2c 20 74 65 73 74 5f 6c 69 62 76 65 72 73 69 6f  , test_libversio
35740 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20 7d 2c 0a  n_number, 0  },.
35750 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35760 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
35770 61 64 61 74 61 22 2c 20 74 65 73 74 5f 74 61 62  adata", test_tab
35780 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
35790 74 61 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64 65  ta, 0  },.#ifnde
357a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e  f SQLITE_OMIT_IN
357b0 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73  CRBLOB.     { "s
357c0 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70  qlite3_blob_reop
357d0 65 6e 22 2c 20 74 65 73 74 5f 62 6c 6f 62 5f 72  en", test_blob_r
357e0 65 6f 70 65 6e 2c 20 30 20 20 7d 2c 0a 23 65 6e  eopen, 0  },.#en
357f0 64 69 66 0a 20 20 20 20 20 7b 20 22 70 63 61 63  dif.     { "pcac
35800 68 65 5f 73 74 61 74 73 22 2c 20 20 20 20 20 20  he_stats",      
35810 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73 74 61   test_pcache_sta
35820 74 73 2c 20 30 20 20 7d 2c 0a 23 69 66 64 65 66  ts, 0  },.#ifdef
35830 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
35840 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20 20 20  NLOCK_NOTIFY.   
35850 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75 6e 6c    { "sqlite3_unl
35860 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 74 65 73  ock_notify", tes
35870 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 2c  t_unlock_notify,
35880 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20   0  },.#endif.  
35890 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61     { "sqlite3_wa
358a0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 2c 20 20  l_checkpoint",  
358b0 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70   test_wal_checkp
358c0 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20 20 20  oint, 0  },.    
358d0 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c 5f   { "sqlite3_wal_
358e0 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 22 2c 74  checkpoint_v2",t
358f0 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  est_wal_checkpoi
35900 6e 74 5f 76 32 2c 20 30 20 20 7d 2c 0a 20 20 20  nt_v2, 0  },.   
35910 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61 6c    { "sqlite3_wal
35920 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 22  _autocheckpoint"
35930 2c 74 65 73 74 5f 77 61 6c 5f 61 75 74 6f 63 68  ,test_wal_autoch
35940 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a  eckpoint, 0  },.
35950 20 20 20 20 20 7b 20 22 74 65 73 74 5f 73 71 6c       { "test_sql
35960 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20 20 20 20  ite3_log",      
35970 20 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f     test_sqlite3_
35980 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64  log, 0  },.#ifnd
35990 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45  ef SQLITE_OMIT_E
359a0 58 50 4c 41 49 4e 0a 20 20 20 20 20 7b 20 22 70  XPLAIN.     { "p
359b0 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71 75 65  rint_explain_que
359c0 72 79 5f 70 6c 61 6e 22 2c 20 74 65 73 74 5f 70  ry_plan", test_p
359d0 72 69 6e 74 5f 65 71 70 2c 20 30 20 20 7d 2c 0a  rint_eqp, 0  },.
359e0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
359f0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
35a00 72 6f 6c 22 2c 20 74 65 73 74 5f 74 65 73 74 5f  rol", test_test_
35a10 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 23 69 66 20 53  control },.#if S
35a20 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 20 20  QLITE_OS_UNIX.  
35a30 20 20 20 7b 20 22 67 65 74 72 75 73 61 67 65 22     { "getrusage"
35a40 2c 20 74 65 73 74 5f 67 65 74 72 75 73 61 67 65  , test_getrusage
35a50 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
35a60 7b 20 22 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65  { "load_static_e
35a70 78 74 65 6e 73 69 6f 6e 22 2c 20 74 63 6c 4c 6f  xtension", tclLo
35a80 61 64 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f  adStaticExtensio
35a90 6e 43 6d 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22  nCmd },.     { "
35aa0 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61 6b 65  sorter_test_fake
35ab0 68 65 61 70 22 2c 20 73 6f 72 74 65 72 5f 74 65  heap", sorter_te
35ac0 73 74 5f 66 61 6b 65 68 65 61 70 20 7d 2c 0a 20  st_fakeheap },. 
35ad0 20 20 20 20 7b 20 22 73 6f 72 74 65 72 5f 74 65      { "sorter_te
35ae0 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 22  st_sort4_helper"
35af0 2c 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f  , sorter_test_so
35b00 72 74 34 5f 68 65 6c 70 65 72 20 7d 2c 0a 23 69  rt4_helper },.#i
35b10 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
35b20 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
35b30 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35b40 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61 74  user_authenticat
35b50 65 22 2c 20 74 65 73 74 5f 75 73 65 72 5f 61 75  e", test_user_au
35b60 74 68 65 6e 74 69 63 61 74 65 2c 20 30 20 7d 2c  thenticate, 0 },
35b70 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35b80 5f 75 73 65 72 5f 61 64 64 22 2c 20 20 20 20 20  _user_add",     
35b90 20 20 20 20 20 74 65 73 74 5f 75 73 65 72 5f 61       test_user_a
35ba0 64 64 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d  dd,          0 }
35bb0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35bc0 33 5f 75 73 65 72 5f 63 68 61 6e 67 65 22 2c 20  3_user_change", 
35bd0 20 20 20 20 20 20 74 65 73 74 5f 75 73 65 72 5f        test_user_
35be0 63 68 61 6e 67 65 2c 20 20 20 20 20 20 20 30 20  change,       0 
35bf0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
35c00 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 22 2c  e3_user_delete",
35c10 20 20 20 20 20 20 20 74 65 73 74 5f 75 73 65 72         test_user
35c20 5f 64 65 6c 65 74 65 2c 20 20 20 20 20 20 20 30  _delete,       0
35c30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65   },.#endif.#ifde
35c40 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
35c50 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
35c60 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35c70 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 22  stmt_scanstatus"
35c80 2c 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d  ,       test_stm
35c90 74 5f 73 63 61 6e 73 74 61 74 75 73 2c 20 20 20  t_scanstatus,   
35ca0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
35cb0 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
35cc0 61 74 75 73 5f 72 65 73 65 74 22 2c 20 74 65 73  atus_reset", tes
35cd0 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  t_stmt_scanstatu
35ce0 73 5f 72 65 73 65 74 2c 20 20 20 30 20 7d 2c 0a  s_reset,   0 },.
35cf0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
35d00 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c  LITE_ENABLE_SQLL
35d10 4f 47 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  OG.     { "sqlit
35d20 65 33 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67  e3_config_sqllog
35d30 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
35d40 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 2c 20 20  config_sqllog,  
35d50 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20   0 },.#endif.   
35d60 20 20 7b 20 22 76 66 73 5f 63 75 72 72 65 6e 74    { "vfs_current
35d70 5f 74 69 6d 65 5f 69 6e 74 36 34 22 2c 20 20 20  _time_int64",   
35d80 20 20 20 20 20 20 20 20 76 66 73 43 75 72 72 65          vfsCurre
35d90 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20 20 20 30  ntTimeInt64,   0
35da0 20 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54   },.#ifdef SQLIT
35db0 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f  E_ENABLE_SNAPSHO
35dc0 54 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  T.     { "sqlite
35dd0 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 22 2c  3_snapshot_get",
35de0 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 67   test_snapshot_g
35df0 65 74 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  et, 0 },.     { 
35e00 22 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f  "sqlite3_snapsho
35e10 74 5f 6f 70 65 6e 22 2c 20 74 65 73 74 5f 73 6e  t_open", test_sn
35e20 61 70 73 68 6f 74 5f 6f 70 65 6e 2c 20 30 20 7d  apshot_open, 0 }
35e30 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35e40 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 22  3_snapshot_free"
35e50 2c 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f  , test_snapshot_
35e60 66 72 65 65 2c 20 30 20 7d 2c 0a 20 20 20 20 20  free, 0 },.     
35e70 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 61 70 73  { "sqlite3_snaps
35e80 68 6f 74 5f 63 6d 70 22 2c 20 74 65 73 74 5f 73  hot_cmp", test_s
35e90 6e 61 70 73 68 6f 74 5f 63 6d 70 2c 20 30 20 7d  napshot_cmp, 0 }
35ea0 2c 0a 23 65 6e 64 69 66 0a 20 20 7d 3b 0a 20 20  ,.#endif.  };.  
35eb0 73 74 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61  static int bitma
35ec0 73 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66  sk_size = sizeof
35ed0 28 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 73  (Bitmask)*8;.  s
35ee0 74 61 74 69 63 20 69 6e 74 20 6c 6f 6e 67 64 6f  tatic int longdo
35ef0 75 62 6c 65 5f 73 69 7a 65 20 3d 20 73 69 7a 65  uble_size = size
35f00 6f 66 28 4c 4f 4e 47 44 4f 55 42 4c 45 5f 54 59  of(LONGDOUBLE_TY
35f10 50 45 29 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  PE);.  int i;.  
35f20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
35f30 65 33 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 73  e3_sync_count, s
35f40 71 6c 69 74 65 33 5f 66 75 6c 6c 73 79 6e 63 5f  qlite3_fullsync_
35f50 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
35f60 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
35f70 74 65 6d 70 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  temp_count;.  ex
35f80 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
35f90 5f 6c 69 6b 65 5f 63 6f 75 6e 74 3b 0a 20 20 65  _like_count;.  e
35fa0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
35fb0 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 3b  3_xferopt_count;
35fc0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
35fd0 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64  lite3_pager_read
35fe0 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  db_count;.  exte
35ff0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
36000 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75  ager_writedb_cou
36010 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
36020 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
36030 72 69 74 65 6a 5f 63 6f 75 6e 74 3b 0a 23 69 66  ritej_count;.#if
36040 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20   SQLITE_OS_WIN. 
36050 20 65 78 74 65 72 6e 20 4c 4f 4e 47 20 76 6f 6c   extern LONG vol
36060 61 74 69 6c 65 20 73 71 6c 69 74 65 33 5f 6f 73  atile sqlite3_os
36070 5f 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 23 69  _type;.#endif.#i
36080 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
36090 47 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  G.  extern int s
360a0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
360b0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
360c0 71 6c 69 74 65 33 4f 53 54 72 61 63 65 3b 0a 20  qlite3OSTrace;. 
360d0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
360e0 74 65 33 57 61 6c 54 72 61 63 65 3b 0a 23 65 6e  te3WalTrace;.#en
360f0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
36100 45 5f 54 45 53 54 0a 23 69 66 64 65 66 20 53 51  E_TEST.#ifdef SQ
36110 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
36120 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
36130 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c  lite3_fts3_enabl
36140 65 5f 70 61 72 65 6e 74 68 65 73 65 73 3b 0a 23  e_parentheses;.#
36150 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20  endif.#endif..  
36160 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
36170 66 28 61 43 6d 64 29 2f 73 69 7a 65 6f 66 28 61  f(aCmd)/sizeof(a
36180 43 6d 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Cmd[0]); i++){. 
36190 20 20 20 54 63 6c 5f 43 72 65 61 74 65 43 6f 6d     Tcl_CreateCom
361a0 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 43 6d  mand(interp, aCm
361b0 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64  d[i].zName, aCmd
361c0 5b 69 5d 2e 78 50 72 6f 63 2c 20 30 2c 20 30 29  [i].xProc, 0, 0)
361d0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
361e0 20 69 3c 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d   i<sizeof(aObjCm
361f0 64 29 2f 73 69 7a 65 6f 66 28 61 4f 62 6a 43 6d  d)/sizeof(aObjCm
36200 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
36210 20 54 63 6c 5f 43 72 65 61 74 65 4f 62 6a 43 6f   Tcl_CreateObjCo
36220 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 61 4f  mmand(interp, aO
36230 62 6a 43 6d 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  bjCmd[i].zName, 
36240 0a 20 20 20 20 20 20 20 20 61 4f 62 6a 43 6d 64  .        aObjCmd
36250 5b 69 5d 2e 78 50 72 6f 63 2c 20 61 4f 62 6a 43  [i].xProc, aObjC
36260 6d 64 5b 69 5d 2e 63 6c 69 65 6e 74 44 61 74 61  md[i].clientData
36270 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  , 0);.  }.  Tcl_
36280 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
36290 22 73 71 6c 69 74 65 5f 73 65 61 72 63 68 5f 63  "sqlite_search_c
362a0 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
362b0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 65  har*)&sqlite3_se
362c0 61 72 63 68 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  arch_count, TCL_
362d0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
362e0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
362f0 20 22 73 71 6c 69 74 65 5f 66 6f 75 6e 64 5f 63   "sqlite_found_c
36300 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
36310 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 66 6f  har*)&sqlite3_fo
36320 75 6e 64 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  und_count, TCL_L
36330 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
36340 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
36350 22 73 71 6c 69 74 65 5f 73 6f 72 74 5f 63 6f 75  "sqlite_sort_cou
36360 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  nt", .      (cha
36370 72 2a 29 26 73 71 6c 69 74 65 33 5f 73 6f 72 74  r*)&sqlite3_sort
36380 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
36390 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
363a0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
363b0 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
363c0 7a 65 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61  ze", .      (cha
363d0 72 2a 29 26 73 71 6c 69 74 65 33 5f 6d 61 78 5f  r*)&sqlite3_max_
363e0 62 6c 6f 62 73 69 7a 65 2c 20 54 43 4c 5f 4c 49  blobsize, TCL_LI
363f0 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
36400 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
36410 73 71 6c 69 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e  sqlite_like_coun
36420 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  t", .      (char
36430 2a 29 26 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f  *)&sqlite3_like_
36440 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
36450 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
36460 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
36470 69 74 65 5f 69 6e 74 65 72 72 75 70 74 5f 63 6f  ite_interrupt_co
36480 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63 68  unt", .      (ch
36490 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 69 6e 74  ar*)&sqlite3_int
364a0 65 72 72 75 70 74 5f 63 6f 75 6e 74 2c 20 54 43  errupt_count, TC
364b0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
364c0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
364d0 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 5f  p, "sqlite_open_
364e0 66 69 6c 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20  file_count", .  
364f0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
36500 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f  te3_open_file_co
36510 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
36520 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
36530 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
36540 65 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 22 2c  e_current_time",
36550 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
36560 73 71 6c 69 74 65 33 5f 63 75 72 72 65 6e 74 5f  sqlite3_current_
36570 74 69 6d 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  time, TCL_LINK_I
36580 4e 54 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  NT);.#if SQLITE_
36590 4f 53 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e  OS_UNIX && defin
365a0 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26  ed(__APPLE__) &&
365b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
365c0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 54  OCKING_STYLE.  T
365d0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
365e0 70 2c 20 22 73 71 6c 69 74 65 5f 68 6f 73 74 69  p, "sqlite_hosti
365f0 64 5f 6e 75 6d 22 2c 20 0a 20 20 20 20 20 20 28  d_num", .      (
36600 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 68  char*)&sqlite3_h
36610 6f 73 74 69 64 5f 6e 75 6d 2c 20 54 43 4c 5f 4c  ostid_num, TCL_L
36620 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
36630 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
36640 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
36650 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a  xferopt_count",.
36660 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
36670 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f 63 6f  lite3_xferopt_co
36680 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
36690 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
366a0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
366b0 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
366c0 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63  count",.      (c
366d0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61  har*)&sqlite3_pa
366e0 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74  ger_readdb_count
366f0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
36700 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
36710 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
36720 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
36730 75 6e 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61  unt",.      (cha
36740 72 2a 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65  r*)&sqlite3_page
36750 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 2c  r_writedb_count,
36760 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
36770 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
36780 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70  terp, "sqlite3_p
36790 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
367a0 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
367b0 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  )&sqlite3_pager_
367c0 77 72 69 74 65 6a 5f 63 6f 75 6e 74 2c 20 54 43  writej_count, TC
367d0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66  L_LINK_INT);.#if
367e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
367f0 5f 55 54 46 31 36 0a 20 20 54 63 6c 5f 4c 69 6e  _UTF16.  Tcl_Lin
36800 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 75 6e  kVar(interp, "un
36810 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
36820 6f 75 6e 74 65 72 22 2c 0a 20 20 20 20 20 20 28  ounter",.      (
36830 63 68 61 72 2a 29 26 75 6e 61 6c 69 67 6e 65 64  char*)&unaligned
36840 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2c  _string_counter,
36850 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
36860 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 53  #endif.#ifndef S
36870 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
36880 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
36890 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c  nterp, "sqlite_l
368a0 61 73 74 5f 6e 65 65 64 65 64 5f 63 6f 6c 6c 61  ast_needed_colla
368b0 74 69 6f 6e 22 2c 0a 20 20 20 20 20 20 28 63 68  tion",.      (ch
368c0 61 72 2a 29 26 70 7a 4e 65 65 64 65 64 43 6f 6c  ar*)&pzNeededCol
368d0 6c 61 74 69 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b  lation, TCL_LINK
368e0 5f 53 54 52 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b  _STRING|TCL_LINK
368f0 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e  _READ_ONLY);.#en
36900 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  dif.#if SQLITE_O
36910 53 5f 57 49 4e 0a 20 20 54 63 6c 5f 4c 69 6e 6b  S_WIN.  Tcl_Link
36920 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
36930 69 74 65 5f 6f 73 5f 74 79 70 65 22 2c 0a 20 20  ite_os_type",.  
36940 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
36950 74 65 33 5f 6f 73 5f 74 79 70 65 2c 20 54 43 4c  te3_os_type, TCL
36960 5f 4c 49 4e 4b 5f 4c 4f 4e 47 29 3b 0a 23 65 6e  _LINK_LONG);.#en
36970 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
36980 45 5f 54 45 53 54 0a 20 20 7b 0a 20 20 20 20 73  E_TEST.  {.    s
36990 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
369a0 20 2a 71 75 65 72 79 5f 70 6c 61 6e 20 3d 20 22   *query_plan = "
369b0 2a 2a 2a 20 4f 42 53 4f 4c 45 54 45 20 56 41 52  *** OBSOLETE VAR
369c0 49 41 42 4c 45 20 2a 2a 2a 22 3b 0a 20 20 20 20  IABLE ***";.    
369d0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
369e0 72 70 2c 20 22 73 71 6c 69 74 65 5f 71 75 65 72  rp, "sqlite_quer
369f0 79 5f 70 6c 61 6e 22 2c 0a 20 20 20 20 20 20 20  y_plan",.       
36a00 28 63 68 61 72 2a 29 26 71 75 65 72 79 5f 70 6c  (char*)&query_pl
36a10 61 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  an, TCL_LINK_STR
36a20 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41  ING|TCL_LINK_REA
36a30 44 5f 4f 4e 4c 59 29 3b 0a 20 20 7d 0a 23 65 6e  D_ONLY);.  }.#en
36a40 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
36a50 45 5f 44 45 42 55 47 0a 20 20 54 63 6c 5f 4c 69  E_DEBUG.  Tcl_Li
36a60 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
36a70 71 6c 69 74 65 5f 77 68 65 72 65 5f 74 72 61 63  qlite_where_trac
36a80 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  e",.      (char*
36a90 29 26 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  )&sqlite3WhereTr
36aa0 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
36ab0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
36ac0 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
36ad0 65 5f 6f 73 5f 74 72 61 63 65 22 2c 0a 20 20 20  e_os_trace",.   
36ae0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
36af0 65 33 4f 53 54 72 61 63 65 2c 20 54 43 4c 5f 4c  e3OSTrace, TCL_L
36b00 49 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65  INK_INT);.#ifnde
36b10 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
36b20 4c 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  L.  Tcl_LinkVar(
36b30 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
36b40 77 61 6c 5f 74 72 61 63 65 22 2c 0a 20 20 20 20  wal_trace",.    
36b50 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
36b60 33 57 61 6c 54 72 61 63 65 2c 20 54 43 4c 5f 4c  3WalTrace, TCL_L
36b70 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
36b80 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
36b90 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
36ba0 49 4f 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  IO.  Tcl_LinkVar
36bb0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
36bc0 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 22  _opentemp_count"
36bd0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
36be0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70  sqlite3_opentemp
36bf0 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
36c00 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20  _INT);.#endif.  
36c10 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
36c20 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74  rp, "sqlite_stat
36c30 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 2c 0a  ic_bind_value",.
36c40 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
36c50 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
36c60 5f 76 61 6c 75 65 2c 20 54 43 4c 5f 4c 49 4e 4b  _value, TCL_LINK
36c70 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f  _STRING);.  Tcl_
36c80 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
36c90 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62  "sqlite_static_b
36ca0 69 6e 64 5f 6e 62 79 74 65 22 2c 0a 20 20 20 20  ind_nbyte",.    
36cb0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
36cc0 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79  _static_bind_nby
36cd0 74 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  te, TCL_LINK_INT
36ce0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
36cf0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
36d00 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 22  _temp_directory"
36d10 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
36d20 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
36d30 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e 4b  ectory, TCL_LINK
36d40 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c 5f  _STRING);.  Tcl_
36d50 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
36d60 22 73 71 6c 69 74 65 5f 64 61 74 61 5f 64 69 72  "sqlite_data_dir
36d70 65 63 74 6f 72 79 22 2c 0a 20 20 20 20 20 20 28  ectory",.      (
36d80 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 64  char*)&sqlite3_d
36d90 61 74 61 5f 64 69 72 65 63 74 6f 72 79 2c 20 54  ata_directory, T
36da0 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 29 3b  CL_LINK_STRING);
36db0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
36dc0 6e 74 65 72 70 2c 20 22 62 69 74 6d 61 73 6b 5f  nterp, "bitmask_
36dd0 73 69 7a 65 22 2c 0a 20 20 20 20 20 20 28 63 68  size",.      (ch
36de0 61 72 2a 29 26 62 69 74 6d 61 73 6b 5f 73 69 7a  ar*)&bitmask_siz
36df0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c  e, TCL_LINK_INT|
36e00 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e  TCL_LINK_READ_ON
36e10 4c 59 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  LY);.  Tcl_LinkV
36e20 61 72 28 69 6e 74 65 72 70 2c 20 22 6c 6f 6e 67  ar(interp, "long
36e30 64 6f 75 62 6c 65 5f 73 69 7a 65 22 2c 0a 20 20  double_size",.  
36e40 20 20 20 20 28 63 68 61 72 2a 29 26 6c 6f 6e 67      (char*)&long
36e50 64 6f 75 62 6c 65 5f 73 69 7a 65 2c 20 54 43 4c  double_size, TCL
36e60 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49  _LINK_INT|TCL_LI
36e70 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20  NK_READ_ONLY);. 
36e80 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
36e90 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e  erp, "sqlite_syn
36ea0 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  c_count",.      
36eb0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
36ec0 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  sync_count, TCL_
36ed0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
36ee0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
36ef0 20 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e   "sqlite_fullsyn
36f00 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  c_count",.      
36f10 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
36f20 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  fullsync_count, 
36f30 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
36f40 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
36f50 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 26  E_ENABLE_FTS3) &
36f60 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
36f70 5f 54 45 53 54 29 0a 20 20 54 63 6c 5f 4c 69 6e  _TEST).  Tcl_Lin
36f80 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
36f90 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65  lite_fts3_enable
36fa0 5f 70 61 72 65 6e 74 68 65 73 65 73 22 2c 0a 20  _parentheses",. 
36fb0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
36fc0 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65  ite3_fts3_enable
36fd0 5f 70 61 72 65 6e 74 68 65 73 65 73 2c 20 54 43  _parentheses, TC
36fe0 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
36ff0 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
37000 5f 4f 4b 3b 0a 7d 0a                             _OK;.}.