/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 1ab7cbbb6693e08364c1a9241e2aee17f8c4925e4cc52396be77ae6845a05828:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 43 6f 64 65 20 66  ******.** Code f
0180: 6f 72 20 74 65 73 74 69 6e 67 20 61 6c 6c 20 73  or testing all s
0190: 6f 72 74 73 20 6f 66 20 53 51 4c 69 74 65 20 69  orts of SQLite i
01a0: 6e 74 65 72 66 61 63 65 73 2e 20 20 54 68 69 73  nterfaces.  This
01b0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 6e 6f 74 20   code.** is not 
01c0: 69 6e 63 6c 75 64 65 64 20 69 6e 20 74 68 65 20  included in the 
01d0: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 2e 20  SQLite library. 
01e0: 20 49 74 20 69 73 20 75 73 65 64 20 66 6f 72 20   It is used for 
01f0: 61 75 74 6f 6d 61 74 65 64 0a 2a 2a 20 74 65 73  automated.** tes
0200: 74 69 6e 67 20 6f 66 20 74 68 65 20 53 51 4c 69  ting of the SQLi
0210: 74 65 20 6c 69 62 72 61 72 79 2e 0a 2a 2f 0a 23  te library..*/.#
0220: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49  include "sqliteI
0230: 6e 74 2e 68 22 0a 23 69 66 20 53 51 4c 49 54 45  nt.h".#if SQLITE
0240: 5f 4f 53 5f 57 49 4e 0a 23 20 20 69 6e 63 6c 75  _OS_WIN.#  inclu
0250: 64 65 20 22 6f 73 5f 77 69 6e 2e 68 22 0a 23 65  de "os_win.h".#e
0260: 6e 64 69 66 0a 0a 23 69 6e 63 6c 75 64 65 20 22  ndif..#include "
0270: 76 64 62 65 49 6e 74 2e 68 22 0a 23 69 66 20 64  vdbeInt.h".#if d
0280: 65 66 69 6e 65 64 28 49 4e 43 4c 55 44 45 5f 53  efined(INCLUDE_S
0290: 51 4c 49 54 45 5f 54 43 4c 5f 48 29 0a 23 20 20  QLITE_TCL_H).#  
02a0: 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 5f  include "sqlite_
02b0: 74 63 6c 2e 68 22 0a 23 65 6c 73 65 0a 23 20 20  tcl.h".#else.#  
02c0: 69 6e 63 6c 75 64 65 20 22 74 63 6c 2e 68 22 0a  include "tcl.h".
02d0: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
02e0: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
02f0: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0300: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
0310: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 69 72 73  copy of the firs
0320: 74 20 70 61 72 74 20 6f 66 20 74 68 65 20 53 71  t part of the Sq
0330: 6c 69 74 65 44 62 20 73 74 72 75 63 74 75 72 65  liteDb structure
0340: 20 69 6e 20 0a 2a 2a 20 74 63 6c 73 71 6c 69 74   in .** tclsqlit
0350: 65 2e 63 2e 20 20 57 65 20 6e 65 65 64 20 69 74  e.c.  We need it
0360: 20 68 65 72 65 20 73 6f 20 74 68 61 74 20 74 68   here so that th
0370: 65 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69  e get_sqlite_poi
0380: 6e 74 65 72 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  nter routine.** 
0390: 63 61 6e 20 65 78 74 72 61 63 74 20 74 68 65 20  can extract the 
03a0: 73 71 6c 69 74 65 33 2a 20 70 6f 69 6e 74 65 72  sqlite3* pointer
03b0: 20 66 72 6f 6d 20 61 6e 20 65 78 69 73 74 69 6e   from an existin
03c0: 67 20 54 63 6c 20 53 51 4c 69 74 65 0a 2a 2a 20  g Tcl SQLite.** 
03d0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73  connection..*/.s
03e0: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
03f0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
0400: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  };../*.** Conver
0410: 74 20 74 65 78 74 20 67 65 6e 65 72 61 74 65 64  t text generated
0420: 20 62 79 20 74 68 65 20 22 25 70 22 20 63 6f 6e   by the "%p" con
0430: 76 65 72 73 69 6f 6e 20 66 6f 72 6d 61 74 20 62  version format b
0440: 61 63 6b 20 69 6e 74 6f 0a 2a 2a 20 61 20 70 6f  ack into.** a po
0450: 69 6e 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  inter..*/.static
0460: 20 69 6e 74 20 74 65 73 74 48 65 78 54 6f 49 6e   int testHexToIn
0470: 74 28 69 6e 74 20 68 29 7b 0a 20 20 69 66 28 20  t(int h){.  if( 
0480: 68 3e 3d 27 30 27 20 26 26 20 68 3c 3d 27 39 27  h>='0' && h<='9'
0490: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 68   ){.    return h
04a0: 20 2d 20 27 30 27 3b 0a 20 20 7d 65 6c 73 65 20   - '0';.  }else 
04b0: 69 66 28 20 68 3e 3d 27 61 27 20 26 26 20 68 3c  if( h>='a' && h<
04c0: 3d 27 66 27 20 29 7b 0a 20 20 20 20 72 65 74 75  ='f' ){.    retu
04d0: 72 6e 20 68 20 2d 20 27 61 27 20 2b 20 31 30 3b  rn h - 'a' + 10;
04e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
04f0: 73 65 72 74 28 20 68 3e 3d 27 41 27 20 26 26 20  sert( h>='A' && 
0500: 68 3c 3d 27 46 27 20 29 3b 0a 20 20 20 20 72 65  h<='F' );.    re
0510: 74 75 72 6e 20 68 20 2d 20 27 41 27 20 2b 20 31  turn h - 'A' + 1
0520: 30 3b 0a 20 20 7d 0a 7d 0a 76 6f 69 64 20 2a 73  0;.  }.}.void *s
0530: 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
0540: 50 74 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ptr(const char *
0550: 7a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 3b 0a 20  z){.  void *p;. 
0560: 20 75 36 34 20 76 3b 0a 20 20 75 33 32 20 76 32   u64 v;.  u32 v2
0570: 3b 0a 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 30  ;.  if( z[0]=='0
0580: 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 78 27 20 29  ' && z[1]=='x' )
0590: 7b 0a 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20  {.    z += 2;.  
05a0: 7d 0a 20 20 76 20 3d 20 30 3b 0a 20 20 77 68 69  }.  v = 0;.  whi
05b0: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 76 20  le( *z ){.    v 
05c0: 3d 20 28 76 3c 3c 34 29 20 2b 20 74 65 73 74 48  = (v<<4) + testH
05d0: 65 78 54 6f 49 6e 74 28 2a 7a 29 3b 0a 20 20 20  exToInt(*z);.   
05e0: 20 7a 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20   z++;.  }.  if( 
05f0: 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65 6f  sizeof(p)==sizeo
0600: 66 28 76 29 20 29 7b 0a 20 20 20 20 6d 65 6d 63  f(v) ){.    memc
0610: 70 79 28 26 70 2c 20 26 76 2c 20 73 69 7a 65 6f  py(&p, &v, sizeo
0620: 66 28 70 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  f(p));.  }else{.
0630: 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
0640: 6f 66 28 70 29 3d 3d 73 69 7a 65 6f 66 28 76 32  of(p)==sizeof(v2
0650: 29 20 29 3b 0a 20 20 20 20 76 32 20 3d 20 28 75  ) );.    v2 = (u
0660: 33 32 29 76 3b 0a 20 20 20 20 6d 65 6d 63 70 79  32)v;.    memcpy
0670: 28 26 70 2c 20 26 76 32 2c 20 73 69 7a 65 6f 66  (&p, &v2, sizeof
0680: 28 70 29 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (p));.  }.  retu
0690: 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  rn p;.}.../*.** 
06a0: 41 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 74 68  A TCL command th
06b0: 61 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 61  at returns the a
06c0: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 73 71  ddress of the sq
06d0: 6c 69 74 65 2a 20 70 6f 69 6e 74 65 72 0a 2a 2a  lite* pointer.**
06e0: 20 66 6f 72 20 61 6e 20 73 71 6c 69 74 65 20 63   for an sqlite c
06f0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 73 74 61 6e  onnection instan
0700: 63 65 2e 20 20 42 61 64 20 74 68 69 6e 67 73 20  ce.  Bad things 
0710: 68 61 70 70 65 6e 20 69 66 20 74 68 65 0a 2a 2a  happen if the.**
0720: 20 69 6e 70 75 74 20 69 73 20 6e 6f 74 20 61 6e   input is not an
0730: 20 73 71 6c 69 74 65 20 63 6f 6e 6e 65 63 74 69   sqlite connecti
0740: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
0750: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
0760: 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f 69 6e 74  get_sqlite_point
0770: 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  er(.  void * cli
0780: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
0790: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
07a0: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
07b0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
07c0: 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 53  [].){.  struct S
07d0: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
07e0: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
07f0: 6f 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  o;.  char zBuf[1
0800: 30 30 5d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  00];.  if( objc!
0810: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
0820: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
0830: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 51 4c  p, 1, objv, "SQL
0840: 49 54 45 2d 43 4f 4e 4e 45 43 54 49 4f 4e 22 29  ITE-CONNECTION")
0850: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
0860: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
0870: 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e  ( !Tcl_GetComman
0880: 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63  dInfo(interp, Tc
0890: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
08a0: 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20  [1]), &cmdInfo) 
08b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
08c0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
08d0: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
08e0: 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  nd: ",.         
08f0: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
0900: 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a  objv[1]), (char*
0910: 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )0);.    return 
0920: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
0930: 20 70 20 3d 20 28 73 74 72 75 63 74 20 53 71 6c   p = (struct Sql
0940: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
0950: 62 6a 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  bjClientData;.  
0960: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
0970: 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
0980: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0990: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
09a0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
09b0: 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
09c0: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
09d0: 2a 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74  * Decode a point
09e0: 65 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  er to an sqlite3
09f0: 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69 6e 74 20   object..*/.int 
0a00: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
0a10: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c   const char *zA,
0a30: 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 29   sqlite3 **ppDb)
0a40: 7b 0a 20 20 73 74 72 75 63 74 20 53 71 6c 69 74  {.  struct Sqlit
0a50: 65 44 62 20 2a 70 3b 0a 20 20 54 63 6c 5f 43 6d  eDb *p;.  Tcl_Cm
0a60: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
0a70: 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
0a80: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
0a90: 7a 41 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b  zA, &cmdInfo) ){
0aa0: 0a 20 20 20 20 70 20 3d 20 28 73 74 72 75 63 74  .    p = (struct
0ab0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
0ac0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
0ad0: 3b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 70 2d  ;.    *ppDb = p-
0ae0: 3e 64 62 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  >db;.  }else{.  
0af0: 20 20 2a 70 70 44 62 20 3d 20 28 73 71 6c 69 74    *ppDb = (sqlit
0b00: 65 33 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54  e3*)sqlite3TestT
0b10: 65 78 74 54 6f 50 74 72 28 7a 41 29 3b 0a 20 20  extToPtr(zA);.  
0b20: 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
0b30: 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
0b40: 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 44 65  _OS_WIN./*.** De
0b50: 63 6f 64 65 20 61 20 57 69 6e 33 32 20 48 41 4e  code a Win32 HAN
0b60: 44 4c 45 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a 69  DLE object..*/.i
0b70: 6e 74 20 67 65 74 57 69 6e 33 32 48 61 6e 64 6c  nt getWin32Handl
0b80: 65 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  e(Tcl_Interp *in
0b90: 74 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  terp, const char
0ba0: 20 2a 7a 41 2c 20 4c 50 48 41 4e 44 4c 45 20 70   *zA, LPHANDLE p
0bb0: 68 46 69 6c 65 29 7b 0a 20 20 2a 70 68 46 69 6c  hFile){.  *phFil
0bc0: 65 20 3d 20 28 48 41 4e 44 4c 45 29 73 71 6c 69  e = (HANDLE)sqli
0bd0: 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74 72  te3TestTextToPtr
0be0: 28 7a 41 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (zA);.  return T
0bf0: 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
0c00: 0a 65 78 74 65 72 6e 20 63 6f 6e 73 74 20 63 68  .extern const ch
0c10: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
0c20: 6d 65 28 69 6e 74 29 3b 0a 23 64 65 66 69 6e 65  me(int);.#define
0c30: 20 74 31 45 72 72 6f 72 4e 61 6d 65 20 73 71 6c   t1ErrorName sql
0c40: 69 74 65 33 45 72 72 4e 61 6d 65 0a 0a 2f 2a 0a  ite3ErrName../*.
0c50: 2a 2a 20 43 6f 6e 76 65 72 74 20 61 6e 20 73 71  ** Convert an sq
0c60: 6c 69 74 65 33 5f 73 74 6d 74 2a 20 69 6e 74 6f  lite3_stmt* into
0c70: 20 61 6e 20 73 71 6c 69 74 65 33 2a 2e 20 20 54   an sqlite3*.  T
0c80: 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  his depends on t
0c90: 68 65 0a 2a 2a 20 66 61 63 74 20 74 68 61 74 20  he.** fact that 
0ca0: 74 68 65 20 73 71 6c 69 74 65 33 2a 20 69 73 20  the sqlite3* is 
0cb0: 74 68 65 20 66 69 72 73 74 20 66 69 65 6c 64 20  the first field 
0cc0: 69 6e 20 74 68 65 20 56 64 62 65 20 73 74 72 75  in the Vdbe stru
0cd0: 63 74 75 72 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e  cture..*/.#defin
0ce0: 65 20 53 74 6d 74 54 6f 44 62 28 58 29 20 20 20  e StmtToDb(X)   
0cf0: 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c  sqlite3_db_handl
0d00: 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  e(X)../*.** Chec
0d10: 6b 20 61 20 72 65 74 75 72 6e 20 76 61 6c 75 65  k a return value
0d20: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 69 74   to make sure it
0d30: 20 61 67 72 65 65 73 20 77 69 74 68 20 74 68 65   agrees with the
0d40: 20 72 65 73 75 6c 74 73 0a 2a 2a 20 66 72 6f 6d   results.** from
0d50: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
0d60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
0d70: 54 65 73 74 45 72 72 43 6f 64 65 28 54 63 6c 5f  TestErrCode(Tcl_
0d80: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
0da0: 20 72 63 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   rc){.  if( sqli
0db0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
0dc0: 3d 3d 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ==0 && rc!=SQLIT
0dd0: 45 5f 4d 49 53 55 53 45 20 26 26 20 72 63 21 3d  E_MISUSE && rc!=
0de0: 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26 26 20  SQLITE_OK.   && 
0df0: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e00: 64 62 29 21 3d 72 63 20 29 7b 0a 20 20 20 20 63  db)!=rc ){.    c
0e10: 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20  har zBuf[200];. 
0e20: 20 20 20 69 6e 74 20 72 32 20 3d 20 73 71 6c 69     int r2 = sqli
0e30: 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
0e40: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
0e50: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
0e60: 66 29 2c 20 7a 42 75 66 2c 0a 20 20 20 20 20 20  f), zBuf,.      
0e70: 20 22 65 72 72 6f 72 20 63 6f 64 65 20 25 73 20   "error code %s 
0e80: 28 25 64 29 20 64 6f 65 73 20 6e 6f 74 20 6d 61  (%d) does not ma
0e90: 74 63 68 20 73 71 6c 69 74 65 33 5f 65 72 72 63  tch sqlite3_errc
0ea0: 6f 64 65 20 25 73 20 28 25 64 29 22 2c 0a 20 20  ode %s (%d)",.  
0eb0: 20 20 20 20 20 74 31 45 72 72 6f 72 4e 61 6d 65       t1ErrorName
0ec0: 28 72 63 29 2c 20 72 63 2c 20 74 31 45 72 72 6f  (rc), rc, t1Erro
0ed0: 72 4e 61 6d 65 28 72 32 29 2c 20 72 32 29 3b 0a  rName(r2), r2);.
0ee0: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
0ef0: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
0f00: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
0f10: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
0f20: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
0f30: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
0f40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6f 64  ;.}../*.** Decod
0f50: 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  e a pointer to a
0f60: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 6f  n sqlite3_stmt o
0f70: 62 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  bject..*/.static
0f80: 20 69 6e 74 20 67 65 74 53 74 6d 74 50 6f 69 6e   int getStmtPoin
0f90: 74 65 72 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ter(.  Tcl_Inter
0fa0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 63 6f  p *interp, .  co
0fb0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 2c 20  nst char *zArg, 
0fc0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
0fd0: 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a   **ppStmt.){.  *
0fe0: 70 70 53 74 6d 74 20 3d 20 28 73 71 6c 69 74 65  ppStmt = (sqlite
0ff0: 33 5f 73 74 6d 74 2a 29 73 71 6c 69 74 65 33 54  3_stmt*)sqlite3T
1000: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 72  estTextToPtr(zAr
1010: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  g);.  return TCL
1020: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  _OK;.}../*.** Ge
1030: 6e 65 72 61 74 65 20 61 20 74 65 78 74 20 72 65  nerate a text re
1040: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
1050: 61 20 70 6f 69 6e 74 65 72 20 74 68 61 74 20 63  a pointer that c
1060: 61 6e 20 62 65 20 75 6e 64 65 72 73 74 6f 6f 64  an be understood
1070: 0a 2a 2a 20 62 79 20 74 68 65 20 67 65 74 44 62  .** by the getDb
1080: 50 6f 69 6e 74 65 72 20 61 6e 64 20 67 65 74 56  Pointer and getV
1090: 6d 50 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e 65  mPointer routine
10a0: 73 20 61 62 6f 76 65 2e 0a 2a 2a 0a 2a 2a 20 54  s above..**.** T
10b0: 68 65 20 70 72 6f 62 6c 65 6d 20 69 73 2c 20 6f  he problem is, o
10c0: 6e 20 73 6f 6d 65 20 6d 61 63 68 69 6e 65 73 20  n some machines 
10d0: 28 53 6f 6c 61 72 69 73 29 20 69 66 20 79 6f 75  (Solaris) if you
10e0: 20 64 6f 20 61 20 70 72 69 6e 74 66 20 77 69 74   do a printf wit
10f0: 68 0a 2a 2a 20 22 25 70 22 20 79 6f 75 20 63 61  h.** "%p" you ca
1100: 6e 6e 6f 74 20 74 75 72 6e 20 61 72 6f 75 6e 64  nnot turn around
1110: 20 61 6e 64 20 64 6f 20 61 20 73 63 61 6e 66 20   and do a scanf 
1120: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 22 25  with the same "%
1130: 70 22 20 61 6e 64 0a 2a 2a 20 67 65 74 20 79 6f  p" and.** get yo
1140: 75 72 20 70 6f 69 6e 74 65 72 20 62 61 63 6b 2e  ur pointer back.
1150: 20 20 59 6f 75 20 68 61 76 65 20 74 6f 20 70 72    You have to pr
1160: 65 70 65 6e 64 20 61 20 22 30 78 22 20 62 65 66  epend a "0x" bef
1170: 6f 72 65 20 69 74 20 77 69 6c 6c 0a 2a 2a 20 77  ore it will.** w
1180: 6f 72 6b 2e 20 20 4f 72 20 61 74 20 6c 65 61 73  ork.  Or at leas
1190: 74 20 74 68 61 74 20 69 73 20 77 68 61 74 20 69  t that is what i
11a0: 73 20 72 65 70 6f 72 74 65 64 20 74 6f 20 6d 65  s reported to me
11b0: 20 28 64 72 68 29 2e 20 20 42 75 74 20 74 68 69   (drh).  But thi
11c0: 73 0a 2a 2a 20 62 65 68 61 76 69 6f 72 20 76 61  s.** behavior va
11d0: 72 69 65 73 20 66 72 6f 6d 20 6d 61 63 68 69 6e  ries from machin
11e0: 65 20 74 6f 20 6d 61 63 68 69 6e 65 2e 20 20 54  e to machine.  T
11f0: 68 65 20 73 6f 6c 75 74 69 6f 6e 20 75 73 65 64  he solution used
1200: 20 68 65 72 20 69 73 0a 2a 2a 20 74 6f 20 74 65   her is.** to te
1210: 73 74 20 74 68 65 20 73 74 72 69 6e 67 20 72 69  st the string ri
1220: 67 68 74 20 61 66 74 65 72 20 69 74 20 69 73 20  ght after it is 
1230: 67 65 6e 65 72 61 74 65 64 20 74 6f 20 73 65 65  generated to see
1240: 20 69 66 20 69 74 20 63 61 6e 20 62 65 0a 2a 2a   if it can be.**
1250: 20 75 6e 64 65 72 73 74 6f 6f 64 20 62 79 20 73   understood by s
1260: 63 61 6e 66 2c 20 61 6e 64 20 69 66 20 6e 6f 74  canf, and if not
1270: 2c 20 74 72 79 20 70 72 65 70 65 6e 64 69 6e 67  , try prepending
1280: 20 61 6e 20 22 30 78 22 20 74 6f 20 73 65 65 20   an "0x" to see 
1290: 69 66 0a 2a 2a 20 74 68 61 74 20 68 65 6c 70 73  if.** that helps
12a0: 2e 20 20 49 66 20 6e 6f 74 68 69 6e 67 20 77 6f  .  If nothing wo
12b0: 72 6b 73 2c 20 61 20 66 61 74 61 6c 20 65 72 72  rks, a fatal err
12c0: 6f 72 20 69 73 20 67 65 6e 65 72 61 74 65 64 2e  or is generated.
12d0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
12e0: 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74  estMakePointerSt
12f0: 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  r(Tcl_Interp *in
1300: 74 65 72 70 2c 20 63 68 61 72 20 2a 7a 50 74 72  terp, char *zPtr
1310: 2c 20 76 6f 69 64 20 2a 70 29 7b 0a 20 20 73 71  , void *p){.  sq
1320: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 31  lite3_snprintf(1
1330: 30 30 2c 20 7a 50 74 72 2c 20 22 25 70 22 2c 20  00, zPtr, "%p", 
1340: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
1350: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  _OK;.}../*.** Th
1360: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
1370: 6e 65 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 65  ne for sqlite3_e
1380: 78 65 63 5f 70 72 69 6e 74 66 28 29 2e 0a 2a 2f  xec_printf()..*/
1390: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
13a0: 5f 70 72 69 6e 74 66 5f 63 62 28 76 6f 69 64 20  _printf_cb(void 
13b0: 2a 70 41 72 67 2c 20 69 6e 74 20 61 72 67 63 2c  *pArg, int argc,
13c0: 20 63 68 61 72 20 2a 2a 61 72 67 76 2c 20 63 68   char **argv, ch
13d0: 61 72 20 2a 2a 6e 61 6d 65 29 7b 0a 20 20 54 63  ar **name){.  Tc
13e0: 6c 5f 44 53 74 72 69 6e 67 20 2a 73 74 72 20 3d  l_DString *str =
13f0: 20 28 54 63 6c 5f 44 53 74 72 69 6e 67 2a 29 70   (Tcl_DString*)p
1400: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  Arg;.  int i;.. 
1410: 20 69 66 28 20 54 63 6c 5f 44 53 74 72 69 6e 67   if( Tcl_DString
1420: 4c 65 6e 67 74 68 28 73 74 72 29 3d 3d 30 20 29  Length(str)==0 )
1430: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
1440: 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <argc; i++){.   
1450: 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 41 70     Tcl_DStringAp
1460: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c  pendElement(str,
1470: 20 6e 61 6d 65 5b 69 5d 20 3f 20 6e 61 6d 65 5b   name[i] ? name[
1480: 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20  i] : "NULL");.  
1490: 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d    }.  }.  for(i=
14a0: 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  0; i<argc; i++){
14b0: 0a 20 20 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  .    Tcl_DString
14c0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 73 74  AppendElement(st
14d0: 72 2c 20 61 72 67 76 5b 69 5d 20 3f 20 61 72 67  r, argv[i] ? arg
14e0: 76 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a  v[i] : "NULL");.
14f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1500: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 49 2f 4f  }../*.** The I/O
1510: 20 74 72 61 63 69 6e 67 20 63 61 6c 6c 62 61 63   tracing callbac
1520: 6b 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  k..*/.#if !defin
1530: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
1540: 52 41 43 45 29 20 26 26 20 64 65 66 69 6e 65 64  RACE) && defined
1550: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49  (SQLITE_ENABLE_I
1560: 4f 54 52 41 43 45 29 0a 73 74 61 74 69 63 20 46  OTRACE).static F
1570: 49 4c 45 20 2a 69 6f 74 72 61 63 65 5f 66 69 6c  ILE *iotrace_fil
1580: 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 76 6f  e = 0;.static vo
1590: 69 64 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c  id io_trace_call
15a0: 62 61 63 6b 28 63 6f 6e 73 74 20 63 68 61 72 20  back(const char 
15b0: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a  *zFormat, ...){.
15c0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
15d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
15e0: 72 6d 61 74 29 3b 0a 20 20 76 66 70 72 69 6e 74  rmat);.  vfprint
15f0: 66 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 2c 20  f(iotrace_file, 
1600: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20  zFormat, ap);.  
1610: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 66  va_end(ap);.  ff
1620: 6c 75 73 68 28 69 6f 74 72 61 63 65 5f 66 69 6c  lush(iotrace_fil
1630: 65 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  e);.}.#endif../*
1640: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 69 6f 5f 74  .** Usage:  io_t
1650: 72 61 63 65 20 46 49 4c 45 4e 41 4d 45 0a 2a 2a  race FILENAME.**
1660: 0a 2a 2a 20 54 75 72 6e 20 49 2f 4f 20 74 72 61  .** Turn I/O tra
1670: 63 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20  cing on or off. 
1680: 20 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20   If FILENAME is 
1690: 6e 6f 74 20 61 6e 20 65 6d 70 74 79 20 73 74 72  not an empty str
16a0: 69 6e 67 2c 0a 2a 2a 20 49 2f 4f 20 74 72 61 63  ing,.** I/O trac
16b0: 69 6e 67 20 62 65 67 69 6e 73 20 67 6f 69 6e 67  ing begins going
16c0: 20 69 6e 74 6f 20 46 49 4c 45 4e 41 4d 45 2e 20   into FILENAME. 
16d0: 49 66 20 46 49 4c 45 4e 41 4d 45 20 69 73 20 61  If FILENAME is a
16e0: 6e 20 65 6d 70 74 79 0a 2a 2a 20 73 74 72 69 6e  n empty.** strin
16f0: 67 2c 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 69  g, I/O tracing i
1700: 73 20 74 75 72 6e 65 64 20 6f 66 66 2e 0a 2a 2f  s turned off..*/
1710: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1720: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 69  TE_TCLAPI test_i
1730: 6f 5f 74 72 61 63 65 28 0a 20 20 76 6f 69 64 20  o_trace(.  void 
1740: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1750: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1760: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1770: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1780: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1790: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
17a0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
17b0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
17c0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
17d0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
17e0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
17f0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1800: 7b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  {.#if !defined(S
1810: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
1820: 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
1830: 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
1840: 43 45 29 0a 20 20 69 66 28 20 61 72 67 63 21 3d  CE).  if( argc!=
1850: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1860: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1870: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1880: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1890: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
18a0: 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22     " FILENAME\""
18b0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
18c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
18d0: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18e0: 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69 6f  le ){.    if( io
18f0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f  trace_file!=stdo
1900: 75 74 20 26 26 20 69 6f 74 72 61 63 65 5f 66 69  ut && iotrace_fi
1910: 6c 65 21 3d 73 74 64 65 72 72 20 29 7b 0a 20 20  le!=stderr ){.  
1920: 20 20 20 20 66 63 6c 6f 73 65 28 69 6f 74 72 61      fclose(iotra
1930: 63 65 5f 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  ce_file);.    }.
1940: 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65      iotrace_file
1950: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
1960: 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
1970: 7d 0a 20 20 69 66 28 20 61 72 67 76 5b 31 5d 5b  }.  if( argv[1][
1980: 30 5d 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74  0] ){.    if( st
1990: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 73 74  rcmp(argv[1],"st
19a0: 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  dout")==0 ){.   
19b0: 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20     iotrace_file 
19c0: 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
19d0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
19e0: 72 67 76 5b 31 5d 2c 22 73 74 64 65 72 72 22 29  rgv[1],"stderr")
19f0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74  ==0 ){.      iot
1a00: 72 61 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 65  race_file = stde
1a10: 72 72 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  rr;.    }else{. 
1a20: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
1a30: 65 20 3d 20 66 6f 70 65 6e 28 61 72 67 76 5b 31  e = fopen(argv[1
1a40: 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20  ], "w");.    }. 
1a50: 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
1a60: 65 20 3d 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c  e = io_trace_cal
1a70: 6c 62 61 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69  lback;.  }.#endi
1a80: 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1a90: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1aa0: 65 3a 20 20 63 6c 61 6e 67 5f 73 61 6e 69 74 69  e:  clang_saniti
1ab0: 7a 65 5f 61 64 64 72 65 73 73 20 0a 2a 2a 0a 2a  ze_address .**.*
1ac0: 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69  * Returns true i
1ad0: 66 20 74 68 65 20 70 72 6f 67 72 61 6d 20 77 61  f the program wa
1ae0: 73 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67  s compiled using
1af0: 20 63 6c 61 6e 67 20 77 69 74 68 20 74 68 65 20   clang with the 
1b00: 0a 2a 2a 20 2d 66 73 61 6e 69 74 69 7a 65 3d 61  .** -fsanitize=a
1b10: 64 64 72 65 73 73 20 73 77 69 74 63 68 20 6f 6e  ddress switch on
1b20: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
1b30: 65 2e 20 46 61 6c 73 65 20 6f 74 68 65 72 77 69  e. False otherwi
1b40: 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72  se..**.** Also r
1b50: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
1b60: 65 20 4f 4d 49 54 5f 4d 49 53 55 53 45 20 65 6e  e OMIT_MISUSE en
1b70: 76 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62  vironment variab
1b80: 6c 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 73 74  le exists..*/.st
1b90: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1ba0: 54 43 4c 41 50 49 20 63 6c 61 6e 67 5f 73 61 6e  TCLAPI clang_san
1bb0: 69 74 69 7a 65 5f 61 64 64 72 65 73 73 28 0a 20  itize_address(. 
1bc0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
1bd0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1be0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
1bf0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
1c00: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
1c10: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
1c20: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
1c30: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1c40: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
1c50: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
1c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
1c70: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
1c80: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 65  t */.){.  int re
1c90: 73 20 3d 20 30 3b 0a 23 69 66 20 64 65 66 69 6e  s = 0;.#if defin
1ca0: 65 64 28 5f 5f 68 61 73 5f 66 65 61 74 75 72 65  ed(__has_feature
1cb0: 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f 66 65 61  ).# if __has_fea
1cc0: 74 75 72 65 28 61 64 64 72 65 73 73 5f 73 61 6e  ture(address_san
1cd0: 69 74 69 7a 65 72 29 0a 20 20 72 65 73 20 3d 20  itizer).  res = 
1ce0: 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64 69  1;.# endif.#endi
1cf0: 66 0a 23 69 66 64 65 66 20 5f 5f 53 41 4e 49 54  f.#ifdef __SANIT
1d00: 49 5a 45 5f 41 44 44 52 45 53 53 5f 5f 0a 20 20  IZE_ADDRESS__.  
1d10: 72 65 73 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a  res = 1;.#endif.
1d20: 20 20 69 66 28 20 72 65 73 3d 3d 30 20 26 26 20    if( res==0 && 
1d30: 67 65 74 65 6e 76 28 22 4f 4d 49 54 5f 4d 49 53  getenv("OMIT_MIS
1d40: 55 53 45 22 29 21 3d 30 20 29 20 72 65 73 20 3d  USE")!=0 ) res =
1d50: 20 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a   1;.  Tcl_SetObj
1d60: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
1d70: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73  cl_NewIntObj(res
1d80: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1d90: 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a 20  _OK;.}.  ./*.** 
1da0: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1db0: 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42 20  exec_printf  DB 
1dc0: 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 0a   FORMAT  STRING.
1dd0: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
1de0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70 72   sqlite3_exec_pr
1df0: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
1e00: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
1e10: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
1e20: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
1e30: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
1e40: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
1e50: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
1e60: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
1e70: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
1e80: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
1e90: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
1ea0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1eb0: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1ec0: 65 78 65 63 5f 70 72 69 6e 74 66 28 0a 20 20 76  exec_printf(.  v
1ed0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
1ee0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ef0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
1f00: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
1f10: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
1f20: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
1f30: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
1f40: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1f50: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
1f60: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
1f70: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
1f80: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
1f90: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
1fa0: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
1fb0: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
1fc0: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
1fd0: 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   0;.  char *zSql
1fe0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
1ff0: 5d 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  ];.  if( argc!=4
2000: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2010: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2020: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2030: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2040: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2050: 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49  " DB FORMAT STRI
2060: 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  NG", 0);.    ret
2070: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2080: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2090: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72  inter(interp, ar
20a0: 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65  gv[1], &db) ) re
20b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20c0: 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69    Tcl_DStringIni
20d0: 74 28 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20  t(&str);.  zSql 
20e0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
20f0: 66 28 61 72 67 76 5b 32 5d 2c 20 61 72 67 76 5b  f(argv[2], argv[
2100: 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  3]);.  rc = sqli
2110: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
2120: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
2130: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
2140: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2150: 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
2160: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2170: 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25  (zBuf), zBuf, "%
2180: 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41  d", rc);.  Tcl_A
2190: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
21a0: 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63  erp, zBuf);.  Tc
21b0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
21c0: 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49  interp, rc==SQLI
21d0: 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72  TE_OK ? Tcl_DStr
21e0: 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29 20 3a  ingValue(&str) :
21f0: 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53   zErr);.  Tcl_DS
2200: 74 72 69 6e 67 46 72 65 65 28 26 73 74 72 29 3b  tringFree(&str);
2210: 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20 73 71  .  if( zErr ) sq
2220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29  lite3_free(zErr)
2230: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
2240: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
2250: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
2260: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2270: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2280: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
2290: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68 65   sqlite3_exec_he
22a0: 78 20 20 44 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a  x  DB  HEX.**.**
22b0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
22c0: 74 65 33 5f 65 78 65 63 28 29 20 6f 6e 20 61 20  te3_exec() on a 
22d0: 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6f  string that is o
22e0: 62 74 61 69 6e 65 64 20 62 79 20 74 72 61 6e 73  btained by trans
22f0: 6c 61 74 69 6e 67 0a 2a 2a 20 48 45 58 20 69 6e  lating.** HEX in
2300: 74 6f 20 41 53 43 49 49 2e 20 20 4d 6f 73 74 20  to ASCII.  Most 
2310: 63 68 61 72 61 63 74 65 72 73 20 61 72 65 20 74  characters are t
2320: 72 61 6e 73 6c 61 74 65 64 20 61 73 20 69 73 2e  ranslated as is.
2330: 20 20 25 48 48 20 62 65 63 6f 6d 65 73 0a 2a 2a    %HH becomes.**
2340: 20 61 20 68 65 78 20 63 68 61 72 61 63 74 65 72   a hex character
2350: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2360: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
2370: 73 74 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76  st_exec_hex(.  v
2380: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
2390: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
23a0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23b0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23c0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23d0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23e0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
23f0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2400: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2410: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2420: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2430: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2440: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2450: 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  *db;.  Tcl_DStri
2460: 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63  ng str;.  int rc
2470: 2c 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a  , i, j;.  char *
2480: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zErr = 0;.  char
2490: 20 2a 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a   *zHex;.  char z
24a0: 53 71 6c 5b 35 30 31 5d 3b 0a 20 20 63 68 61 72  Sql[501];.  char
24b0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
24c0: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
24d0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
24e0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
24f0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2500: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2510: 0a 20 20 20 20 20 20 20 22 20 44 42 20 48 45 58  .       " DB HEX
2520: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
2530: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2540: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2550: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2560: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2570: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2580: 7a 48 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  zHex = argv[2];.
2590: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 28    for(i=j=0; i<(
25a0: 73 69 7a 65 6f 66 28 7a 53 71 6c 29 2d 31 29 20  sizeof(zSql)-1) 
25b0: 26 26 20 7a 48 65 78 5b 6a 5d 3b 20 69 2b 2b 2c  && zHex[j]; i++,
25c0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   j++){.    if( z
25d0: 48 65 78 5b 6a 5d 3d 3d 27 25 27 20 26 26 20 7a  Hex[j]=='%' && z
25e0: 48 65 78 5b 6a 2b 32 5d 20 26 26 20 7a 48 65 78  Hex[j+2] && zHex
25f0: 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20 20 20 20 7a  [j+2] ){.      z
2600: 53 71 6c 5b 69 5d 20 3d 20 28 74 65 73 74 48 65  Sql[i] = (testHe
2610: 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 31 5d  xToInt(zHex[j+1]
2620: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2630: 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 32 5d 29 3b  oInt(zHex[j+2]);
2640: 0a 20 20 20 20 20 20 6a 20 2b 3d 20 32 3b 0a 20  .      j += 2;. 
2650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2660: 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48 65 78 5b 6a  zSql[i] = zHex[j
2670: 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a  ];.    }.  }.  z
2680: 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20 20 54 63  Sql[i] = 0;.  Tc
2690: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
26a0: 74 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  tr);.  rc = sqli
26b0: 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 71  te3_exec(db, zSq
26c0: 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63  l, exec_printf_c
26d0: 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72 29 3b  b, &str, &zErr);
26e0: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
26f0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
2700: 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63  , zBuf, "%d", rc
2710: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45  );.  Tcl_AppendE
2720: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
2730: 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  Buf);.  Tcl_Appe
2740: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2750: 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  , rc==SQLITE_OK 
2760: 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56 61 6c  ? Tcl_DStringVal
2770: 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72 72 29  ue(&str) : zErr)
2780: 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 46  ;.  Tcl_DStringF
2790: 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69 66 28  ree(&str);.  if(
27a0: 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65 33 5f   zErr ) sqlite3_
27b0: 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 69 66  free(zErr);.  if
27c0: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
27d0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
27e0: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
27f0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
2800: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2810: 2a 2a 20 55 73 61 67 65 3a 20 20 64 62 5f 65 6e  ** Usage:  db_en
2820: 74 65 72 20 44 42 0a 2a 2a 20 20 20 20 20 20 20  ter DB.**       
2830: 20 20 64 62 5f 6c 65 61 76 65 20 44 42 0a 2a 2a    db_leave DB.**
2840: 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20 6c 65 61  .** Enter or lea
2850: 76 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20  ve the mutex on 
2860: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
2870: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
2880: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2890: 50 49 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76  PI db_enter(.  v
28a0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
28b0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28c0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
28d0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
28e0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
28f0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2900: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
2910: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2920: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2930: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
2940: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
2950: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
2960: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
2970: 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
2980: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
2990: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
29a0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
29b0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
29c0: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
29d0: 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20    " DB", 0);.   
29e0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29f0: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2a00: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2a10: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
2a20: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2a30: 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  OR;.  sqlite3_mu
2a40: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
2a50: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  tex);.  return T
2a60: 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20  CL_OK;.}.static 
2a70: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2a80: 49 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  I db_leave(.  vo
2a90: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2aa0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2ab0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2ac0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2ad0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2ae0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2af0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2b00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2b10: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2b20: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
2b30: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
2b40: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
2b50: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
2b60: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
2b70: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
2b80: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2b90: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2ba0: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2bb0: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2bc0: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2bd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2be0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2bf0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2c00: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2c10: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c20: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
2c30: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
2c40: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
2c50: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
2c60: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
2c70: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
2c80: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2c90: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2ca0: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2cb0: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2cc0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
2cd0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
2ce0: 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20 2a 4e  _exec(.  void *N
2cf0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
2d00: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2d10: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2d20: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2d30: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2d40: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2d70: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
2d80: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
2d90: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
2da0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
2db0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
2dc0: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
2dd0: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
2de0: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
2df0: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
2e00: 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 7a  t i, j;.  char z
2e10: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2e20: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2e30: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2e40: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
2e50: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
2e60: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
2e70: 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22 2c        " DB SQL",
2e80: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
2e90: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ea0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2eb0: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2ec0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2ed0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
2ee0: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
2ef0: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
2f00: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
2f10: 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20  s", argv[2]);.  
2f20: 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71 6c 5b  for(i=j=0; zSql[
2f30: 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20 7a 53  i];){.    if( zS
2f40: 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a 20 20  ql[i]=='%' ){.  
2f50: 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2f60: 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53  (testHexToInt(zS
2f70: 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b 20 74  ql[i+1])<<4) + t
2f80: 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53 71 6c  estHexToInt(zSql
2f90: 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20 69 20  [i+2]);.      i 
2fa0: 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  += 3;.    }else{
2fb0: 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d  .      zSql[j++]
2fc0: 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a 20 20   = zSql[i++];.  
2fd0: 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 6a    }.  }.  zSql[j
2fe0: 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  ] = 0;.  rc = sq
2ff0: 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
3000: 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74 66  Sql, exec_printf
3010: 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  _cb, &str, &zErr
3020: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3030: 65 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zSql);.  sqlit
3040: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3050: 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
3060: 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c  "%d", rc);.  Tcl
3070: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
3080: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
3090: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
30a0: 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d 53 51  t(interp, rc==SQ
30b0: 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f 44 53  LITE_OK ? Tcl_DS
30c0: 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74 72 29  tringValue(&str)
30d0: 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63 6c 5f   : zErr);.  Tcl_
30e0: 44 53 74 72 69 6e 67 46 72 65 65 28 26 73 74 72  DStringFree(&str
30f0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20 29 20  );.  if( zErr ) 
3100: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
3110: 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  r);.  if( sqlite
3120: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
3130: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
3140: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
3150: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
3170: 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  :  sqlite3_exec_
3180: 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a 2a  nr  DB  SQL.**.*
3190: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
31a0: 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72 66  ite3_exec interf
31b0: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
31c0: 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  en database DB. 
31d0: 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c 6c 20   Discard.** all 
31e0: 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61 74 69  results.*/.stati
31f0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
3200: 41 50 49 20 74 65 73 74 5f 65 78 65 63 5f 6e 72  API test_exec_nr
3210: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3220: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3230: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3240: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3250: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3260: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3270: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3280: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3290: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
32a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
32c0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
32d0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
32e0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
32f0: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
3300: 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 72 67 63   = 0;.  if( argc
3310: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
3320: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3330: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
3340: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
3350: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
3360: 20 20 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29     " DB SQL", 0)
3370: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
3380: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
3390: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
33a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
33b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
33c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
33d0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
33e0: 20 61 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20   argv[2], 0, 0, 
33f0: 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  &zErr);.  if( sq
3400: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
3410: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
3420: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
3430: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
3440: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
3450: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
3460: 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53  printf_z_test  S
3470: 45 50 41 52 41 54 4f 52 20 20 41 52 47 30 20 20  EPARATOR  ARG0  
3480: 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54  ARG1 ....**.** T
3490: 65 73 74 20 74 68 65 20 25 7a 20 66 6f 72 6d 61  est the %z forma
34a0: 74 20 6f 66 20 73 71 6c 69 74 65 5f 6d 70 72 69  t of sqlite_mpri
34b0: 6e 74 66 28 29 2e 20 20 55 73 65 20 6d 75 6c 74  ntf().  Use mult
34c0: 69 70 6c 65 20 6d 70 72 69 6e 74 66 28 29 20 63  iple mprintf() c
34d0: 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63  alls to .** conc
34e0: 61 74 65 6e 61 74 65 20 61 72 67 30 20 74 68 72  atenate arg0 thr
34f0: 6f 75 67 68 20 61 72 67 6e 20 75 73 69 6e 67 20  ough argn using 
3500: 73 65 70 61 72 61 74 6f 72 20 61 73 20 74 68 65  separator as the
3510: 20 73 65 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52   separator..** R
3520: 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c 74  eturn the result
3530: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3540: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3550: 73 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20  st_mprintf_z(.  
3560: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3570: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3580: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3590: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
35a0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
35b0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
35c0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
35d0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
35e0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
35f0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3600: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3610: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3620: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
3630: 52 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e  Result = 0;.  in
3640: 74 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b  t i;..  for(i=2;
3650: 20 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32   i<argc && (i==2
3660: 20 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b   || zResult); i+
3670: 2b 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20  +){.    zResult 
3680: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
3690: 66 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73  f("%z%s%s", zRes
36a0: 75 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72  ult, argv[1], ar
36b0: 67 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63  gv[i]);.  }.  Tc
36c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
36d0: 6e 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20  nterp, zResult, 
36e0: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
36f0: 65 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72  ee(zResult);.  r
3700: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
3710: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3720: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e  qlite3_mprintf_n
3730: 5f 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a  _test  STRING.**
3740: 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20  .** Test the %n 
3750: 66 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65  format of sqlite
3760: 5f 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74  _mprintf().  Ret
3770: 75 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f  urn the length o
3780: 66 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73  f the.** input s
3790: 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  tring..*/.static
37a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
37b0: 50 49 20 74 65 73 74 5f 6d 70 72 69 6e 74 66 5f  PI test_mprintf_
37c0: 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  n(.  void *NotUs
37d0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
37e0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
37f0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
3800: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
3810: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
3820: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
3830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3840: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
3850: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
3860: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
3870: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
3880: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68  ument */.){.  ch
3890: 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74 20  ar *zStr;.  int 
38a0: 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d 20  n = 0;.  zStr = 
38b0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
38c0: 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31 5d 2c  "%s%n", argv[1],
38d0: 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   &n);.  sqlite3_
38e0: 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20 54 63  free(zStr);.  Tc
38f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
3900: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
3910: 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65 74 75  tObj(n));.  retu
3920: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
3930: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
3940: 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
3950: 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20 20 49    SIZE FORMAT  I
3960: 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68  NT.**.** Test th
3970: 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 6e 70  e of sqlite3_snp
3980: 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e 65 2e  rintf() routine.
3990: 20 20 53 49 5a 45 20 69 73 20 74 68 65 20 73 69    SIZE is the si
39a0: 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74  ze of the.** out
39b0: 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62 79  put buffer in by
39c0: 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69 6d 75  tes.  The maximu
39d0: 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e 20 20  m size is 100.  
39e0: 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a 2a 2a  FORMAT is the.**
39f0: 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e 20   format string. 
3a00: 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67 6c 65   INT is a single
3a10: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
3a20: 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54 0a 2a  t.  The FORMAT.*
3a30: 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20 72 65  * string must re
3a40: 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20 74 68  quire no more th
3a50: 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e 74 65  an this one inte
3a60: 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20 49  ger argument.  I
3a70: 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20 69 6e  f.** You pass in
3a80: 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67   a format string
3a90: 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20 6d   that requires m
3aa0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 72 67  ore than one arg
3ab0: 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20 74 68  ument,.** bad th
3ac0: 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70 65 6e  ings will happen
3ad0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
3af0: 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74 28  st_snprintf_int(
3b00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3b10: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
3b20: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
3b30: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
3b40: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
3b50: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
3b60: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
3b80: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
3b90: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
3bb0: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
3bc0: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
3bd0: 20 7a 53 74 72 5b 31 30 30 5d 3b 0a 20 20 69 6e   zStr[100];.  in
3be0: 74 20 6e 20 3d 20 61 74 6f 69 28 61 72 67 76 5b  t n = atoi(argv[
3bf0: 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  1]);.  const cha
3c00: 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20 61 72 67  r *zFormat = arg
3c10: 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61 31 20 3d  v[2];.  int a1 =
3c20: 20 61 74 6f 69 28 61 72 67 76 5b 33 5d 29 3b 0a   atoi(argv[3]);.
3c30: 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f 66 28 7a    if( n>sizeof(z
3c40: 53 74 72 29 20 29 20 6e 20 3d 20 73 69 7a 65 6f  Str) ) n = sizeo
3c50: 66 28 7a 53 74 72 29 3b 0a 20 20 73 71 6c 69 74  f(zStr);.  sqlit
3c60: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
3c70: 6f 66 28 7a 53 74 72 29 2c 20 7a 53 74 72 2c 20  of(zStr), zStr, 
3c80: 22 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f  "abcdefghijklmno
3c90: 70 71 72 73 74 75 76 77 78 79 7a 22 29 3b 0a 20  pqrstuvwxyz");. 
3ca0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
3cb0: 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46 6f 72 6d  f(n, zStr, zForm
3cc0: 61 74 2c 20 61 31 29 3b 0a 20 20 54 63 6c 5f 41  at, a1);.  Tcl_A
3cd0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
3ce0: 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b 0a 20 20  rp, zStr, 0);.  
3cf0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
3d00: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
3d10: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 0a  _OMIT_GET_TABLE.
3d20: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
3d30: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
3d40: 5f 70 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52  _printf  DB  FOR
3d50: 4d 41 54 20 20 53 54 52 49 4e 47 20 20 3f 2d 2d  MAT  STRING  ?--
3d60: 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a 0a 2a 2a  no-counts?.**.**
3d70: 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69   Invoke the sqli
3d80: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72  te3_get_table_pr
3d90: 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63 65  intf() interface
3da0: 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20   using the open 
3db0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e 20  database.** DB. 
3dc0: 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65 20   The SQL is the 
3dd0: 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20 20  string FORMAT.  
3de0: 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  The format strin
3df0: 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  g should contain
3e00: 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25 71  .** one %s or %q
3e10: 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68 65  .  STRING is the
3e20: 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64 20   value inserted 
3e30: 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a 2a  into %s or %q..*
3e40: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
3e50: 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
3e60: 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
3e70: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
3e80: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
3e90: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
3ea0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
3eb0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
3ec0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
3ed0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
3ee0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
3ef0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
3f00: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
3f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
3f20: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
3f30: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
3f40: 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f  ite3 *db;.  Tcl_
3f50: 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69  DString str;.  i
3f60: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
3f70: 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Err = 0;.  int n
3f80: 52 6f 77 20 3d 20 30 2c 20 6e 43 6f 6c 20 3d 20  Row = 0, nCol = 
3f90: 30 3b 0a 20 20 63 68 61 72 20 2a 2a 61 52 65 73  0;.  char **aRes
3fa0: 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
3fb0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
3fc0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69   char *zSql;.  i
3fd0: 6e 74 20 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31  nt resCount = -1
3fe0: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3ff0: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
4000: 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
4010: 67 76 5b 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74  gv[4], &resCount
4020: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
4030: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4040: 61 72 67 63 21 3d 34 20 26 26 20 61 72 67 63 21  argc!=4 && argc!
4050: 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
4060: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
4070: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
4080: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
4090: 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
40a0: 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53 54    " DB FORMAT ST
40b0: 52 49 4e 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30  RING ?COUNT?", 0
40c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
40d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
40e0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
40f0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4100: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4110: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
4120: 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73 74 72  DStringInit(&str
4130: 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
4140: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
4150: 5b 32 5d 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20  [2],argv[3]);.  
4160: 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20  if( argc==5 ){. 
4170: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
4180: 67 65 74 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53  get_table(db, zS
4190: 71 6c 2c 20 26 61 52 65 73 75 6c 74 2c 20 30 2c  ql, &aResult, 0,
41a0: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65   0, &zErr);.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
41c0: 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28  lite3_get_table(
41d0: 64 62 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75  db, zSql, &aResu
41e0: 6c 74 2c 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c  lt, &nRow, &nCol
41f0: 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 72 65  , &zErr);.    re
4200: 73 43 6f 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31  sCount = (nRow+1
4210: 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71  )*nCol;.  }.  sq
4220: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
4230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
4240: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
4250: 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20 72  ), zBuf, "%d", r
4260: 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  c);.  Tcl_Append
4270: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
4280: 7a 42 75 66 29 3b 0a 20 20 69 66 28 20 72 63 3d  zBuf);.  if( rc=
4290: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
42a0: 20 20 69 66 28 20 61 72 67 63 3d 3d 34 20 29 7b    if( argc==4 ){
42b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
42c0: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
42d0: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22  Buf), zBuf, "%d"
42e0: 2c 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54  , nRow);.      T
42f0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
4300: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
4310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
4320: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
4330: 75 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c  uf), zBuf, "%d",
4340: 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63   nCol);.      Tc
4350: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
4360: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
4370: 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30     }.    for(i=0
4380: 3b 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b  ; i<resCount; i+
4390: 2b 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70  +){.      Tcl_Ap
43a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
43b0: 72 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f  rp, aResult[i] ?
43c0: 20 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e   aResult[i] : "N
43d0: 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ULL");.    }.  }
43e0: 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70  else{.    Tcl_Ap
43f0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
4400: 72 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20  rp, zErr);.  }. 
4410: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61   sqlite3_free_ta
4420: 62 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20  ble(aResult);.  
4430: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
4440: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
4450: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
4460: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
4470: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
4480: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
4490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
44a0: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
44b0: 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20  _OMIT_GET_TABLE 
44c0: 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  */.../*.** Usage
44d0: 3a 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f  :  sqlite3_last_
44e0: 69 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a  insert_rowid DB.
44f0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68  **.** Returns th
4500: 65 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20  e integer ROWID 
4510: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
4520: 6e 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74  nt insert..*/.st
4530: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
4540: 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 61 73 74  TCLAPI test_last
4550: 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20 2a  _rowid(.  void *
4560: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
4570: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
4580: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
4590: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
45a0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
45b0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
45c0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
45d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
45e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
45f0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
4600: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
4610: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
4620: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
4630: 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b    char zBuf[30];
4640: 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ..  if( argc!=2 
4650: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
4660: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
4670: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
4680: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
4690: 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c 20  gv[0], " DB\"", 
46a0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
46b0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
46c0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
46d0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
46e0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
46f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
4700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
4710: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
4720: 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c 69 74 65  , "%lld", sqlite
4730: 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f  3_last_insert_ro
4740: 77 69 64 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f  wid(db));.  Tcl_
4750: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
4760: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
4770: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
4780: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
4790: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 20  e:  sqlite3_key 
47a0: 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 53 65 74  DB KEY.**.** Set
47b0: 20 74 68 65 20 63 6f 64 65 63 20 6b 65 79 2e 0a   the codec key..
47c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
47d0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
47e0: 5f 6b 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  _key(.  void *No
47f0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4800: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4810: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4820: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4830: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4840: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4850: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4860: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4870: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4880: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4890: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
48a0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23  argument */.){.#
48b0: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
48c0: 45 5f 48 41 53 5f 43 4f 44 45 43 29 20 26 26 20  E_HAS_CODEC) && 
48d0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
48e0: 4f 4d 49 54 5f 43 4f 44 45 43 5f 46 52 4f 4d 5f  OMIT_CODEC_FROM_
48f0: 54 43 4c 29 0a 20 20 73 71 6c 69 74 65 33 20 2a  TCL).  sqlite3 *
4900: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4910: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4920: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4930: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4940: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4950: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4960: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4970: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4980: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4990: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
49a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
49b0: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
49c0: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
49d0: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
49e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
49f0: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4a00: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4a10: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79  );.  sqlite3_key
4a20: 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29  (db, zKey, nKey)
4a30: 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
4a40: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4a50: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
4a60: 65 33 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a  e3_rekey DB KEY.
4a70: 2a 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  **.** Change the
4a80: 20 63 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73   codec key..*/.s
4a90: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
4aa0: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 6b  _TCLAPI test_rek
4ab0: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4ac0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4ad0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4ae0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4af0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4b00: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4b10: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4b30: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
4b40: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
4b50: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
4b60: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
4b70: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
4b80: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
4b90: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  sqlite3 *
4ba0: 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db;.  const char
4bb0: 20 2a 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b   *zKey;.  int nK
4bc0: 65 79 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  ey;.  if( argc!=
4bd0: 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
4be0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
4bf0: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
4c00: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
4c10: 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20  argv[0],.       
4c20: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
4c30: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
4c40: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
4c50: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
4c60: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
4c70: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
4c80: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79  CL_ERROR;.  zKey
4c90: 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b   = argv[2];.  nK
4ca0: 65 79 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79  ey = strlen(zKey
4cb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 6b  );.  sqlite3_rek
4cc0: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4cd0: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4ce0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4cf0: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4d00: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4d10: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4d20: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4d30: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4d40: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
4d50: 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71 6c 69  LITE_TCLAPI sqli
4d60: 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28 0a 20  te_test_close(. 
4d70: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
4d80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
4d90: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
4da0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
4db0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
4dc0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
4dd0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
4de0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
4df0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
4e00: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
4e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
4e20: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
4e30: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
4e40: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
4e50: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
4e60: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
4e70: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
4e80: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
4e90: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
4ea0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
4eb0: 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a  ILENAME\"", 0);.
4ec0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
4ed0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
4ee0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
4ef0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
4f00: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
4f10: 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
4f20: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b  lite3_close(db);
4f30: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
4f40: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
4f50: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
4f60: 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
4f70: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
4f80: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
4f90: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
4fa0: 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f 73 65  2 DB.**.** Close
4fb0: 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f  s the database o
4fc0: 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  pened by sqlite3
4fd0: 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  _open..*/.static
4fe0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
4ff0: 50 49 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  PI sqlite_test_c
5000: 6c 6f 73 65 5f 76 32 28 0a 20 20 76 6f 69 64 20  lose_v2(.  void 
5010: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
5020: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
5030: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
5040: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
5050: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
5060: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
5070: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
5080: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
5090: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
50a0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
50b0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
50c0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
50d0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
50e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
50f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
5100: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
5110: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
5120: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
5130: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
5140: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
5150: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
5160: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
5170: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
5180: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
5190: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
51a0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
51b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
51c0: 63 6c 6f 73 65 5f 76 32 28 64 62 29 3b 0a 20 20  close_v2(db);.  
51d0: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
51e0: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
51f0: 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
5200: 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65  CL_STATIC);.  re
5210: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
5220: 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
5230: 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f  tion of the x_co
5240: 61 6c 65 73 63 65 28 29 20 66 75 6e 63 74 69 6f  alesce() functio
5250: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  n..** Return the
5260: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
5270: 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  non-NULL argumen
5280: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
5290: 64 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28  d t1_ifnullFunc(
52a0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
52b0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
52c0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
52d0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
52e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
52f0: 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
5300: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 53 51 4c  ++){.    if( SQL
5310: 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65  ITE_NULL!=sqlite
5320: 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67  3_value_type(arg
5330: 76 5b 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 69  v[i]) ){.      i
5340: 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76  nt n = sqlite3_v
5350: 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76 5b  alue_bytes(argv[
5360: 69 5d 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  i]);.      sqlit
5370: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63  e3_result_text(c
5380: 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a 29 73  ontext, (char*)s
5390: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
53a0: 74 28 61 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20  t(argv[i]),.    
53b0: 20 20 20 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f        n, SQLITE_
53c0: 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20  TRANSIENT);.    
53d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
53e0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73   }.}../*.** Thes
53f0: 65 20 61 72 65 20 74 65 73 74 20 66 75 6e 63 74  e are test funct
5400: 69 6f 6e 73 2e 20 20 20 20 68 65 78 38 28 29 20  ions.    hex8() 
5410: 69 6e 74 65 72 70 72 65 74 73 20 69 74 73 20 61  interprets its a
5420: 72 67 75 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54  rgument as.** UT
5430: 46 38 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  F8 and returns a
5440: 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20   hex encoding.  
5450: 68 65 78 31 36 6c 65 28 29 20 69 6e 74 65 72 70  hex16le() interp
5460: 72 65 74 73 20 69 74 73 20 61 72 67 75 6d 65 6e  rets its argumen
5470: 74 0a 2a 2a 20 61 73 20 55 54 46 31 36 6c 65 20  t.** as UTF16le 
5480: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
5490: 78 20 65 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73  x encoding..*/.s
54a0: 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 38 46  tatic void hex8F
54b0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
54c0: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
54d0: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
54e0: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
54f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
5500: 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  z;.  int i;.  ch
5510: 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
5520: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
5530: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5540: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
5550: 7a 65 6f 66 28 7a 42 75 66 29 2f 32 20 2d 20 32  zeof(zBuf)/2 - 2
5560: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
5570: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
5580: 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66  intf(sizeof(zBuf
5590: 29 2d 69 2a 32 2c 20 26 7a 42 75 66 5b 69 2a 32  )-i*2, &zBuf[i*2
55a0: 5d 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69 5d 29  ], "%02x", z[i])
55b0: 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32  ;.  }.  zBuf[i*2
55c0: 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  ] = 0;.  sqlite3
55d0: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20  _result_text(p, 
55e0: 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c  (char*)zBuf, -1,
55f0: 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
5600: 54 29 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51  T);.}.#ifndef SQ
5610: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
5620: 73 74 61 74 69 63 20 76 6f 69 64 20 68 65 78 31  static void hex1
5630: 36 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f  6Func(sqlite3_co
5640: 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72  ntext *p, int ar
5650: 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  gc, sqlite3_valu
5660: 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e  e **argv){.  con
5670: 73 74 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72  st unsigned shor
5680: 74 20 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20  t int *z;.  int 
5690: 69 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34  i;.  char zBuf[4
56a0: 30 30 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  00];.  z = sqlit
56b0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
56c0: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28  argv[0]);.  for(
56d0: 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42  i=0; i<sizeof(zB
56e0: 75 66 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69  uf)/4 - 4 && z[i
56f0: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  ]; i++){.    sql
5700: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
5710: 7a 65 6f 66 28 7a 42 75 66 29 2d 69 2a 34 2c 20  zeof(zBuf)-i*4, 
5720: 26 7a 42 75 66 5b 69 2a 34 5d 2c 22 25 30 34 78  &zBuf[i*4],"%04x
5730: 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20  ", z[i]&0xff);. 
5740: 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d   }.  zBuf[i*4] =
5750: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65   0;.  sqlite3_re
5760: 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63 68  sult_text(p, (ch
5770: 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51  ar*)zBuf, -1, SQ
5780: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
5790: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
57a0: 20 41 20 73 74 72 75 63 74 75 72 65 20 69 6e 74   A structure int
57b0: 6f 20 77 68 69 63 68 20 74 6f 20 61 63 63 75 6d  o which to accum
57c0: 75 6c 61 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73  ulate text..*/.s
57d0: 74 72 75 63 74 20 64 73 74 72 20 7b 0a 20 20 69  truct dstr {.  i
57e0: 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53  nt nAlloc;  /* S
57f0: 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a  pace allocated *
5800: 2f 0a 20 20 69 6e 74 20 6e 55 73 65 64 3b 20 20  /.  int nUsed;  
5810: 20 2f 2a 20 53 70 61 63 65 20 75 73 65 64 20 2a   /* Space used *
5820: 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
5830: 20 2f 2a 20 54 68 65 20 73 70 61 63 65 20 2a 2f   /* The space */
5840: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  .};../*.** Appen
5850: 64 20 74 65 78 74 20 74 6f 20 61 20 64 73 74 72  d text to a dstr
5860: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5870: 64 73 74 72 41 70 70 65 6e 64 28 73 74 72 75 63  dstrAppend(struc
5880: 74 20 64 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74  t dstr *p, const
5890: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69   char *z, int di
58a0: 76 69 64 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20  vider){.  int n 
58b0: 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29  = (int)strlen(z)
58c0: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 55 73 65 64  ;.  if( p->nUsed
58d0: 20 2b 20 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41   + n + 2 > p->nA
58e0: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 63 68 61 72  lloc ){.    char
58f0: 20 2a 7a 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e   *zNew;.    p->n
5900: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
5910: 63 2a 32 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20  c*2 + n + 200;. 
5920: 20 20 20 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65     zNew = sqlite
5930: 33 5f 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20  3_realloc(p->z, 
5940: 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  p->nAlloc);.    
5950: 69 66 28 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( zNew==0 ){. 
5960: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
5970: 65 28 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d  e(p->z);.      m
5980: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
5990: 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72  of(*p));.      r
59a0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  eturn;.    }.   
59b0: 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20   p->z = zNew;.  
59c0: 7d 0a 20 20 69 66 28 20 64 69 76 69 64 65 72 20  }.  if( divider 
59d0: 26 26 20 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b  && p->nUsed>0 ){
59e0: 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73  .    p->z[p->nUs
59f0: 65 64 2b 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b  ed++] = divider;
5a00: 0a 20 20 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70  .  }.  memcpy(&p
5a10: 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a  ->z[p->nUsed], z
5a20: 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73  , n+1);.  p->nUs
5a30: 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  ed += n;.}../*.*
5a40: 2a 20 49 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61  * Invoked for ea
5a50: 63 68 20 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d  ch callback from
5a60: 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63   sqlite3ExecFunc
5a70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
5a80: 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28  xecFuncCallback(
5a90: 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74  void *pData, int
5aa0: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
5ab0: 67 76 2c 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73  gv, char **NotUs
5ac0: 65 64 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  ed){.  struct ds
5ad0: 74 72 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20  tr *p = (struct 
5ae0: 64 73 74 72 2a 29 70 44 61 74 61 3b 0a 20 20 69  dstr*)pData;.  i
5af0: 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
5b00: 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20   i<argc; i++){. 
5b10: 20 20 20 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d     if( argv[i]==
5b20: 30 20 29 7b 0a 20 20 20 20 20 20 64 73 74 72 41  0 ){.      dstrA
5b30: 70 70 65 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c  ppend(p, "NULL",
5b40: 20 27 20 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65   ' ');.    }else
5b50: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
5b60: 6e 64 28 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27  nd(p, argv[i], '
5b70: 20 27 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   ');.    }.  }. 
5b80: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
5b90: 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
5ba0: 6f 6e 20 6f 66 20 74 68 65 20 78 5f 73 71 6c 69  on of the x_sqli
5bb0: 74 65 5f 65 78 65 63 28 29 20 66 75 6e 63 74 69  te_exec() functi
5bc0: 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e 63 74 69  on.  This functi
5bd0: 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69  on takes.** a si
5be0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 61 6e  ngle argument an
5bf0: 64 20 61 74 74 65 6d 70 74 73 20 74 6f 20 65 78  d attempts to ex
5c00: 65 63 75 74 65 20 74 68 61 74 20 61 72 67 75 6d  ecute that argum
5c10: 65 6e 74 20 61 73 20 53 51 4c 20 63 6f 64 65 2e  ent as SQL code.
5c20: 0a 2a 2a 20 54 68 69 73 20 69 73 20 69 6c 6c 65  .** This is ille
5c30: 67 61 6c 20 61 6e 64 20 73 68 6f 75 6c 64 20 73  gal and should s
5c40: 65 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49  et the SQLITE_MI
5c50: 53 55 53 45 20 66 6c 61 67 20 6f 6e 20 74 68 65  SUSE flag on the
5c60: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
5c70: 20 32 30 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57   2004-Jan-07:  W
5c80: 65 20 68 61 76 65 20 63 68 61 6e 67 65 64 20 74  e have changed t
5c90: 68 69 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c  his to make it l
5ca0: 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
5cb0: 69 74 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66  ite3_exec().** f
5cc0: 72 6f 6d 20 77 69 74 68 69 6e 20 61 20 66 75 6e  rom within a fun
5cd0: 63 74 69 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a  ction call.  .**
5ce0: 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e   .** This routin
5cf0: 65 20 73 69 6d 75 6c 61 74 65 73 20 74 68 65 20  e simulates the 
5d00: 65 66 66 65 63 74 20 6f 66 20 68 61 76 69 6e 67  effect of having
5d10: 20 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 74   two threads att
5d20: 65 6d 70 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74  empt to.** use t
5d30: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
5d40: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5d50: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5d60: 64 20 73 71 6c 69 74 65 33 45 78 65 63 46 75 6e  d sqlite3ExecFun
5d70: 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  c(.  sqlite3_con
5d80: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
5d90: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
5da0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5db0: 61 72 67 76 0a 29 7b 0a 20 20 73 74 72 75 63 74  argv.){.  struct
5dc0: 20 64 73 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65   dstr x;.  memse
5dd0: 74 28 26 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&x, 0, sizeof(
5de0: 78 29 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  x));.  (void)sql
5df0: 69 74 65 33 5f 65 78 65 63 28 28 73 71 6c 69 74  ite3_exec((sqlit
5e00: 65 33 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72  e3*)sqlite3_user
5e10: 5f 64 61 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a  _data(context),.
5e20: 20 20 20 20 20 20 28 63 68 61 72 2a 29 73 71 6c        (char*)sql
5e30: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5e40: 61 72 67 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20  argv[0]),.      
5e50: 65 78 65 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b  execFuncCallback
5e60: 2c 20 26 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69  , &x, 0);.  sqli
5e70: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5e80: 63 6f 6e 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e  context, x.z, x.
5e90: 6e 55 73 65 64 2c 20 53 51 4c 49 54 45 5f 54 52  nUsed, SQLITE_TR
5ea0: 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69  ANSIENT);.  sqli
5eb0: 74 65 33 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d  te3_free(x.z);.}
5ec0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
5ed0: 74 61 74 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31  tation of tkt221
5ee0: 33 66 75 6e 63 28 29 2c 20 61 20 73 63 61 6c 61  3func(), a scala
5ef0: 72 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  r function that 
5f00: 74 61 6b 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a  takes exactly.**
5f10: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2e 20 49   one argument. I
5f20: 74 20 68 61 73 20 74 77 6f 20 69 6e 74 65 72 65  t has two intere
5f30: 73 74 69 6e 67 20 66 65 61 74 75 72 65 73 3a 0a  sting features:.
5f40: 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73  **.** * It calls
5f50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
5f60: 65 78 74 28 29 20 33 20 74 69 6d 65 73 20 6f 6e  ext() 3 times on
5f70: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 73 71   the argument sq
5f80: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a  lite3_value*..**
5f90: 20 20 20 49 66 20 74 68 65 20 74 68 72 65 65 20     If the three 
5fa0: 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65  pointers returne
5fb0: 64 20 61 72 65 20 6e 6f 74 20 74 68 65 20 73 61  d are not the sa
5fc0: 6d 65 20 61 6e 20 53 51 4c 20 65 72 72 6f 72 20  me an SQL error 
5fd0: 69 73 20 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a  is raised..**.**
5fe0: 20 2a 20 4f 74 68 65 72 77 69 73 65 20 69 74 20   * Otherwise it 
5ff0: 72 65 74 75 72 6e 73 20 61 20 63 6f 70 79 20 6f  returns a copy o
6000: 66 20 74 68 65 20 74 65 78 74 20 72 65 70 72 65  f the text repre
6010: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 69 74 73  sentation of its
6020: 20 0a 2a 2a 20 20 20 61 72 67 75 6d 65 6e 74 20   .**   argument 
6030: 69 6e 20 73 75 63 68 20 61 20 77 61 79 20 61 73  in such a way as
6040: 20 74 68 65 20 56 44 42 45 20 72 65 70 72 65 73   the VDBE repres
6050: 65 6e 74 61 74 69 6f 6e 20 69 73 20 61 20 4d 65  entation is a Me
6060: 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69  m* cell .**   wi
6070: 74 68 20 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20  th the MEM_Term 
6080: 66 6c 61 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a  flag clear. .**.
6090: 2a 2a 20 54 69 63 6b 65 74 20 23 32 32 31 33 20  ** Ticket #2213 
60a0: 63 61 6e 20 74 68 65 72 65 66 6f 72 65 20 62 65  can therefore be
60b0: 20 74 65 73 74 65 64 20 62 79 20 65 76 61 6c 75   tested by evalu
60c0: 61 74 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  ating the follow
60d0: 69 6e 67 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65  ing.** SQL expre
60e0: 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74  ssion:.**.**   t
60f0: 6b 74 32 32 31 33 66 75 6e 63 28 74 6b 74 32 32  kt2213func(tkt22
6100: 31 33 66 75 6e 63 28 27 61 20 73 74 72 69 6e 67  13func('a string
6110: 27 29 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  '));.*/.static v
6120: 6f 69 64 20 74 6b 74 32 32 31 33 46 75 6e 63 74  oid tkt2213Funct
6130: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ion(.  sqlite3_c
6140: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
6150: 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a   .  int argc,  .
6160: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6170: 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20  **argv.){.  int 
6180: 6e 54 65 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65  nText;.  unsigne
6190: 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54  d char const *zT
61a0: 65 78 74 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64  ext1;.  unsigned
61b0: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65   char const *zTe
61c0: 78 74 32 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  xt2;.  unsigned 
61d0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78  char const *zTex
61e0: 74 33 3b 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73  t3;..  nText = s
61f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6200: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  es(argv[0]);.  z
6210: 54 65 78 74 31 20 3d 20 73 71 6c 69 74 65 33 5f  Text1 = sqlite3_
6220: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6230: 30 5d 29 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20  0]);.  zText2 = 
6240: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6250: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a  xt(argv[0]);.  z
6260: 54 65 78 74 33 20 3d 20 73 71 6c 69 74 65 33 5f  Text3 = sqlite3_
6270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
6280: 30 5d 29 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78  0]);..  if( zTex
6290: 74 31 21 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54  t1!=zText2 || zT
62a0: 65 78 74 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a  ext2!=zText3 ){.
62b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
62c0: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
62d0: 2c 20 22 74 6b 74 32 32 31 33 20 69 73 20 6e 6f  , "tkt2213 is no
62e0: 74 20 66 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20  t fixed", -1);. 
62f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61 72   }else{.    char
6300: 20 2a 7a 43 6f 70 79 20 3d 20 28 63 68 61 72 20   *zCopy = (char 
6310: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
6320: 28 6e 54 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d  (nText);.    mem
6330: 63 70 79 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74  cpy(zCopy, zText
6340: 31 2c 20 6e 54 65 78 74 29 3b 0a 20 20 20 20 73  1, nText);.    s
6350: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
6360: 78 74 28 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70  xt(context, zCop
6370: 79 2c 20 6e 54 65 78 74 2c 20 73 71 6c 69 74 65  y, nText, sqlite
6380: 33 5f 66 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a  3_free);.  }.}..
6390: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
63a0: 69 6e 67 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  ing SQL function
63b0: 20 74 61 6b 65 73 20 34 20 61 72 67 75 6d 65 6e   takes 4 argumen
63c0: 74 73 2e 20 20 54 68 65 20 32 6e 64 20 61 6e 64  ts.  The 2nd and
63d0: 0a 2a 2a 20 34 74 68 20 61 72 67 75 6d 65 6e 74  .** 4th argument
63e0: 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 20   must be one of 
63f0: 74 68 65 73 65 20 73 74 72 69 6e 67 73 3a 20 20  these strings:  
6400: 27 74 65 78 74 27 2c 20 27 74 65 78 74 31 36 27  'text', 'text16'
6410: 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63  ,.** or 'blob' c
6420: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
6430: 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  API functions.**
6440: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
6450: 5f 76 61 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a  _value_text().**
6460: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
6470: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20  lue_text16().** 
6480: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c       sqlite3_val
6490: 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20  ue_blob().**.** 
64a0: 54 68 65 20 74 68 69 72 64 20 61 72 67 75 6d 65  The third argume
64b0: 6e 74 20 69 73 20 61 20 73 74 72 69 6e 67 2c 20  nt is a string, 
64c0: 65 69 74 68 65 72 20 27 62 79 74 65 73 27 20 6f  either 'bytes' o
64d0: 72 20 27 62 79 74 65 73 31 36 27 20 6f 72 20 27  r 'bytes16' or '
64e0: 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73  noop',.** corres
64f0: 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49 73 3a  ponding to APIs:
6500: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69  .**.**      sqli
6510: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
6520: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6530: 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 31 36 28  3_value_bytes16(
6540: 29 0a 2a 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a  ).**      noop.*
6550: 2a 0a 2a 2a 20 54 68 65 20 41 50 49 73 20 64 65  *.** The APIs de
6560: 73 69 67 6e 61 74 65 64 20 62 79 20 74 68 65 20  signated by the 
6570: 32 6e 64 20 74 68 72 6f 75 67 68 20 34 74 68 20  2nd through 4th 
6580: 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 61 70  arguments are ap
6590: 70 6c 69 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  plied.** to the 
65a0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
65b0: 6e 20 6f 72 64 65 72 2e 20 20 49 66 20 74 68 65  n order.  If the
65c0: 20 70 6f 69 6e 74 65 72 73 20 72 65 74 75 72 6e   pointers return
65d0: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 73 65 63  ed by the.** sec
65e0: 6f 6e 64 20 61 6e 64 20 66 6f 75 72 74 68 20 61  ond and fourth a
65f0: 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68  re different, th
6600: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
6610: 6e 73 20 31 2e 20 20 4f 74 68 65 72 77 69 73 65  ns 1.  Otherwise
6620: 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  ,.** this routin
6630: 65 20 72 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a  e returns 0..**.
6640: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
6650: 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
6660: 20 74 6f 20 73 65 65 20 77 68 65 6e 20 72 65 74   to see when ret
6670: 75 72 6e 65 64 20 70 6f 69 6e 74 65 72 73 20 66  urned pointers f
6680: 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74  rom.** the _text
6690: 28 29 2c 20 5f 74 65 78 74 31 36 28 29 20 61 6e  (), _text16() an
66a0: 64 20 5f 62 6c 6f 62 28 29 20 41 50 49 73 20 62  d _blob() APIs b
66b0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 61 74 65  ecome invalidate
66c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
66d0: 64 20 70 74 72 43 68 6e 67 46 75 6e 63 74 69 6f  d ptrChngFunctio
66e0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  n(.  sqlite3_con
66f0: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a  text *context, .
6700: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20    int argc,  .  
6710: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
6720: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
6730: 76 6f 69 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20  void *p1, *p2;. 
6740: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
6750: 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34  d;.  if( argc!=4
6760: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d   ) return;.  zCm
6770: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6780: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6790: 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20  ext(argv[1]);.  
67a0: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
67b0: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
67c0: 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d  mp(zCmd,"text")=
67d0: 3d 30 20 29 7b 0a 20 20 20 20 70 31 20 3d 20 28  =0 ){.    p1 = (
67e0: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69  const void*)sqli
67f0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
6800: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6810: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
6820: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
6830: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78  trcmp(zCmd, "tex
6840: 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t16")==0 ){.    
6850: 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p1 = (const void
6860: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6870: 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b  text16(argv[0]);
6880: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6890: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
68a0: 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20   "blob")==0 ){. 
68b0: 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20 76     p1 = (const v
68c0: 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  oid*)sqlite3_val
68d0: 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29  ue_blob(argv[0])
68e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
68f0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d  eturn;.  }.  zCm
6900: 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  d = (const char*
6910: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6920: 65 78 74 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20  ext(argv[2]);.  
6930: 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65  if( zCmd==0 ) re
6940: 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63  turn;.  if( strc
6950: 6d 70 28 7a 43 6d 64 2c 22 62 79 74 65 73 22 29  mp(zCmd,"bytes")
6960: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
6970: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
6980: 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66  rgv[0]);.#ifndef
6990: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
69a0: 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  16.  }else if( s
69b0: 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74  trcmp(zCmd, "byt
69c0: 65 73 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20  es16")==0 ){.   
69d0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
69e0: 79 74 65 73 31 36 28 61 72 67 76 5b 30 5d 29 3b  ytes16(argv[0]);
69f0: 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20  .#endif.  }else 
6a00: 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c  if( strcmp(zCmd,
6a10: 20 22 6e 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20   "noop")==0 ){. 
6a20: 20 20 20 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67     /* do nothing
6a30: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
6a40: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a   return;.  }.  z
6a50: 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Cmd = (const cha
6a60: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
6a70: 5f 74 65 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a  _text(argv[3]);.
6a80: 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20    if( zCmd==0 ) 
6a90: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 73 74  return;.  if( st
6aa0: 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78 74 22  rcmp(zCmd,"text"
6ab0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 32 20 3d  )==0 ){.    p2 =
6ac0: 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71   (const void*)sq
6ad0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6ae0: 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64  (argv[0]);.#ifnd
6af0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
6b00: 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69 66 28  TF16.  }else if(
6b10: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74   strcmp(zCmd, "t
6b20: 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20  ext16")==0 ){.  
6b30: 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p2 = (const vo
6b40: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
6b50: 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d  e_text16(argv[0]
6b60: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
6b70: 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d  e if( strcmp(zCm
6b80: 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b  d, "blob")==0 ){
6b90: 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73 74  .    p2 = (const
6ba0: 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76   void*)sqlite3_v
6bb0: 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30  alue_blob(argv[0
6bc0: 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ]);.  }else{.   
6bd0: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73   return;.  }.  s
6be0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6bf0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70  t(context, p1!=p
6c00: 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  2);.}../*.** Thi
6c10: 73 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 72  s SQL function r
6c20: 65 74 75 72 6e 73 20 61 20 64 69 66 66 65 72 65  eturns a differe
6c30: 6e 74 20 61 6e 73 77 65 72 20 65 61 63 68 20 74  nt answer each t
6c40: 69 6d 65 20 69 74 20 69 73 20 63 61 6c 6c 65 64  ime it is called
6c50: 2c 20 65 76 65 6e 20 69 66 0a 2a 2a 20 74 68 65  , even if.** the
6c60: 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 74   arguments are t
6c70: 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  he same..*/.stat
6c80: 69 63 20 76 6f 69 64 20 6e 6f 6e 64 65 74 65 72  ic void nondeter
6c90: 6d 69 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e  ministicFunction
6ca0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
6cb0: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
6cc0: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
6cd0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
6ce0: 72 67 76 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  rgv.){.  static 
6cf0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 73  int cnt = 0;.  s
6d00: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
6d10: 74 28 63 6f 6e 74 65 78 74 2c 20 63 6e 74 2b 2b  t(context, cnt++
6d20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
6d30: 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  e:  sqlite3_crea
6d40: 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 0a 2a  te_function DB.*
6d50: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71  *.** Call the sq
6d60: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6d70: 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20 74 68 65  ction API on the
6d80: 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65 20   given database 
6d90: 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 63  in order.** to c
6da0: 72 65 61 74 65 20 61 20 66 75 6e 63 74 69 6f 6e  reate a function
6db0: 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61 6c 65 73   named "x_coales
6dc0: 63 65 22 2e 20 20 54 68 69 73 20 66 75 6e 63 74  ce".  This funct
6dd0: 69 6f 6e 20 64 6f 65 73 20 74 68 65 20 73 61 6d  ion does the sam
6de0: 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73 20 74 68  e thing.** as th
6df0: 65 20 22 63 6f 61 6c 65 73 63 65 22 20 66 75 6e  e "coalesce" fun
6e00: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75 6e  ction.  This fun
6e10: 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65 67 69 73  ction also regis
6e20: 74 65 72 73 20 61 6e 20 53 51 4c 20 66 75 6e 63  ters an SQL func
6e30: 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64 20 22 78  tion.** named "x
6e40: 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 20 74 68  _sqlite_exec" th
6e50: 61 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69 74  at invokes sqlit
6e60: 65 33 5f 65 78 65 63 28 29 2e 20 20 49 6e 76 6f  e3_exec().  Invo
6e70: 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f 65 78 65  king sqlite3_exe
6e80: 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69 73 20 77  c().** in this w
6e90: 61 79 20 69 73 20 69 6c 6c 65 67 61 6c 20 72 65  ay is illegal re
6ea0: 63 75 72 73 69 6f 6e 20 61 6e 64 20 73 68 6f 75  cursion and shou
6eb0: 6c 64 20 72 61 69 73 65 20 61 6e 20 53 51 4c 49  ld raise an SQLI
6ec0: 54 45 5f 4d 49 53 55 53 45 20 65 72 72 6f 72 2e  TE_MISUSE error.
6ed0: 0a 2a 2a 20 54 68 65 20 65 66 66 65 63 74 20 69  .** The effect i
6ee0: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 74 72 79  s similar to try
6ef0: 69 6e 67 20 74 6f 20 75 73 65 20 74 68 65 20 73  ing to use the s
6f00: 61 6d 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ame database con
6f10: 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a 2a 2a 20  nection from.** 
6f20: 74 77 6f 20 74 68 72 65 61 64 73 20 61 74 20 74  two threads at t
6f30: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a  he same time..**
6f40: 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  .** The original
6f50: 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f 72 20   motivation for 
6f60: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 73  this routine was
6f70: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 63   to be able to c
6f80: 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  all the.** sqlit
6f90: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
6fa0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  on function whil
6fb0: 65 20 61 20 71 75 65 72 79 20 69 73 20 69 6e 20  e a query is in 
6fc0: 70 72 6f 67 72 65 73 73 20 69 6e 20 6f 72 64 65  progress in orde
6fd0: 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  r.** to test the
6fe0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 64   SQLITE_MISUSE d
6ff0: 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69 63 2e 0a  etection logic..
7000: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
7010: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
7020: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7030: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
7040: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
7050: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
7060: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
7070: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
7080: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
7090: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
70a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
70b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
70c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
70e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
70f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
7100: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
7110: 64 62 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21  db;..  if( argc!
7120: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
7130: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
7140: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
7150: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
7160: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
7170: 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20   " DB\"", 0);.  
7180: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7190: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
71a0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
71b0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
71c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
71d0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
71e0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
71f0: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 61 6c 65  ion(db, "x_coale
7200: 73 63 65 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  sce", -1, SQLITE
7210: 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20 20  _UTF8, 0, .     
7220: 20 20 20 74 31 5f 69 66 6e 75 6c 6c 46 75 6e 63     t1_ifnullFunc
7230: 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
7240: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
7250: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7260: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7270: 28 64 62 2c 20 22 68 65 78 38 22 2c 20 31 2c 20  (db, "hex8", 1, 
7280: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 20 53 51  SQLITE_UTF8 | SQ
7290: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
72a0: 49 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c  IC,.          0,
72b0: 20 68 65 78 38 46 75 6e 63 2c 20 30 2c 20 30 29   hex8Func, 0, 0)
72c0: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
72d0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
72e0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
72f0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7300: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7310: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78  unction(db, "hex
7320: 31 36 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  16", 1, SQLITE_U
7330: 54 46 31 36 20 7c 20 53 51 4c 49 54 45 5f 44 45  TF16 | SQLITE_DE
7340: 54 45 52 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20  TERMINISTIC,.   
7350: 20 20 20 20 20 20 20 30 2c 20 68 65 78 31 36 46         0, hex16F
7360: 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  unc, 0, 0);.  }.
7370: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 3d  #endif.  if( rc=
7380: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
7390: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
73a0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
73b0: 62 2c 20 22 74 6b 74 32 32 31 33 66 75 6e 63 22  b, "tkt2213func"
73c0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
73d0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 74   0, .          t
73e0: 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e 2c 20  kt2213Function, 
73f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7400: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7410: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7420: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7430: 6f 6e 28 64 62 2c 20 22 70 6f 69 6e 74 65 72 5f  on(db, "pointer_
7440: 63 68 61 6e 67 65 22 2c 20 34 2c 20 53 51 4c 49  change", 4, SQLI
7450: 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20  TE_ANY, 0, .    
7460: 20 20 20 20 20 20 70 74 72 43 68 6e 67 46 75 6e        ptrChngFun
7470: 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20  ction, 0, 0);.  
7480: 7d 0a 0a 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e  }..  /* Function
7490: 73 20 63 6f 75 6e 74 65 72 31 28 29 20 61 6e 64  s counter1() and
74a0: 20 63 6f 75 6e 74 65 72 32 28 29 20 68 61 76 65   counter2() have
74b0: 20 74 68 65 20 73 61 6d 65 20 69 6d 70 6c 65 6d   the same implem
74c0: 65 6e 74 61 74 69 6f 6e 20 2d 20 74 68 65 79 0a  entation - they.
74d0: 20 20 2a 2a 20 62 6f 74 68 20 72 65 74 75 72 6e    ** both return
74e0: 20 61 6e 20 61 73 63 65 6e 64 69 6e 67 20 69 6e   an ascending in
74f0: 74 65 67 65 72 20 77 69 74 68 20 65 61 63 68 20  teger with each 
7500: 63 61 6c 6c 2e 20 20 42 75 74 20 63 6f 75 6e 74  call.  But count
7510: 65 72 31 28 29 20 69 73 20 6d 61 72 6b 65 64 0a  er1() is marked.
7520: 20 20 2a 2a 20 61 73 20 6e 6f 6e 2d 64 65 74 65    ** as non-dete
7530: 72 6d 69 6e 69 73 74 69 63 20 61 6e 64 20 63 6f  rministic and co
7540: 75 6e 74 65 72 32 28 29 20 69 73 20 6d 61 72 6b  unter2() is mark
7550: 65 64 20 61 73 20 64 65 74 65 72 6d 69 6e 69 73  ed as determinis
7560: 74 69 63 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tic..  */.  if( 
7570: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7580: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
7590: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
75a0: 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 31 22  n(db, "counter1"
75b0: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
75c0: 38 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  8,.          0, 
75d0: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
75e0: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
75f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
7600: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
7610: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
7620: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
7630: 20 22 63 6f 75 6e 74 65 72 32 22 2c 20 2d 31 2c   "counter2", -1,
7640: 20 53 51 4c 49 54 45 5f 55 54 46 38 7c 53 51 4c   SQLITE_UTF8|SQL
7650: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7660: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7670: 6e 6f 6e 64 65 74 65 72 6d 69 6e 69 73 74 69 63  nondeterministic
7680: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 29 3b  Function, 0, 0);
7690: 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
76a0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
76b0: 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73 71 6c    /* Use the sql
76c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
76d0: 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68 65 72  tion16() API her
76e0: 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20 66 75  e. Mainly for fu
76f0: 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20 20 2a  n, but also .  *
7700: 2a 20 62 65 63 61 75 73 65 20 69 74 20 69 73 20  * because it is 
7710: 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79 77 68  not tested anywh
7720: 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20 20 69  ere else. */.  i
7730: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7740: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f   ){.    const vo
7750: 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20  id *zUtf16;.    
7760: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
7770: 56 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Val;.    sqlite3
7780: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
7790: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61  >mutex);.    pVa
77a0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
77b0: 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  New(db);.    sql
77c0: 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28  ite3ValueSetStr(
77d0: 70 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73 71 6c  pVal, -1, "x_sql
77e0: 69 74 65 5f 65 78 65 63 22 2c 20 53 51 4c 49 54  ite_exec", SQLIT
77f0: 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53  E_UTF8, SQLITE_S
7800: 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66  TATIC);.    zUtf
7810: 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  16 = sqlite3Valu
7820: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
7830: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
7840: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
7850: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
7860: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
7870: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
7880: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
7890: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
78a0: 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36  ion16(db, zUtf16
78b0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
78c0: 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46     1, SQLITE_UTF
78d0: 31 36 2c 20 64 62 2c 20 73 71 6c 69 74 65 33 45  16, db, sqlite3E
78e0: 78 65 63 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a  xecFunc, 0, 0);.
78f0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
7900: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
7910: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
7920: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7930: 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
7940: 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ..  if( sqlite3T
7950: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
7960: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
7970: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
7980: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
7990: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
79a0: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
79b0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
79c0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
79d0: 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c 65 6d  utines to implem
79e0: 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e 74 28  ent the x_count(
79f0: 29 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  ) aggregate func
7a00: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f 63 6f  tion..**.** x_co
7a10: 75 6e 74 28 29 20 63 6f 75 6e 74 73 20 74 68 65  unt() counts the
7a20: 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e 2d 6e   number of non-n
7a30: 75 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e 20 20  ull arguments.  
7a40: 42 75 74 20 74 68 65 72 65 20 61 72 65 0a 2a 2a  But there are.**
7a50: 20 73 6f 6d 65 20 74 77 69 73 74 73 20 66 6f 72   some twists for
7a60: 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
7a70: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
7a80: 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f 63 6f  argument to x_co
7a90: 75 6e 74 28 29 20 69 73 20 34 30 20 74 68 65 6e  unt() is 40 then
7aa0: 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69   a UTF-8 error i
7ab0: 73 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20 6f 6e  s reported.** on
7ac0: 20 74 68 65 20 73 74 65 70 20 66 75 6e 63 74 69   the step functi
7ad0: 6f 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e 74 28  on.  If x_count(
7ae0: 34 31 29 20 69 73 20 73 65 65 6e 2c 20 74 68 65  41) is seen, the
7af0: 6e 20 61 20 55 54 46 2d 31 36 20 65 72 72 6f 72  n a UTF-16 error
7b00: 0a 2a 2a 20 69 73 20 72 65 70 6f 72 74 65 64 20  .** is reported 
7b10: 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  on the step func
7b20: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 74 6f  tion.  If the to
7b30: 74 61 6c 20 63 6f 75 6e 74 20 69 73 20 34 32 2c  tal count is 42,
7b40: 20 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46 2d 38   then.** a UTF-8
7b50: 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74   error is report
7b60: 65 64 20 6f 6e 20 74 68 65 20 66 69 6e 61 6c 69  ed on the finali
7b70: 7a 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  ze function..*/.
7b80: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 74  typedef struct t
7b90: 31 43 6f 75 6e 74 43 74 78 20 74 31 43 6f 75 6e  1CountCtx t1Coun
7ba0: 74 43 74 78 3b 0a 73 74 72 75 63 74 20 74 31 43  tCtx;.struct t1C
7bb0: 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e 74 20  ountCtx {.  int 
7bc0: 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69  n;.};.static voi
7bd0: 64 20 74 31 43 6f 75 6e 74 53 74 65 70 28 0a 20  d t1CountStep(. 
7be0: 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
7bf0: 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74   *context,.  int
7c00: 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33   argc,.  sqlite3
7c10: 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
7c20: 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20 2a 70  .  t1CountCtx *p
7c30: 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  p = sqlite3_
7c40: 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74 65 78  aggregate_contex
7c50: 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a 65 6f  t(context, sizeo
7c60: 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20 28 61  f(*p));.  if( (a
7c70: 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45  rgc==0 || SQLITE
7c80: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
7c90: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30  alue_type(argv[0
7ca0: 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20 20 20  ]) ) && p ){.   
7cb0: 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69   p->n++;.  }.  i
7cc0: 66 28 20 61 72 67 63 3e 30 20 29 7b 0a 20 20 20  f( argc>0 ){.   
7cd0: 20 69 6e 74 20 76 20 3d 20 73 71 6c 69 74 65 33   int v = sqlite3
7ce0: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
7cf0: 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 76 3d 3d  0]);.    if( v==
7d00: 34 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  40 ){.      sqli
7d10: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
7d20: 28 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c 75 65  (context, "value
7d30: 20 6f 66 20 34 30 20 68 61 6e 64 65 64 20 74 6f   of 40 handed to
7d40: 20 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29 3b 0a   x_count", -1);.
7d50: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d60: 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 7d 65  MIT_UTF16.    }e
7d70: 6c 73 65 20 69 66 28 20 76 3d 3d 34 31 20 29 7b  lse if( v==41 ){
7d80: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
7d90: 72 20 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 5d  r zUtf16ErrMsg[]
7da0: 20 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20 30 2c   = { 0, 0x61, 0,
7db0: 20 30 78 36 32 2c 20 30 2c 20 30 78 36 33 2c 20   0x62, 0, 0x63, 
7dc0: 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20 20 20  0, 0, 0};.      
7dd0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7de0: 72 72 6f 72 31 36 28 63 6f 6e 74 65 78 74 2c 20  rror16(context, 
7df0: 26 7a 55 74 66 31 36 45 72 72 4d 73 67 5b 31 2d  &zUtf16ErrMsg[1-
7e00: 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e  SQLITE_BIGENDIAN
7e10: 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66 0a 20  ], -1);.#endif. 
7e20: 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a 73 74     }.  }.}   .st
7e30: 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e  atic void t1Coun
7e40: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7e50: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7e60: 78 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74  xt){.  t1CountCt
7e70: 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69  x *p;.  p = sqli
7e80: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7e90: 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73  ntext(context, s
7ea0: 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66  izeof(*p));.  if
7eb0: 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ( p ){.    if( p
7ec0: 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20 20 20  ->n==42 ){.     
7ed0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
7ee0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
7ef0: 78 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73 20 74  x_count totals t
7f00: 6f 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20 20 20  o 42", -1);.    
7f10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
7f20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28  ite3_result_int(
7f30: 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70 2d 3e  context, p ? p->
7f40: 6e 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  n : 0);.    }.  
7f50: 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  }.}..#ifndef SQL
7f60: 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
7f70: 54 45 44 0a 73 74 61 74 69 63 20 76 6f 69 64 20  TED.static void 
7f80: 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 28  legacyCountStep(
7f90: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7fa0: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7fb0: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
7fc0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
7fd0: 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f  ){.  /* no-op */
7fe0: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
7ff0: 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c  legacyCountFinal
8000: 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ize(sqlite3_cont
8010: 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b 0a 20  ext *context){. 
8020: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8030: 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  int(context, sql
8040: 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63  ite3_aggregate_c
8050: 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 29 3b 0a  ount(context));.
8060: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
8070: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
8080: 63 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65  create_aggregate
8090: 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74   DB.**.** Call t
80a0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
80b0: 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f  e_function API o
80c0: 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61  n the given data
80d0: 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a  base in order.**
80e0: 20 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e   to create a fun
80f0: 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63  ction named "x_c
8100: 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66 75 6e  ount".  This fun
8110: 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c 61 72  ction is similar
8120: 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 69 6c 74  .** to the built
8130: 2d 69 6e 20 63 6f 75 6e 74 28 29 20 66 75 6e 63  -in count() func
8140: 74 69 6f 6e 2c 20 77 69 74 68 20 61 20 66 65 77  tion, with a few
8150: 20 73 70 65 63 69 61 6c 20 71 75 69 72 6b 73 0a   special quirks.
8160: 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67 20 74  ** for testing t
8170: 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  he sqlite3_resul
8180: 74 5f 65 72 72 6f 72 28 29 20 41 50 49 73 2e 0a  t_error() APIs..
8190: 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69 6e  **.** The origin
81a0: 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66 6f  al motivation fo
81b0: 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  r this routine w
81c0: 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  as to be able to
81d0: 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71 6c   call the.** sql
81e0: 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67 72  ite3_create_aggr
81f0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 77  egate function w
8200: 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20  hile a query is 
8210: 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f  in progress in o
8220: 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20  rder.** to test 
8230: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
8240: 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69  E detection logi
8250: 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65 2e 74  c.  See misuse.t
8260: 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  est..**.** This 
8270: 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61 74 65  routine was late
8280: 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20 74 65  r extended to te
8290: 73 74 20 74 68 65 20 75 73 65 20 6f 66 20 73 71  st the use of sq
82a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
82b0: 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e 20 61  or().** within a
82c0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
82d0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65 72 3a  ns..**.** Later:
82e0: 20 49 74 20 69 73 20 6e 6f 77 20 61 6c 73 6f 20   It is now also 
82f0: 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65 67 69  extended to regi
8300: 73 74 65 72 20 74 68 65 20 61 67 67 72 65 67 61  ster the aggrega
8310: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22  te function.** "
8320: 6c 65 67 61 63 79 5f 63 6f 75 6e 74 28 29 22 20  legacy_count()" 
8330: 77 69 74 68 20 74 68 65 20 73 75 70 70 6c 69 65  with the supplie
8340: 64 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  d database handl
8350: 65 2e 20 54 68 69 73 20 69 73 20 75 73 65 64 0a  e. This is used.
8360: 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65 20 64  ** to test the d
8370: 65 70 72 65 63 61 74 65 64 20 73 71 6c 69 74 65  eprecated sqlite
8380: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 75 6e  3_aggregate_coun
8390: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
83a0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
83b0: 4c 41 50 49 20 74 65 73 74 5f 63 72 65 61 74 65  LAPI test_create
83c0: 5f 61 67 67 72 65 67 61 74 65 28 0a 20 20 76 6f  _aggregate(.  vo
83d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
83e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
83f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8490: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
84a0: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
84b0: 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20  if( argc!=2 ){. 
84c0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
84d0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
84e0: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
84f0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8500: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45  ],.       " FILE
8510: 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  NAME\"", 0);.   
8520: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8530: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
8540: 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
8550: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
8560: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
8570: 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
8580: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
8590: 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74 22  on(db, "x_count"
85a0: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 0, SQLITE_UTF8
85b0: 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 74 31  , 0, 0,.      t1
85c0: 43 6f 75 6e 74 53 74 65 70 2c 74 31 43 6f 75 6e  CountStep,t1Coun
85d0: 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20 20 69 66  tFinalize);.  if
85e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
85f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
8600: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
8610: 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f 75 6e 74  ion(db, "x_count
8620: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
8630: 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20  8, 0, 0,.       
8640: 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31 43   t1CountStep,t1C
8650: 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a 20  ountFinalize);. 
8660: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
8670: 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
8680: 44 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  D.  if( rc==SQLI
8690: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
86a0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
86b0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 6c  _function(db, "l
86c0: 65 67 61 63 79 5f 63 6f 75 6e 74 22 2c 20 30 2c  egacy_count", 0,
86d0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
86e0: 30 2c 0a 20 20 20 20 20 20 20 20 6c 65 67 61 63  0,.        legac
86f0: 79 43 6f 75 6e 74 53 74 65 70 2c 20 6c 65 67 61  yCountStep, lega
8700: 63 79 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 0a  cyCountFinalize.
8710: 20 20 20 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69      );.  }.#endi
8720: 66 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  f.  if( sqlite3T
8730: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
8740: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
8750: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
8760: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
8770: 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
8780: 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
8790: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
87a0: 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55  _OK;.}.../*.** U
87b0: 73 61 67 65 3a 20 20 70 72 69 6e 74 66 20 54 45  sage:  printf TE
87c0: 58 54 0a 2a 2a 0a 2a 2a 20 53 65 6e 64 20 6f 75  XT.**.** Send ou
87d0: 74 70 75 74 20 74 6f 20 70 72 69 6e 74 66 2e 20  tput to printf. 
87e0: 20 55 73 65 20 74 68 69 73 20 72 61 74 68 65 72   Use this rather
87f0: 20 74 68 61 6e 20 70 75 74 73 20 74 6f 20 6d 65   than puts to me
8800: 72 67 65 20 74 68 65 20 6f 75 74 70 75 74 0a 2a  rge the output.*
8810: 2a 20 69 6e 20 74 68 65 20 63 6f 72 72 65 63 74  * in the correct
8820: 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 64   sequence with d
8830: 65 62 75 67 67 69 6e 67 20 70 72 69 6e 74 66 73  ebugging printfs
8840: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 43   inserted into C
8850: 20 63 6f 64 65 2e 0a 2a 2a 20 50 75 74 73 20 75   code..** Puts u
8860: 73 65 73 20 61 20 73 65 70 61 72 61 74 65 20 62  ses a separate b
8870: 75 66 66 65 72 20 61 6e 64 20 64 65 62 75 67 67  uffer and debugg
8880: 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 77  ing statements w
8890: 69 6c 6c 20 62 65 20 6f 75 74 20 6f 66 0a 2a 2a  ill be out of.**
88a0: 20 73 65 71 75 65 6e 63 65 20 69 66 20 69 74 20   sequence if it 
88b0: 69 73 20 75 73 65 64 2e 0a 2a 2f 0a 73 74 61 74  is used..*/.stat
88c0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
88d0: 4c 41 50 49 20 74 65 73 74 5f 70 72 69 6e 74 66  LAPI test_printf
88e0: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
88f0: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
8900: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
8910: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
8920: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
8930: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
8940: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
8950: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
8960: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8970: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
8980: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8990: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
89a0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ment */.){.  if(
89b0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
89c0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
89d0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
89e0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
89f0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
8a00: 20 20 20 20 20 20 20 22 20 54 45 58 54 5c 22 22         " TEXT\""
8a10: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
8a20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
8a30: 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e 22 2c    printf("%s\n",
8a40: 20 61 72 67 76 5b 31 5d 29 3b 0a 20 20 72 65 74   argv[1]);.  ret
8a50: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a  urn TCL_OK;.}...
8a60: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
8a70: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8a80: 6e 74 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  nt FORMAT INTEGE
8a90: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8aa0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8ab0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8ac0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
8ad0: 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  s.*/.static int 
8ae0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
8af0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8b00: 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  t(.  void *NotUs
8b10: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8b20: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8b30: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8b40: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8b50: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8b60: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8b80: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8b90: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8ba0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8bb0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8bc0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8bd0: 74 20 61 5b 33 5d 2c 20 69 3b 0a 20 20 63 68 61  t a[3], i;.  cha
8be0: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63  r *z;.  if( argc
8bf0: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=5 ){.    Tcl_A
8c00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
8c10: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
8c20: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
8c30: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8c40: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
8c50: 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b 0a 20  NT INT\"", 0);. 
8c60: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
8c70: 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ROR;.  }.  for(i
8c80: 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20  =2; i<5; i++){. 
8c90: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e     if( Tcl_GetIn
8ca0: 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69  t(interp, argv[i
8cb0: 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20 72 65  ], &a[i-2]) ) re
8cc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
8cd0: 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65    }.  z = sqlite
8ce0: 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31  3_mprintf(argv[1
8cf0: 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61  ], a[0], a[1], a
8d00: 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  [2]);.  Tcl_Appe
8d10: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8d20: 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65   z, 0);.  sqlite
8d30: 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74  3_free(z);.  ret
8d40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
8d50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
8d60: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74  ite3_mprintf_int
8d70: 36 34 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  64 FORMAT INTEGE
8d80: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8d90: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8da0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8db0: 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61  64-bit integer a
8dc0: 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74  rguments.*/.stat
8dd0: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
8de0: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
8df0: 69 6e 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f  intf_int64(.  vo
8e00: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
8e10: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
8e20: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8e30: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8e40: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8e50: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8e60: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8e70: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8e80: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8e90: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8ea0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8eb0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8ec0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
8ed0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33  sqlite_int64 a[3
8ee0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
8ef0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8f00: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8f10: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8f20: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8f30: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
8f40: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
8f50: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
8f60: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
8f70: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
8f80: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
8f90: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
8fa0: 71 6c 69 74 65 33 41 74 6f 69 36 34 28 61 72 67  qlite3Atoi64(arg
8fb0: 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 73  v[i], &a[i-2], s
8fc0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 61  qlite3Strlen30(a
8fd0: 72 67 76 5b 69 5d 29 2c 20 53 51 4c 49 54 45 5f  rgv[i]), SQLITE_
8fe0: 55 54 46 38 29 20 29 7b 0a 20 20 20 20 20 20 54  UTF8) ){.      T
8ff0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9000: 69 6e 74 65 72 70 2c 20 22 61 72 67 75 6d 65 6e  interp, "argumen
9010: 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
9020: 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 22   64-bit integer"
9030: 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
9040: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
9050: 20 20 7d 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71    }.  }.  z = sq
9060: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9070: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9080: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9090: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
90a0: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
90b0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
90c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
90d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
90e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
90f0: 5f 6c 6f 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54  _long FORMAT INT
9100: 45 47 45 52 20 49 4e 54 45 47 45 52 20 49 4e 54  EGER INTEGER INT
9110: 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  EGER.**.** Call 
9120: 6d 70 72 69 6e 74 66 20 77 69 74 68 20 74 68 72  mprintf with thr
9130: 65 65 20 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20  ee long integer 
9140: 61 72 67 75 6d 65 6e 74 73 2e 20 20 20 54 68 69  arguments.   Thi
9150: 73 20 6d 69 67 68 74 20 62 65 20 74 68 65 0a 2a  s might be the.*
9160: 2a 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  * same as sqlite
9170: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72  3_mprintf_int or
9180: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
9190: 5f 69 6e 74 36 34 2c 20 64 65 70 65 6e 64 69 6e  _int64, dependin
91a0: 67 20 6f 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d  g on.** platform
91b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
91c0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
91d0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
91e0: 6e 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ng(.  void *NotU
91f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
9200: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
9210: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
9220: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
9230: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
9240: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
9250: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
9260: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
9270: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
9280: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
9290: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
92a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69  gument */.){.  i
92b0: 6e 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74  nt i;.  long int
92c0: 20 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33   a[3];.  int b[3
92d0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
92e0: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
92f0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9300: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9310: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9320: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9330: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
9340: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
9350: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
9360: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9370: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
9380: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
9390: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
93a0: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d  , argv[i], &b[i-
93b0: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
93c0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d  _ERROR;.    a[i-
93d0: 32 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62  2] = (long int)b
93e0: 5b 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32  [i-2];.    a[i-2
93f0: 5d 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c  ] &= (((u64)1)<<
9400: 28 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29  (sizeof(int)*8))
9410: 2d 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71  -1;.  }.  z = sq
9420: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9430: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9440: 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f  ], a[2]);.  Tcl_
9450: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9460: 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71  erp, z, 0);.  sq
9470: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
9480: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
9490: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
94a0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
94b0: 5f 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45  _str FORMAT INTE
94c0: 47 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49  GER INTEGER STRI
94d0: 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  NG.**.** Call mp
94e0: 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69  rintf with two i
94f0: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
9500: 20 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20   and one string 
9510: 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  argument.*/.stat
9520: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
9530: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
9540: 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64  intf_str(.  void
9550: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
9560: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9570: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
9580: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
9590: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
95a0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
95b0: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
95c0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
95d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
95e0: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
95f0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
9600: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
9610: 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69  ){.  int a[3], i
9620: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
9630: 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72 67  f( argc<4 || arg
9640: 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  c>5 ){.    Tcl_A
9650: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9660: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
9670: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
9680: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
9690: 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20 49    " FORMAT INT I
96a0: 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20  NT ?STRING?\"", 
96b0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
96c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
96d0: 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b  for(i=2; i<4; i+
96e0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  +){.    if( Tcl_
96f0: 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
9700: 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29  rgv[i], &a[i-2])
9710: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
9720: 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73  ROR;.  }.  z = s
9730: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
9740: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
9750: 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72 67  1], argc>4 ? arg
9760: 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20  v[4] : NULL);.  
9770: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9780: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
9790: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
97a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
97b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
97c0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  ge:  sqlite3_snp
97d0: 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47 45  rintf_str INTEGE
97e0: 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  R FORMAT INTEGER
97f0: 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a   INTEGER STRING.
9800: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9810: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9820: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9830: 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67  d one string arg
9840: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9850: 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
9860: 49 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e  I sqlite3_snprin
9870: 74 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a  tf_str(.  void *
9880: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
9890: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
98a0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
98b0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
98c0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
98d0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
98e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
98f0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
9900: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
9910: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
9920: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
9930: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
9940: 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a  .  int a[3], i;.
9950: 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20    int n;.  char 
9960: 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 35  *z;.  if( argc<5
9970: 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20 20   || argc>6 ){.  
9980: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9990: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
99a0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
99b0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
99c0: 2c 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20 46  ,.       " INT F
99d0: 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53  ORMAT INT INT ?S
99e0: 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20  TRING?\"", 0);. 
99f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
9a00: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
9a10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9a20: 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29  , argv[1], &n) )
9a30: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9a40: 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a  R;.  if( n<0 ){.
9a50: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a60: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 20  sult(interp, "N 
9a70: 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61  must be non-nega
9a80: 74 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72  tive", 0);.    r
9a90: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9aa0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20  .  }.  for(i=3; 
9ab0: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
9ac0: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9ad0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ae0: 61 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72 6e  a[i-3]) ) return
9af0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9b00: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61    z = sqlite3_ma
9b10: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73  lloc( n+1 );.  s
9b20: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
9b30: 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61  n, z, argv[2], a
9b40: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e  [0], a[1], argc>
9b50: 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55  4 ? argv[5] : NU
9b60: 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  LL);.  Tcl_Appen
9b70: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9b80: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
9b90: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
9ba0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
9bb0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
9bc0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
9bd0: 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  le FORMAT INTEGE
9be0: 52 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45  R INTEGER DOUBLE
9bf0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
9c00: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
9c10: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
9c20: 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72  nd one double ar
9c30: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
9c40: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
9c50: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
9c60: 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  tf_double(.  voi
9c70: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9c80: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9c90: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9ca0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9cb0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9cc0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9cd0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9ce0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9cf0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9d00: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9d10: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
9d20: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
9d30: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
9d40: 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20  i;.  double r;. 
9d50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
9d60: 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54  argc!=5 ){.    T
9d70: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
9d80: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
9d90: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
9da0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
9db0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49        " FORMAT I
9dc0: 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22 22  NT INT DOUBLE\""
9dd0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9de0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9df0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
9e00: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9e10: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9e20: 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32   argv[i], &a[i-2
9e30: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9e40: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
9e50: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
9e60: 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c 20  nterp, argv[4], 
9e70: 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  &r) ) return TCL
9e80: 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71  _ERROR;.  z = sq
9e90: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
9ea0: 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31  gv[1], a[0], a[1
9eb0: 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70 70  ], r);.  Tcl_App
9ec0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
9ed0: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
9ee0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
9ef0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
9f00: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
9f10: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9f20: 61 6c 65 64 20 46 4f 52 4d 41 54 20 44 4f 55 42  aled FORMAT DOUB
9f30: 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a 20  LE DOUBLE.**.** 
9f40: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
9f50: 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c  h a single doubl
9f60: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
9f70: 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74 20   is the product 
9f80: 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72  of the.** two ar
9f90: 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62  guments given ab
9fa0: 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75 73  ove.  This is us
9fb0: 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f  ed to generate o
9fc0: 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65  verflow and unde
9fd0: 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73  rflow.** doubles
9fe0: 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68   to test that th
9ff0: 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64  ey are converted
a000: 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74   properly..*/.st
a010: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
a020: 54 43 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d  TCLAPI sqlite3_m
a030: 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 28 0a 20  printf_scaled(. 
a040: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
a050: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a060: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a070: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a080: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a090: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a0a0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
a0b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a0c0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a0d0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
a0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
a0f0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
a100: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
a110: 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32 5d 3b 0a  .  double r[2];.
a120: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
a130: 20 61 72 67 63 21 3d 34 20 29 7b 0a 20 20 20 20   argc!=4 ){.    
a140: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
a150: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
a160: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
a170: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
a180: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
a190: 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 5c 22 22  DOUBLE DOUBLE\""
a1a0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
a1b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
a1c0: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20    for(i=2; i<4; 
a1d0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
a1e0: 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69 6e 74 65  l_GetDouble(inte
a1f0: 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 72 5b  rp, argv[i], &r[
a200: 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54  i-2]) ) return T
a210: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a220: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a230: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 5b 30  ntf(argv[1], r[0
a240: 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63 6c 5f 41  ]*r[1]);.  Tcl_A
a250: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
a260: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
a270: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
a280: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
a290: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
a2a0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2b0: 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41 54 20 53  stronly FORMAT S
a2c0: 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  TRING.**.** Call
a2d0: 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20 61 20   mprintf with a 
a2e0: 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20 61 72  single double ar
a2f0: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
a300: 74 68 65 20 70 72 6f 64 75 63 74 20 6f 66 20 74  the product of t
a310: 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67 75 6d 65  he.** two argume
a320: 6e 74 73 20 67 69 76 65 6e 20 61 62 6f 76 65 2e  nts given above.
a330: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74    This is used t
a340: 6f 20 67 65 6e 65 72 61 74 65 20 6f 76 65 72 66  o generate overf
a350: 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72 66 6c 6f  low and underflo
a360: 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20 74 6f 20  w.** doubles to 
a370: 74 65 73 74 20 74 68 61 74 20 74 68 65 79 20 61  test that they a
a380: 72 65 20 63 6f 6e 76 65 72 74 65 64 20 70 72 6f  re converted pro
a390: 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  perly..*/.static
a3a0: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
a3b0: 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  PI sqlite3_mprin
a3c0: 74 66 5f 73 74 72 6f 6e 6c 79 28 0a 20 20 76 6f  tf_stronly(.  vo
a3d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
a3e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
a3f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
a400: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
a410: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
a420: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
a430: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
a440: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a450: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
a460: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
a470: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
a480: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
a490: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  /.){.  char *z;.
a4a0: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
a4b0: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
a4c0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
a4d0: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
a4e0: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
a4f0: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f  [0],.       " FO
a500: 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c 20  RMAT STRING\"", 
a510: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
a520: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
a530: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
a540: 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 72 67  ntf(argv[1], arg
a550: 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  v[2]);.  Tcl_App
a560: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a570: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
a580: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
a590: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
a5a0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
a5b0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
a5c0: 78 64 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 48  xdouble FORMAT H
a5d0: 45 58 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70  EX.**.** Call mp
a5e0: 72 69 6e 74 66 20 77 69 74 68 20 61 20 73 69 6e  rintf with a sin
a5f0: 67 6c 65 20 64 6f 75 62 6c 65 20 61 72 67 75 6d  gle double argum
a600: 65 6e 74 20 77 68 69 63 68 20 69 73 20 64 65 72  ent which is der
a610: 69 76 65 64 20 66 72 6f 6d 20 74 68 65 0a 2a 2a  ived from the.**
a620: 20 68 65 78 61 64 65 63 69 6d 61 6c 20 65 6e 63   hexadecimal enc
a630: 6f 64 69 6e 67 20 6f 66 20 61 6e 20 49 45 45 45  oding of an IEEE
a640: 20 64 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74   double..*/.stat
a650: 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
a660: 4c 41 50 49 20 73 71 6c 69 74 65 33 5f 6d 70 72  LAPI sqlite3_mpr
a670: 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 28 0a  intf_hexdouble(.
a680: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
a690: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
a6a0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
a6b0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
a6c0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
a6d0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
a6e0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
a6f0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a700: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
a710: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
a720: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
a730: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
a740: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  nt */.){.  char 
a750: 2a 7a 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a  *z;.  double r;.
a760: 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 78    unsigned int x
a770: 31 2c 20 78 32 3b 0a 20 20 73 71 6c 69 74 65 5f  1, x2;.  sqlite_
a780: 75 69 6e 74 36 34 20 64 3b 0a 20 20 69 66 28 20  uint64 d;.  if( 
a790: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
a7a0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a7b0: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
a7c0: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
a7d0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
a7e0: 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53        " FORMAT S
a7f0: 54 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20  TRING\"", 0);.  
a800: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
a810: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 73  OR;.  }.  if( ss
a820: 63 61 6e 66 28 61 72 67 76 5b 32 5d 2c 20 22 25  canf(argv[2], "%
a830: 30 38 78 25 30 38 78 22 2c 20 26 78 32 2c 20 26  08x%08x", &x2, &
a840: 78 31 29 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  x1)!=2 ){.    Tc
a850: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a860: 6e 74 65 72 70 2c 20 22 32 6e 64 20 61 72 67 75  nterp, "2nd argu
a870: 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 31  ment should be 1
a880: 36 2d 63 68 61 72 61 63 74 65 72 73 20 6f 66 20  6-characters of 
a890: 68 65 78 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  hex", 0);.    re
a8a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
a8b0: 20 20 7d 0a 20 20 64 20 3d 20 78 32 3b 0a 20 20    }.  d = x2;.  
a8c0: 64 20 3d 20 28 64 3c 3c 33 32 29 20 2b 20 78 31  d = (d<<32) + x1
a8d0: 3b 0a 20 20 6d 65 6d 63 70 79 28 26 72 2c 20 26  ;.  memcpy(&r, &
a8e0: 64 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20  d, sizeof(r));. 
a8f0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
a900: 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 72 29  intf(argv[1], r)
a910: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
a920: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
a930: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
a940: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
a950: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
a960: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
a970: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
a980: 63 68 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a  che ?BOOLEAN?.**
a990: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
a9a0: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41  (SQLITE_OMIT_SHA
a9b0: 52 45 44 5f 43 41 43 48 45 29 0a 73 74 61 74 69  RED_CACHE).stati
a9c0: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
a9d0: 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f  API test_enable_
a9e0: 73 68 61 72 65 64 28 0a 20 20 43 6c 69 65 6e 74  shared(.  Client
a9f0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
aa00: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
aa10: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
aa20: 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
aa30: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
aa40: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
aa50: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
aa60: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
aa70: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
aa80: 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
aa90: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
aaa0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
aab0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
aac0: 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
aad0: 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
aae0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
aaf0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20  t enable;.  int 
ab00: 72 65 74 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  ret = 0;..  if( 
ab10: 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21  objc!=2 && objc!
ab20: 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =1 ){.    Tcl_Wr
ab30: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ab40: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f  p, 1, objv, "?BO
ab50: 4f 4c 45 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65  OLEAN?");.    re
ab60: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
ab70: 20 20 7d 0a 20 20 72 65 74 20 3d 20 73 71 6c 69    }.  ret = sqli
ab80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
ab90: 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c  sharedCacheEnabl
aba0: 65 64 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d  ed;..  if( objc=
abb0: 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  =2 ){.    if( Tc
abc0: 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
abd0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
abe0: 5b 31 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b  [1], &enable) ){
abf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
ac00: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
ac10: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
ac20: 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63 61  enable_shared_ca
ac30: 63 68 65 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20  che(enable);.   
ac40: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
ac50: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  OK ){.      Tcl_
ac60: 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
ac70: 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
ac80: 33 45 72 72 53 74 72 28 72 63 29 2c 20 54 43 4c  3ErrStr(rc), TCL
ac90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
aca0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
acb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63  ;.    }.  }.  Tc
acc0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
acd0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f  nterp, Tcl_NewBo
ace0: 6f 6c 65 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a  oleanObj(ret));.
acf0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
ad00: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a  .}.#endif..../*.
ad10: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
ad20: 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
ad30: 74 5f 63 6f 64 65 73 20 20 20 44 42 20 20 20 20  t_codes   DB    
ad40: 42 4f 4f 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74  BOOLEAN.**.*/.st
ad50: 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
ad60: 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78 74 65  TCLAPI test_exte
ad70: 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
ad80: 73 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  s(.  ClientData 
ad90: 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
ada0: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
adb0: 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
adc0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
add0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
ade0: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
adf0: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
ae00: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
ae10: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
ae20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
ae30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
ae40: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
ae50: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
ae60: 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
ae70: 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
ae80: 6e 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c  nt enable;.  sql
ae90: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
aea0: 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
aeb0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
aec0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
aed0: 2c 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b  , "DB BOOLEAN");
aee0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
aef0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
af00: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
af10: 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
af20: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
af30: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
af40: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
af50: 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
af60: 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
af70: 32 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72  2], &enable) ) r
af80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
af90: 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  .  sqlite3_exten
afa0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
afb0: 28 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20  (db, enable);.  
afc0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
afd0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
afe0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
aff0: 6e 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73  n_number.**.*/.s
b000: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
b010: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6c 69 62  _TCLAPI test_lib
b020: 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a  version_number(.
b030: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
b040: 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
b050: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
b060: 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
b070: 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
b080: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
b090: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
b0a0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
b0b0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
b0c0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
b0d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b0e0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
b0f0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
b100: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
b110: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
b120: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
b130: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b140: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b150: 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76 65  bj(sqlite3_libve
b160: 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29  rsion_number()))
b170: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
b180: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
b190: 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  e: sqlite3_table
b1a0: 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
b1b0: 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61   DB dbname tblna
b1c0: 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f  me colname.**.*/
b1d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
b1e0: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74  TE_TCLAPI test_t
b1f0: 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
b200: 64 61 74 61 28 0a 20 20 43 6c 69 65 6e 74 44 61  data(.  ClientDa
b210: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
b220: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
b230: 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
b240: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
b250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
b260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
b270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
b280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
b290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
b2a0: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
b2b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
b2c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
b2d0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
b2e0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
b2f0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
b300: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
b310: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
b320: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
b330: 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  zTbl;.  const ch
b340: 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20 69 6e 74 20  ar *zCol;.  int 
b350: 72 63 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rc;.  Tcl_Obj *p
b360: 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  Ret;..  const ch
b370: 61 72 20 2a 7a 44 61 74 61 74 79 70 65 3b 0a 20  ar *zDatatype;. 
b380: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
b390: 6c 6c 73 65 71 3b 0a 20 20 69 6e 74 20 6e 6f 74  llseq;.  int not
b3a0: 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20 70 72 69 6d  null;.  int prim
b3b0: 61 72 79 6b 65 79 3b 0a 20 20 69 6e 74 20 61 75  arykey;.  int au
b3c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 3b 0a 0a 20 20  toincrement;..  
b3d0: 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
b3e0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
b3f0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b400: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
b410: 22 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61  "DB dbname tblna
b420: 6d 65 20 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20  me colname");.  
b430: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
b440: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
b450: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
b460: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
b470: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
b480: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
b490: 4f 52 3b 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f  OR;.  zDb = Tcl_
b4a0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
b4b0: 5d 29 3b 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c  ]);.  zTbl = Tcl
b4c0: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
b4d0: 33 5d 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 6f 62  3]);.  zCol = ob
b4e0: 6a 63 3d 3d 35 20 3f 20 54 63 6c 5f 47 65 74 53  jc==5 ? Tcl_GetS
b4f0: 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 20 3a  tring(objv[4]) :
b500: 20 30 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65   0;..  if( strle
b510: 6e 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20  n(zDb)==0 ) zDb 
b520: 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 0;..  rc = sql
b530: 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
b540: 6e 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a  n_metadata(db, z
b550: 44 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20  Db, zTbl, zCol, 
b560: 0a 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70  .      &zDatatyp
b570: 65 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e  e, &zCollseq, &n
b580: 6f 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79  otnull, &primary
b590: 6b 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d  key, &autoincrem
b5a0: 65 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21  ent);..  if( rc!
b5b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b5c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
b5d0: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
b5e0: 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30  e3_errmsg(db), 0
b5f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
b600: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
b610: 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
b620: 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
b630: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
b640: 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  0, pRet, Tcl_New
b650: 53 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74  StringObj(zDatat
b660: 79 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  ype, -1));.  Tcl
b670: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
b680: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
b690: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
b6a0: 7a 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a  zCollseq, -1));.
b6b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
b6c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
b6d0: 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  et, Tcl_NewIntOb
b6e0: 6a 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54  j(notnull));.  T
b6f0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b700: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b710: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70   Tcl_NewIntObj(p
b720: 72 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54  rimarykey));.  T
b730: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
b740: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
b750: 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61   Tcl_NewIntObj(a
b760: 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a  utoincrement));.
b770: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
b780: 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29  lt(interp, pRet)
b790: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  ;..  return TCL_
b7a0: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
b7b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43 52 42  QLITE_OMIT_INCRB
b7c0: 4c 4f 42 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  LOB..static int 
b7d0: 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 62 6c  SQLITE_TCLAPI bl
b7e0: 6f 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28  obHandleFromObj(
b7f0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
b800: 6e 74 65 72 70 2c 20 0a 20 20 54 63 6c 5f 4f 62  nterp, .  Tcl_Ob
b810: 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73 71 6c 69 74  j *pObj,.  sqlit
b820: 65 33 5f 62 6c 6f 62 20 2a 2a 70 70 42 6c 6f 62  e3_blob **ppBlob
b830: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
b840: 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a 20 3d 20 54   int n;..  z = T
b850: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
b860: 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e 29 3b 0a 20  Obj(pObj, &n);. 
b870: 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
b880: 20 2a 70 70 42 6c 6f 62 20 3d 20 30 3b 0a 20 20   *ppBlob = 0;.  
b890: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 6e  }else{.    int n
b8a0: 6f 74 55 73 65 64 3b 0a 20 20 20 20 54 63 6c 5f  otUsed;.    Tcl_
b8b0: 43 68 61 6e 6e 65 6c 20 63 68 61 6e 6e 65 6c 3b  Channel channel;
b8c0: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
b8d0: 69 6e 73 74 61 6e 63 65 44 61 74 61 3b 0a 20 20  instanceData;.  
b8e0: 20 20 0a 20 20 20 20 63 68 61 6e 6e 65 6c 20 3d    .    channel =
b8f0: 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 28   Tcl_GetChannel(
b900: 69 6e 74 65 72 70 2c 20 7a 2c 20 26 6e 6f 74 55  interp, z, &notU
b910: 73 65 64 29 3b 0a 20 20 20 20 69 66 28 20 21 63  sed);.    if( !c
b920: 68 61 6e 6e 65 6c 20 29 20 72 65 74 75 72 6e 20  hannel ) return 
b930: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 20 20  TCL_ERROR;..    
b940: 54 63 6c 5f 46 6c 75 73 68 28 63 68 61 6e 6e 65  Tcl_Flush(channe
b950: 6c 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 65 6b  l);.    Tcl_Seek
b960: 28 63 68 61 6e 6e 65 6c 2c 20 30 2c 20 53 45 45  (channel, 0, SEE
b970: 4b 5f 53 45 54 29 3b 0a 0a 20 20 20 20 69 6e 73  K_SET);..    ins
b980: 74 61 6e 63 65 44 61 74 61 20 3d 20 54 63 6c 5f  tanceData = Tcl_
b990: 47 65 74 43 68 61 6e 6e 65 6c 49 6e 73 74 61 6e  GetChannelInstan
b9a0: 63 65 44 61 74 61 28 63 68 61 6e 6e 65 6c 29 3b  ceData(channel);
b9b0: 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20 2a  .    *ppBlob = *
b9c0: 28 28 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a  ((sqlite3_blob *
b9d0: 2a 29 69 6e 73 74 61 6e 63 65 44 61 74 61 29 3b  *)instanceData);
b9e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
b9f0: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63  CL_OK;.}..static
ba00: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
ba10: 50 49 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f  PI test_blob_reo
ba20: 70 65 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  pen(.  ClientDat
ba30: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
ba40: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
ba50: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ba60: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
ba70: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
ba80: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
ba90: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
baa0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
bab0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bac0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
bad0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
bae0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
baf0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
bb00: 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69  .  Tcl_WideInt i
bb10: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
bb20: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
bb30: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
bb40: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
bb50: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
bb60: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
bb70: 22 43 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29  "CHANNEL ROWID")
bb80: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
bb90: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
bba0: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
bbb0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
bbc0: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
bbd0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
bbe0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57  ;.  if( Tcl_GetW
bbf0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
bc00: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
bc10: 69 52 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e  iRowid) ) return
bc20: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
bc30: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
bc40: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
bc50: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63  Rowid);.  if( rc
bc60: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
bc70: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
bc80: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
bc90: 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
bca0: 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  rc), TCL_VOLATIL
bcb0: 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  E);.  }..  retur
bcc0: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
bcd0: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
bce0: 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ERROR);.}..#endi
bcf0: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
bd00: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
bd10: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48  ollation_v2 DB-H
bd20: 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50  ANDLE NAME CMP-P
bd30: 52 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a  ROC DEL-PROC.**.
bd40: 2a 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72  **   This Tcl pr
bd50: 6f 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  oc is used for t
bd60: 65 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72  esting the exper
bd70: 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c  imental.**   sql
bd80: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
bd90: 61 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72  ation_v2() inter
bda0: 66 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  face..*/.struct 
bdb0: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b  TestCollationX {
bdc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
bdd0: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
bde0: 20 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62   *pCmp;.  Tcl_Ob
bdf0: 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65  j *pDel;.};.type
be00: 64 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43  def struct TestC
be10: 6f 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f  ollationX TestCo
be20: 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63  llationX;.static
be30: 20 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65   void testCreate
be40: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69  CollationDel(voi
be50: 64 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74  d *pCtx){.  Test
be60: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20  CollationX *p = 
be70: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
be80: 2a 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72  *)pCtx;..  int r
be90: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
bea0: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
beb0: 70 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pDel, TCL_EVAL_D
bec0: 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47  IRECT|TCL_EVAL_G
bed0: 4c 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63  LOBAL);.  if( rc
bee0: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
bef0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
bf00: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
bf10: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
bf20: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29  efCount(p->pCmp)
bf30: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
bf40: 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20  ount(p->pDel);. 
bf50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76   sqlite3_free((v
bf60: 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74  oid *)p);.}.stat
bf70: 69 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74  ic int testCreat
bf80: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20  eCollationCmp(. 
bf90: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
bfa0: 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73  nt nLeft,.  cons
bfb0: 74 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20  t void *zLeft,. 
bfc0: 20 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63   int nRight,.  c
bfd0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68  onst void *zRigh
bfe0: 74 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  t.){.  TestColla
bff0: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
c000: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
c010: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  x;.  Tcl_Obj *pS
c020: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c  cript = Tcl_Dupl
c030: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70  icateObj(p->pCmp
c040: 29 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20  );.  int iRes = 
c050: 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  0;..  Tcl_IncrRe
c060: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
c070: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c090: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0a0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c0b0: 29 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b  )zLeft, nLeft));
c0c0: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c0d0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c0e0: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c0f0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c100: 29 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29  )zRight,nRight))
c110: 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  ;..  if( TCL_OK!
c120: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
c130: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
c140: 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  t, TCL_EVAL_DIRE
c150: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
c160: 41 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  AL).   || TCL_OK
c170: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
c180: 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54  Obj(p->interp, T
c190: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
c1a0: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65  p->interp), &iRe
c1b0: 73 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f  s).  ){.    Tcl_
c1c0: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
c1d0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
c1e0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c1f0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20  nt(pScript);..  
c200: 72 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73  return iRes;.}.s
c210: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
c220: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 72 65  _TCLAPI test_cre
c230: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c240: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
c250: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
c260: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
c270: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
c280: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
c290: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
c2a0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
c2b0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
c2c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
c2d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
c2e0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
c2f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
c300: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
c310: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
c320: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a  TestCollationX *
c330: 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  p;.  sqlite3 *db
c340: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
c350: 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
c360: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
c370: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
c380: 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45 20 4e  jv, "DB-HANDLE N
c390: 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45 4c  AME CMP-PROC DEL
c3a0: 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72 65 74  -PROC");.    ret
c3b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
c3c0: 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
c3d0: 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
c3e0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c3f0: 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
c400: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
c410: 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61    p = (TestColla
c420: 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65 33 5f  tionX *)sqlite3_
c430: 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 65  malloc(sizeof(Te
c440: 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a  stCollationX));.
c450: 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62 6a 76    p->pCmp = objv
c460: 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c 20 3d  [3];.  p->pDel =
c470: 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69   objv[4];.  p->i
c480: 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a  nterp = interp;.
c490: 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
c4a0: 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54  nt(p->pCmp);.  T
c4b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
c4c0: 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72 63 20  p->pDel);..  rc 
c4d0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
c4e0: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
c4f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
c500: 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20 0a 20  objv[2]), 16, . 
c510: 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20       (void *)p, 
c520: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c530: 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61  ionCmp, testCrea
c540: 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20  teCollationDel. 
c550: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
c560: 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b 0a 20  LITE_MISUSE ){. 
c570: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
c580: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  ult(interp, "sql
c590: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c5a0: 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65 64 20  ate_v2() failed 
c5b0: 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20 20 20  to detect ".    
c5c0: 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20 65 6e    "an invalid en
c5d0: 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72 2a 29  coding", (char*)
c5e0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
c5f0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c600: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
c610: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
c620: 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  (db, Tcl_GetStri
c630: 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53 51 4c  ng(objv[2]), SQL
c640: 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20  ITE_UTF8, .     
c650: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
c660: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c670: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
c680: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
c690: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
c6a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a  .}../*.** USAGE:
c6b0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c6c0: 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42 20 4e  function_v2 DB N
c6d0: 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f 53 57  AME NARG ENC ?SW
c6e0: 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76  ITCHES?.**.** Av
c6f0: 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68 65 73  ailable switches
c700: 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66   are:.**.**   -f
c710: 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a 2a 2a  unc    SCRIPT.**
c720: 20 20 20 2d 73 74 65 70 20 20 20 20 53 43 52 49     -step    SCRI
c730: 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c 20 20  PT.**   -final  
c740: 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d 64 65   SCRIPT.**   -de
c750: 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a 2f 0a  stroy SCRIPT.*/.
c760: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 43  typedef struct C
c770: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
c780: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c790: 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74 65 46  ;.struct CreateF
c7a0: 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20 54 63  unctionV2 {.  Tc
c7b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c7c0: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 75  ;.  Tcl_Obj *pFu
c7d0: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
c7e0: 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f      /* Script fo
c7f0: 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76 6f 63  r function invoc
c800: 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ation */.  Tcl_O
c810: 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20 20 20  bj *pStep;      
c820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63             /* Sc
c830: 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20 73 74  ript for agg. st
c840: 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  ep invocation */
c850: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e  .  Tcl_Obj *pFin
c860: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
c870: 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66 6f 72     /* Script for
c880: 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61 74 69   agg. finalizati
c890: 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f  on invocation */
c8a0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65 73  .  Tcl_Obj *pDes
c8b0: 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20 20 20  troy;           
c8c0: 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74 6f 72     /* Destructor
c8d0: 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74   script */.};.st
c8e0: 61 74 69 63 20 76 6f 69 64 20 63 66 32 46 75 6e  atic void cf2Fun
c8f0: 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  c(sqlite3_contex
c900: 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67  t *ctx, int nArg
c910: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
c920: 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69  **aArg){.}.stati
c930: 63 20 76 6f 69 64 20 63 66 32 53 74 65 70 28 73  c void cf2Step(s
c940: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
c950: 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73  ctx, int nArg, s
c960: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
c970: 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  Arg){.}.static v
c980: 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73 71 6c  oid cf2Final(sql
c990: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74  ite3_context *ct
c9a0: 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  x){.}.static voi
c9b0: 64 20 63 66 32 44 65 73 74 72 6f 79 28 76 6f 69  d cf2Destroy(voi
c9c0: 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43 72 65  d *pUser){.  Cre
c9d0: 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20 2a 70  ateFunctionV2 *p
c9e0: 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63 74 69   = (CreateFuncti
c9f0: 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a 0a 20  onV2 *)pUser;.. 
ca00: 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70 20 26   if( p->interp &
ca10: 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 7b  & p->pDestroy ){
ca20: 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20 54 63  .    int rc = Tc
ca30: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
ca40: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73 74 72  nterp, p->pDestr
ca50: 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  oy, 0);.    if( 
ca60: 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54 63 6c  rc!=TCL_OK ) Tcl
ca70: 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72  _BackgroundError
ca80: 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d  (p->interp);.  }
ca90: 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75 6e 63  ..  if( p->pFunc
caa0: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
cab0: 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a  unt(p->pFunc); .
cac0: 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29    if( p->pStep )
cad0: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
cae0: 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20  t(p->pStep); .  
caf0: 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20  if( p->pFinal ) 
cb00: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
cb10: 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a 20 20  (p->pFinal); .  
cb20: 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f 79 20  if( p->pDestroy 
cb30: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
cb40: 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79 29 3b  nt(p->pDestroy);
cb50: 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65   .  sqlite3_free
cb60: 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  (p);.}.static in
cb70: 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
cb80: 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63  test_create_func
cb90: 74 69 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e  tion_v2(.  Clien
cba0: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
cbb0: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  ,          /* No
cbc0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
cbd0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
cbf0: 68 65 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20  he invoking TCL 
cc00: 69 6e 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20  interpreter */. 
cc10: 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
cc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc30: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
cc40: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
cc50: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
cc60: 5b 5d 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  []           /* 
cc70: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
cc80: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
cc90: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
cca0: 68 61 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e  har *zFunc;.  in
ccb0: 74 20 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e  t nArg;.  int en
ccc0: 63 3b 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74  c;.  CreateFunct
ccd0: 69 6f 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20  ionV2 *p;.  int 
cce0: 69 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  i;.  int rc;..  
ccf0: 73 74 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20  struct EncTable 
cd00: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
cd10: 20 2a 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20   *zEnc;.    int 
cd20: 65 6e 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20  enc;.  } aEnc[] 
cd30: 3d 20 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c  = {.    {"utf8",
cd40: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20      SQLITE_UTF8 
cd50: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c  },.    {"utf16",
cd60: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20     SQLITE_UTF16 
cd70: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65  },.    {"utf16le
cd80: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
cd90: 45 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36  E },.    {"utf16
cda0: 62 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  be", SQLITE_UTF1
cdb0: 36 42 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79  6BE },.    {"any
cdc0: 22 2c 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e  ",     SQLITE_AN
cdd0: 59 20 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30  Y },.    {"0", 0
cde0: 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f   }.  };..  if( o
cdf0: 62 6a 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32  bjc<5 || (objc%2
ce00: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f  )==0 ){.    Tcl_
ce10: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ce20: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
ce30: 42 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20  B NAME NARG ENC 
ce40: 53 57 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20  SWITCHES...");. 
ce50: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
ce60: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
ce70: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ce80: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ce90: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
cea0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ceb0: 52 52 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20  RROR;.  zFunc = 
cec0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
ced0: 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63  jv[2]);.  if( Tc
cee0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
cef0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
cf00: 20 26 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e   &nArg) ) return
cf10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
cf20: 28 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  ( Tcl_GetIndexFr
cf30: 6f 6d 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65  omObjStruct(inte
cf40: 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e  rp, objv[4], aEn
cf50: 63 2c 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30  c, sizeof(aEnc[0
cf60: 5d 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22  ]), .          "
cf70: 65 6e 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65  encoding", 0, &e
cf80: 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  nc).  ){.    ret
cf90: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
cfa0: 20 7d 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b   }.  enc = aEnc[
cfb0: 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d  enc].enc;..  p =
cfc0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
cfd0: 73 69 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e  sizeof(CreateFun
cfe0: 63 74 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73  ctionV2));.  ass
cff0: 65 72 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73  ert( p );.  mems
d000: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
d010: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
d020: 29 29 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20  ));.  p->interp 
d030: 3d 20 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72  = interp;..  for
d040: 28 69 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b  (i=5; i<objc; i+
d050: 3d 32 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77  =2){.    int iSw
d060: 69 74 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20  itch;.    const 
d070: 63 68 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d  char *azSwitch[]
d080: 20 3d 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73   = {"-func", "-s
d090: 74 65 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20  tep", "-final", 
d0a0: 22 2d 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a  "-destroy", 0};.
d0b0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
d0c0: 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  ndexFromObj(inte
d0d0: 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53  rp, objv[i], azS
d0e0: 77 69 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c  witch, "switch",
d0f0: 20 30 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b   0, &iSwitch) ){
d100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
d110: 72 65 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65  ree(p);.      re
d120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d130: 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
d140: 68 28 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20  h( iSwitch ){.  
d150: 20 20 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70      case 0: p->p
d160: 46 75 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Func = objv[i+1]
d170: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d180: 20 20 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70      case 1: p->p
d190: 53 74 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d  Step = objv[i+1]
d1a0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
d1b0: 20 20 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70      case 2: p->p
d1c0: 46 69 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31  Final = objv[i+1
d1d0: 5d 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ];     break;.  
d1e0: 20 20 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70      case 3: p->p
d1f0: 44 65 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69  Destroy = objv[i
d200: 2b 31 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  +1];   break;.  
d210: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d    }.  }.  if( p-
d220: 3e 70 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e  >pFunc ) p->pFun
d230: 63 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74  c = Tcl_Duplicat
d240: 65 4f 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20  eObj(p->pFunc); 
d250: 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20  .  if( p->pStep 
d260: 29 20 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c  ) p->pStep = Tcl
d270: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d  _DuplicateObj(p-
d280: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
d290: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70  p->pFinal ) p->p
d2a0: 46 69 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c  Final = Tcl_Dupl
d2b0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e  icateObj(p->pFin
d2c0: 61 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70  al); .  if( p->p
d2d0: 44 65 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65  Destroy ) p->pDe
d2e0: 73 74 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c  stroy = Tcl_Dupl
d2f0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73  icateObj(p->pDes
d300: 74 72 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70  troy); ..  if( p
d310: 2d 3e 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e  ->pFunc ) Tcl_In
d320: 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46  crRefCount(p->pF
d330: 75 6e 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e  unc); .  if( p->
d340: 70 53 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72  pStep ) Tcl_Incr
d350: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65  RefCount(p->pSte
d360: 70 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46  p); .  if( p->pF
d370: 69 6e 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52  inal ) Tcl_IncrR
d380: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61  efCount(p->pFina
d390: 6c 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44  l); .  if( p->pD
d3a0: 65 73 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63  estroy ) Tcl_Inc
d3b0: 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65  rRefCount(p->pDe
d3c0: 73 74 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d  stroy); ..  rc =
d3d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d3e0: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20  function_v2(db, 
d3f0: 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63  zFunc, nArg, enc
d400: 2c 20 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20  , (void *)p, .  
d410: 20 20 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20      (p->pFunc ? 
d420: 63 66 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20  cf2Func : 0),.  
d430: 20 20 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20      (p->pStep ? 
d440: 63 66 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20  cf2Step : 0),.  
d450: 20 20 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f      (p->pFinal ?
d460: 20 63 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a   cf2Final : 0),.
d470: 20 20 20 20 20 20 63 66 32 44 65 73 74 72 6f 79        cf2Destroy
d480: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
d490: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d4a0: 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74   Tcl_ResetResult
d4b0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63  (interp);.    Tc
d4c0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
d4d0: 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72  nterp, sqlite3Er
d4e0: 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20  rName(rc), 0);. 
d4f0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
d500: 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
d510: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
d520: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
d530: 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
d540: 20 44 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20   DB-HANDLE FILE 
d550: 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63  ?PROC?.*/.static
d560: 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
d570: 50 49 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74  PI test_load_ext
d580: 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ension(.  Client
d590: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
d5a0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
d5b0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d5c0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d5d0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d5e0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d5f0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d600: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d610: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d620: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d630: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d640: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d650: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d660: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
d670: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
d680: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
d690: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  rc;.  char *zDb;
d6a0: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
d6b0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20    char *zProc = 
d6c0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
d6d0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
d6e0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=4 && objc!=3 )
d6f0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
d700: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d710: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
d720: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29  LE FILE ?PROC?")
d730: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d740: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
d750: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
d760: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46  g(objv[1]);.  zF
d770: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
d780: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
d790: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
d7a0: 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47     zProc = Tcl_G
d7b0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
d7c0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  );.  }..  /* Ext
d7d0: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
d7e0: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
d7f0: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
d800: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
d810: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
d820: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
d830: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
d840: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d850: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
d860: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
d870: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
d880: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d890: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
d8a0: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
d8b0: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
d8c0: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
d8d0: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
d8e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64   /* Call the und
d8f0: 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69  erlying C functi
d900: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
d910: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
d920: 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f  o .  ** TCL_ERRO
d930: 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65  R and load any e
d940: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f  rror string into
d950: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
d960: 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72  . If no .  ** er
d970: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d980: 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20  rc to TCL_OK..  
d990: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d9a0: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
d9b0: 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49  SION.  rc = SQLI
d9c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72  TE_ERROR;.  zErr
d9d0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
d9e0: 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f  tf("this build o
d9f0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
da00: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
da10: 0a 20 20 28 76 6f 69 64 29 7a 50 72 6f 63 3b 0a  .  (void)zProc;.
da20: 20 20 28 76 6f 69 64 29 7a 46 69 6c 65 3b 0a 23    (void)zFile;.#
da30: 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69  else.  rc = sqli
da40: 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  te3_load_extensi
da50: 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20 7a 50  on(db, zFile, zP
da60: 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23 65 6e  roc, &zErr);.#en
da70: 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d 53 51  dif.  if( rc!=SQ
da80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
da90: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
daa0: 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45 72 72  erp, zErr ? zErr
dab0: 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c 41 54   : "", TCL_VOLAT
dac0: 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d 20 54  ILE);.    rc = T
dad0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73  CL_ERROR;.  }els
dae0: 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43 4c 5f  e{.    rc = TCL_
daf0: 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  OK;.  }.  sqlite
db00: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 0a 20  3_free(zErr);.. 
db10: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
db20: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
db30: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
db40: 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48 41 4e  extension DB-HAN
db50: 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73 74 61  DLE ONOFF.*/.sta
db60: 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
db70: 43 4c 41 50 49 20 74 65 73 74 5f 65 6e 61 62 6c  CLAPI test_enabl
db80: 65 5f 6c 6f 61 64 28 0a 20 20 43 6c 69 65 6e 74  e_load(.  Client
db90: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
dba0: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
dbb0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
dbc0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
dbd0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
dbe0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
dbf0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
dc00: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
dc10: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
dc20: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
dc30: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
dc40: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
dc50: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
dc60: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
dc70: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
dc80: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
dc90: 20 2a 7a 44 62 3b 0a 20 20 69 6e 74 20 6f 6e 6f   *zDb;.  int ono
dca0: 66 66 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  ff;..  if( objc!
dcb0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =3 ){.    Tcl_Wr
dcc0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
dcd0: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 2d  p, 1, objv, "DB-
dce0: 48 41 4e 44 4c 45 20 4f 4e 4f 46 46 22 29 3b 0a  HANDLE ONOFF");.
dcf0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
dd00: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20  RROR;.  }.  zDb 
dd10: 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
dd20: 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20 20 2f 2a 20  objv[1]);..  /* 
dd30: 45 78 74 72 61 63 74 20 74 68 65 20 43 20 64 61  Extract the C da
dd40: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 66 72  tabase handle fr
dd50: 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61  om the Tcl comma
dd60: 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28  nd name */.  if(
dd70: 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
dd80: 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62  Info(interp, zDb
dd90: 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20  , &cmdInfo) ){. 
dda0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ddb0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d  ult(interp, "com
ddc0: 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20  mand not found: 
ddd0: 22 2c 20 7a 44 62 2c 20 28 63 68 61 72 2a 29 30  ", zDb, (char*)0
dde0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ddf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64  L_ERROR;.  }.  d
de00: 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
de10: 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
de20: 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
de30: 62 3b 0a 20 20 61 73 73 65 72 74 28 64 62 29 3b  b;.  assert(db);
de40: 0a 0a 20 20 2f 2a 20 47 65 74 20 74 68 65 20 6f  ..  /* Get the o
de50: 6e 6f 66 66 20 70 61 72 61 6d 65 74 65 72 20 2a  noff parameter *
de60: 2f 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  /.  if( Tcl_GetB
de70: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
de80: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
de90: 6f 6e 6f 66 66 29 20 29 7b 0a 20 20 20 20 72 65  onoff) ){.    re
dea0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
deb0: 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
dec0: 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54  TE_OMIT_LOAD_EXT
ded0: 45 4e 53 49 4f 4e 0a 20 20 54 63 6c 5f 41 70 70  ENSION.  Tcl_App
dee0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
def0: 2c 20 22 74 68 69 73 20 62 75 69 6c 64 20 6f 6d  , "this build om
df00: 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  its sqlite3_load
df10: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b 0a  _extension()");.
df20: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
df30: 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69  OR;.#else.  sqli
df40: 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
df50: 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 6f 6e  extension(db, on
df60: 6f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  off);.  return T
df70: 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 0a 7d 0a  CL_OK;.#endif.}.
df80: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
df90: 71 6c 69 74 65 5f 61 62 6f 72 74 0a 2a 2a 0a 2a  qlite_abort.**.*
dfa0: 2a 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70  * Shutdown the p
dfb0: 72 6f 63 65 73 73 20 69 6d 6d 65 64 69 61 74 65  rocess immediate
dfc0: 6c 79 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 74  ly.  This is not
dfd0: 20 61 20 63 6c 65 61 6e 20 73 68 75 74 64 6f 77   a clean shutdow
dfe0: 6e 2e 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61  n..** This comma
dff0: 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74 65  nd is used to te
e000: 73 74 20 74 68 65 20 72 65 63 6f 76 65 72 61 62  st the recoverab
e010: 69 6c 69 74 79 20 6f 66 20 61 20 64 61 74 61 62  ility of a datab
e020: 61 73 65 20 69 6e 0a 2a 2a 20 74 68 65 20 65 76  ase in.** the ev
e030: 65 6e 74 20 6f 66 20 61 20 70 72 6f 67 72 61 6d  ent of a program
e040: 20 63 72 61 73 68 2e 0a 2a 2f 0a 73 74 61 74 69   crash..*/.stati
e050: 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
e060: 41 50 49 20 73 71 6c 69 74 65 5f 61 62 6f 72 74  API sqlite_abort
e070: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
e080: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
e090: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
e0a0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
e0b0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
e0c0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
e0d0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
e0e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
e0f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e100: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
e110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e120: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
e130: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 64  ment */.){.#if d
e140: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
e150: 0a 20 20 2f 2a 20 57 65 20 64 6f 20 74 68 69 73  .  /* We do this
e160: 2c 20 6f 74 68 65 72 77 69 73 65 20 74 68 65 20  , otherwise the 
e170: 74 65 73 74 20 77 69 6c 6c 20 68 61 6c 74 20 77  test will halt w
e180: 69 74 68 20 61 20 70 6f 70 75 70 20 6d 65 73 73  ith a popup mess
e190: 61 67 65 0a 20 20 20 2a 20 74 68 61 74 20 77 65  age.   * that we
e1a0: 20 68 61 76 65 20 74 6f 20 63 6c 69 63 6b 20 61   have to click a
e1b0: 77 61 79 20 62 65 66 6f 72 65 20 74 68 65 20 74  way before the t
e1c0: 65 73 74 20 77 69 6c 6c 20 63 6f 6e 74 69 6e 75  est will continu
e1d0: 65 2e 0a 20 20 20 2a 2f 0a 20 20 5f 73 65 74 5f  e..   */.  _set_
e1e0: 61 62 6f 72 74 5f 62 65 68 61 76 69 6f 72 28 20  abort_behavior( 
e1f0: 30 2c 20 5f 43 41 4c 4c 5f 52 45 50 4f 52 54 46  0, _CALL_REPORTF
e200: 41 55 4c 54 20 29 3b 0a 23 65 6e 64 69 66 0a 20  AULT );.#endif. 
e210: 20 65 78 69 74 28 32 35 35 29 3b 0a 20 20 61 73   exit(255);.  as
e220: 73 65 72 74 28 20 69 6e 74 65 72 70 3d 3d 30 20  sert( interp==0 
e230: 29 3b 20 20 20 2f 2a 20 54 68 69 73 20 77 69 6c  );   /* This wil
e240: 6c 20 61 6c 77 61 79 73 20 66 61 69 6c 20 2a 2f  l always fail */
e250: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
e260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  ;.}../*.** The f
e270: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
e280: 20 69 73 20 61 20 75 73 65 72 2d 64 65 66 69 6e   is a user-defin
e290: 65 64 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20  ed SQL function 
e2a0: 77 68 6f 73 65 20 70 75 72 70 6f 73 65 0a 2a 2a  whose purpose.**
e2b0: 20 69 73 20 74 6f 20 74 65 73 74 20 74 68 65 20   is to test the 
e2c0: 73 71 6c 69 74 65 5f 73 65 74 5f 72 65 73 75 6c  sqlite_set_resul
e2d0: 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74  t() API..*/.stat
e2e0: 69 63 20 76 6f 69 64 20 74 65 73 74 46 75 6e 63  ic void testFunc
e2f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e300: 20 2a 63 6f 6e 74 65 78 74 2c 20 69 6e 74 20 61   *context, int a
e310: 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  rgc, sqlite3_val
e320: 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 77 68  ue **argv){.  wh
e330: 69 6c 65 28 20 61 72 67 63 3e 3d 32 20 29 7b 0a  ile( argc>=2 ){.
e340: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
e350: 7a 41 72 67 30 20 3d 20 28 63 68 61 72 2a 29 73  zArg0 = (char*)s
e360: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
e370: 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20  t(argv[0]);.    
e380: 69 66 28 20 7a 41 72 67 30 20 29 7b 0a 20 20 20  if( zArg0 ){.   
e390: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
e3a0: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 20  3StrICmp(zArg0, 
e3b0: 22 69 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20  "int") ){.      
e3c0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e3d0: 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73 71  _int(context, sq
e3e0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28  lite3_value_int(
e3f0: 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20  argv[1]));.     
e400: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e410: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e420: 22 69 6e 74 36 34 22 29 3d 3d 30 20 29 7b 0a 20  "int64")==0 ){. 
e430: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
e440: 65 73 75 6c 74 5f 69 6e 74 36 34 28 63 6f 6e 74  esult_int64(cont
e450: 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  ext, sqlite3_val
e460: 75 65 5f 69 6e 74 36 34 28 61 72 67 76 5b 31 5d  ue_int64(argv[1]
e470: 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ));.      }else 
e480: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
e490: 6d 70 28 7a 41 72 67 30 2c 22 73 74 72 69 6e 67  mp(zArg0,"string
e4a0: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
e4b0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
e4c0: 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63  text(context, (c
e4d0: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
e4e0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
e4f0: 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20  , -1,.          
e500: 20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45    SQLITE_TRANSIE
e510: 4e 54 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  NT);.      }else
e520: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
e530: 43 6d 70 28 7a 41 72 67 30 2c 22 64 6f 75 62 6c  Cmp(zArg0,"doubl
e540: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
e550: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e560: 5f 64 6f 75 62 6c 65 28 63 6f 6e 74 65 78 74 2c  _double(context,
e570: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 64   sqlite3_value_d
e580: 6f 75 62 6c 65 28 61 72 67 76 5b 31 5d 29 29 3b  ouble(argv[1]));
e590: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
e5a0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
e5b0: 7a 41 72 67 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30  zArg0,"null")==0
e5c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e5d0: 74 65 33 5f 72 65 73 75 6c 74 5f 6e 75 6c 6c 28  te3_result_null(
e5e0: 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20 20 20 20  context);.      
e5f0: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
e600: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
e610: 76 61 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20  value")==0 ){.  
e620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
e630: 73 75 6c 74 5f 76 61 6c 75 65 28 63 6f 6e 74 65  sult_value(conte
e640: 78 74 2c 20 61 72 67 76 5b 73 71 6c 69 74 65 33  xt, argv[sqlite3
e650: 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76 5b  _value_int(argv[
e660: 31 5d 29 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c  1])]);.      }el
e670: 73 65 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  se{.        goto
e680: 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
e690: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
e6a0: 20 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f       goto error_
e6b0: 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
e6c0: 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 72  rgc -= 2;.    ar
e6d0: 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 72  gv += 2;.  }.  r
e6e0: 65 74 75 72 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75  eturn;..error_ou
e6f0: 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  t:.  sqlite3_res
e700: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
e710: 74 2c 22 66 69 72 73 74 20 61 72 67 75 6d 65 6e  t,"first argumen
e720: 74 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  t should be one 
e730: 6f 66 3a 20 22 0a 20 20 20 20 20 20 22 69 6e 74  of: ".      "int
e740: 20 69 6e 74 36 34 20 73 74 72 69 6e 67 20 64 6f   int64 string do
e750: 75 62 6c 65 20 6e 75 6c 6c 20 76 61 6c 75 65 22  uble null value"
e760: 2c 20 2d 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , -1);.}../*.** 
e770: 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 5f  Usage:   sqlite_
e780: 72 65 67 69 73 74 65 72 5f 74 65 73 74 5f 66 75  register_test_fu
e790: 6e 63 74 69 6f 6e 20 20 44 42 20 20 4e 41 4d 45  nction  DB  NAME
e7a0: 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  .**.** Register 
e7b0: 74 68 65 20 74 65 73 74 20 53 51 4c 20 66 75 6e  the test SQL fun
e7c0: 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20 64 61 74  ction on the dat
e7d0: 61 62 61 73 65 20 44 42 20 75 6e 64 65 72 20 74  abase DB under t
e7e0: 68 65 20 6e 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f  he name NAME..*/
e7f0: 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
e800: 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 72  TE_TCLAPI test_r
e810: 65 67 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20  egister_func(.  
e820: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
e830: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e840: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e850: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e860: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e870: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e880: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
e890: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e8a0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e8b0: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
e8c0: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
e8d0: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
e8e0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
e8f0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
e900: 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b    if( argc!=3 ){
e910: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
e920: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
e930: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
e940: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
e950: 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44  [0], .       " D
e960: 42 20 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22  B FUNCTION-NAME"
e970: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
e980: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
e990: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
e9a0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
e9b0: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
e9c0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
e9d0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
e9e0: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
e9f0: 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
ea00: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20  ITE_UTF8, 0, .  
ea10: 20 20 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c      testFunc, 0,
ea20: 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30   0);.  if( rc!=0
ea30: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
ea40: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
ea50: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72   sqlite3ErrStr(r
ea60: 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  c), 0);.    retu
ea70: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ea80: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  }.  if( sqlite3T
ea90: 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
eaa0: 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74  p, db, rc) ) ret
eab0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
eac0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
ead0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
eae0: 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
eaf0: 65 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46  e  STMT .**.** F
eb00: 69 6e 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d  inalize a statem
eb10: 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73  ent handle..*/.s
eb20: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
eb30: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 66 69 6e  _TCLAPI test_fin
eb40: 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20  alize(.  void * 
eb50: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
eb60: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
eb70: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
eb80: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
eb90: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
eba0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
ebb0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
ebc0: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20  te3 *db = 0;..  
ebd0: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
ebe0: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ebf0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
ec00: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
ec10: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
ec20: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
ec30: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
ec40: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
ec50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
ec60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
ec70: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
ec80: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
ec90: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
eca0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
ecb0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
ecc0: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
ecd0: 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62     db = StmtToDb
ece0: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
ecf0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
ed00: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54  lize(pStmt);.  T
ed10: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
ed20: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
ed30: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
ed40: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
ed50: 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65   db && sqlite3Te
ed60: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
ed70: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
ed80: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ed90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
eda0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
edb0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
edc0: 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20  tus  STMT  CODE 
edd0: 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a   RESETFLAG.**.**
ede0: 20 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Get the value o
edf0: 66 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74  f a status count
ee00: 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d  er from a statem
ee10: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
ee20: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
ee30: 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74 75   test_stmt_statu
ee40: 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
ee50: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
ee60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
ee70: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
ee80: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
ee90: 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61 6c 75  ].){.  int iValu
eea0: 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70 20 3d  e;.  int i, op =
eeb0: 20 30 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20   0, resetFlag;. 
eec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
eed0: 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Name;.  sqlite3_
eee0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
eef0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
ef00: 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
ef10: 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
ef20: 20 69 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70   int op;.  } aOp
ef30: 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51  [] = {.    { "SQ
ef40: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
ef50: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20  FULLSCAN_STEP", 
ef60: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
ef70: 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
ef80: 50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51  P   },.    { "SQ
ef90: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
efa0: 53 4f 52 54 22 2c 20 20 20 20 20 20 20 20 20 20  SORT",          
efb0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
efc0: 54 55 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20  TUS_SORT        
efd0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
efe0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
eff0: 41 55 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20  AUTOINDEX",     
f000: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f010: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20  TUS_AUTOINDEX   
f020: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f030: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f040: 56 4d 5f 53 54 45 50 22 2c 20 20 20 20 20 20 20  VM_STEP",       
f050: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f060: 54 55 53 5f 56 4d 5f 53 54 45 50 20 20 20 20 20  TUS_VM_STEP     
f070: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f080: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f090: 52 45 50 52 45 50 41 52 45 22 2c 20 20 20 20 20  REPREPARE",     
f0a0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f0b0: 54 55 53 5f 52 45 50 52 45 50 41 52 45 20 20 20  TUS_REPREPARE   
f0c0: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f0d0: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f0e0: 52 55 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  RUN",           
f0f0: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f100: 54 55 53 5f 52 55 4e 20 20 20 20 20 20 20 20 20  TUS_RUN         
f110: 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
f120: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f130: 4d 45 4d 55 53 45 44 22 2c 20 20 20 20 20 20 20  MEMUSED",       
f140: 20 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41    SQLITE_STMTSTA
f150: 54 55 53 5f 4d 45 4d 55 53 45 44 20 20 20 20 20  TUS_MEMUSED     
f160: 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66      },.  };.  if
f170: 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
f180: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
f190: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
f1a0: 76 2c 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54  v, "STMT PARAMET
f1b0: 45 52 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a  ER RESETFLAG");.
f1c0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
f1d0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
f1e0: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
f1f0: 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
f200: 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
f210: 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
f220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70  TCL_ERROR;.  zOp
f230: 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
f240: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
f250: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
f260: 79 53 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29  ySize(aOp); i++)
f270: 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  {.    if( strcmp
f280: 28 61 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a  (aOp[i].zName, z
f290: 4f 70 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20  OpName)==0 ){.  
f2a0: 20 20 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e      op = aOp[i].
f2b0: 6f 70 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  op;.      break;
f2c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
f2d0: 20 69 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f   i>=ArraySize(aO
f2e0: 70 29 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63  p) ){.    if( Tc
f2f0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
f300: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
f310: 20 26 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54   &op) ) return T
f320: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
f330: 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  if( Tcl_GetBoole
f340: 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
f350: 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65  , objv[3], &rese
f360: 74 46 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20  tFlag) ) return 
f370: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61  TCL_ERROR;.  iVa
f380: 6c 75 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  lue = sqlite3_st
f390: 6d 74 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c  mt_status(pStmt,
f3a0: 20 6f 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b   op, resetFlag);
f3b0: 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
f3c0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
f3d0: 4e 65 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65  NewIntObj(iValue
f3e0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
f3f0: 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
f400: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f410: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 2f 2a 0a  T_SCANSTATUS./*.
f420: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
f430: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
f440: 75 73 20 53 54 4d 54 20 49 44 58 0a 2a 2f 0a 73  us STMT IDX.*/.s
f450: 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
f460: 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d  _TCLAPI test_stm
f470: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 0a 20 20  t_scanstatus(.  
f480: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
f490: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
f4a0: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
f4b0: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
f4c0: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
f4d0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
f4e0: 70 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  pStmt;          
f4f0: 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d    /* First argum
f500: 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78  ent */.  int idx
f510: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
f520: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63 6f           /* Seco
f530: 6e 64 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 0a  nd argument */..
f540: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
f550: 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
f560: 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 73  r *zExplain;.  s
f570: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f  qlite3_int64 nLo
f580: 6f 70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  op;.  sqlite3_in
f590: 74 36 34 20 6e 56 69 73 69 74 3b 0a 20 20 64 6f  t64 nVisit;.  do
f5a0: 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 69 6e 74  uble rEst;.  int
f5b0: 20 72 65 73 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   res;..  if( obj
f5c0: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
f5d0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
f5e0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
f5f0: 54 4d 54 20 49 44 58 22 29 3b 0a 20 20 20 20 72  TMT IDX");.    r
f600: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
f610: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
f620: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
f630: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
f640: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
f650: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
f660: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
f670: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
f680: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
f690: 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
f6a0: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 65 73 20  L_ERROR;..  res 
f6b0: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
f6c0: 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d 74 2c  canstatus(pStmt,
f6d0: 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53 43 41   idx, SQLITE_SCA
f6e0: 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
f6f0: 69 64 2a 29 26 6e 4c 6f 6f 70 29 3b 0a 20 20 69  id*)&nLoop);.  i
f700: 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20  f( res==0 ){.   
f710: 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 20 3d   Tcl_Obj *pRet =
f720: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20   Tcl_NewObj();. 
f730: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f740: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f750: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
f760: 6e 67 4f 62 6a 28 22 6e 4c 6f 6f 70 22 2c 20 2d  ngObj("nLoop", -
f770: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
f780: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
f790: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
f7a0: 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 6e 4c 6f  ewWideIntObj(nLo
f7b0: 6f 70 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  op));.    sqlite
f7c0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f7d0: 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 53 51  s(pStmt, idx, SQ
f7e0: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56  LITE_SCANSTAT_NV
f7f0: 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56  ISIT, (void*)&nV
f800: 69 73 69 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c  isit);.    Tcl_L
f810: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
f820: 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c  ent(0, pRet, Tcl
f830: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e  _NewStringObj("n
f840: 56 69 73 69 74 22 2c 20 2d 31 29 29 3b 0a 20 20  Visit", -1));.  
f850: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f860: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f870: 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49  et, Tcl_NewWideI
f880: 6e 74 4f 62 6a 28 6e 56 69 73 69 74 29 29 3b 0a  ntObj(nVisit));.
f890: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f8a0: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f8b0: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f8c0: 43 41 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f  CANSTAT_EST, (vo
f8d0: 69 64 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20  id*)&rEst);.    
f8e0: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
f8f0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
f900: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
f910: 62 6a 28 22 6e 45 73 74 22 2c 20 2d 31 29 29 3b  bj("nEst", -1));
f920: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f930: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f940: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 44 6f   pRet, Tcl_NewDo
f950: 75 62 6c 65 4f 62 6a 28 72 45 73 74 29 29 3b 0a  ubleObj(rEst));.
f960: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f970: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f980: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f990: 43 41 4e 53 54 41 54 5f 4e 41 4d 45 2c 20 28 76  CANSTAT_NAME, (v
f9a0: 6f 69 64 2a 29 26 7a 4e 61 6d 65 29 3b 0a 20 20  oid*)&zName);.  
f9b0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f9c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f9d0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f9e0: 67 4f 62 6a 28 22 7a 4e 61 6d 65 22 2c 20 2d 31  gObj("zName", -1
f9f0: 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  ));.    Tcl_List
fa00: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
fa10: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
fa20: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4e 61 6d 65  wStringObj(zName
fa30: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 73 71 6c 69  , -1));.    sqli
fa40: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fa50: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
fa60: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
fa70: 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29  EXPLAIN, (void*)
fa80: 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  &zExplain);.    
fa90: 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
faa0: 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74  dElement(0, pRet
fab0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
fac0: 62 6a 28 22 7a 45 78 70 6c 61 69 6e 22 2c 20 2d  bj("zExplain", -
fad0: 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  1));.    Tcl_Lis
fae0: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
faf0: 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  t(0, pRet, Tcl_N
fb00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 45 78 70  ewStringObj(zExp
fb10: 6c 61 69 6e 2c 20 2d 31 29 29 3b 0a 20 20 20 20  lain, -1));.    
fb20: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
fb30: 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b 0a  (interp, pRet);.
fb40: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
fb50: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
fb60: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  erp);.  }.  retu
fb70: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
fb80: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
fb90: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fba0: 74 75 73 5f 72 65 73 65 74 20 20 53 54 4d 54 0a  tus_reset  STMT.
fbb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
fbc0: 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
fbd0: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
fbe0: 5f 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a  _reset(.  void *
fbf0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
fc00: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
fc10: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
fc20: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
fc30: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
fc40: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
fc60: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f  irst argument */
fc70: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
fc80: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
fc90: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
fca0: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b  , objv, "STMT");
fcb0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
fcc0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
fcd0: 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
fce0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
fcf0: 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
fd00: 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
fd10: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
fd20: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
fd30: 74 61 74 75 73 5f 72 65 73 65 74 28 70 53 74 6d  tatus_reset(pStm
fd40: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  t);.  return TCL
fd50: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  _OK;.}.#endif..#
fd60: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
fd70: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 2f 2a 0a 2a 2a  BLE_SQLLOG./*.**
fd80: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
fd90: 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 0a 2a  _config_sqllog.*
fda0: 2a 0a 2a 2a 20 5a 65 72 6f 20 74 68 65 20 53 51  *.** Zero the SQ
fdb0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
fdc0: 4f 47 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  OG configuration
fdd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
fde0: 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
fdf0: 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67 28  t_config_sqllog(
fe00: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
fe10: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
fe20: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
fe30: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
fe40: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
fe50: 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  ){.  if( objc!=1
fe60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
fe70: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
fe80: 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20   1, objv, "");. 
fe90: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
fea0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ROR;.  }.  sqlit
feb0: 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
fec0: 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 2c 20  _CONFIG_SQLLOG, 
fed0: 30 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0, 0);.  return 
fee0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
fef0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 76  ../*.** Usage: v
ff00: 66 73 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 5f  fs_current_time_
ff10: 69 6e 74 36 34 0a 2a 2a 0a 2a 2a 20 52 65 74 75  int64.**.** Retu
ff20: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  rn the value ret
ff30: 75 72 6e 65 64 20 62 79 20 74 68 65 20 64 65 66  urned by the def
ff40: 61 75 6c 74 20 56 46 53 27 73 20 78 43 75 72 72  ault VFS's xCurr
ff50: 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 6d 65 74  entTimeInt64 met
ff60: 68 6f 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  hod..*/.static i
ff70: 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
ff80: 20 76 66 73 43 75 72 72 65 6e 74 54 69 6d 65 49   vfsCurrentTimeI
ff90: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20 63  nt64(.  void * c
ffa0: 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
ffb0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
ffc0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
ffd0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
ffe0: 6a 76 5b 5d 0a 29 7b 0a 20 20 69 36 34 20 74 3b  jv[].){.  i64 t;
fff0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10000 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
10010 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
10020 28 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20  ( objc!=1 ){.   
10030 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
10040 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
10050 76 2c 20 22 22 29 3b 0a 20 20 20 20 72 65 74 75  v, "");.    retu
10060 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10070 7d 0a 20 20 70 56 66 73 2d 3e 78 43 75 72 72 65  }.  pVfs->xCurre
10080 6e 74 54 69 6d 65 49 6e 74 36 34 28 70 56 66 73  ntTimeInt64(pVfs
10090 2c 20 26 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  , &t);.  Tcl_Set
100a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
100b0 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
100c0 4f 62 6a 28 74 29 29 3b 0a 20 20 72 65 74 75 72  Obj(t));.  retur
100d0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
100e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
100f0 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
10100 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
10110 73 6e 61 70 73 68 6f 74 5f 67 65 74 20 44 42 20  snapshot_get DB 
10120 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74 69 63  DBNAME.*/.static
10130 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
10140 50 49 20 74 65 73 74 5f 73 6e 61 70 73 68 6f 74  PI test_snapshot
10150 5f 67 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _get(.  void * c
10160 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10170 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10180 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10190 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
101a0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72 63  jv[].){.  int rc
101b0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
101c0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a  .  char *zName;.
101d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68    sqlite3_snapsh
101e0 6f 74 20 2a 70 53 6e 61 70 73 68 6f 74 20 3d 20  ot *pSnapshot = 
101f0 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  0;..  if( objc!=
10200 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
10210 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
10220 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44  , 1, objv, "DB D
10230 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  BNAME");.    ret
10240 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10250 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
10260 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
10270 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10280 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
10290 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
102a0 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74   zName = Tcl_Get
102b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
102c0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
102d0 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 28 64 62  _snapshot_get(db
102e0 2c 20 7a 4e 61 6d 65 2c 20 26 70 53 6e 61 70 73  , zName, &pSnaps
102f0 68 6f 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  hot);.  if( rc!=
10300 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10310 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10320 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10330 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74  wStringObj(sqlit
10340 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d  e3ErrName(rc), -
10350 31 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  1));.    return 
10360 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
10370 73 65 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75  se{.    char zBu
10380 66 5b 31 30 30 5d 3b 0a 20 20 20 20 69 66 28 20  f[100];.    if( 
10390 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
103a0 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
103b0 2c 20 7a 42 75 66 2c 20 70 53 6e 61 70 73 68 6f  , zBuf, pSnapsho
103c0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
103d0 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 53  ERROR;.    Tcl_S
103e0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
103f0 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  rp, Tcl_NewStrin
10400 67 4f 62 6a 28 7a 42 75 66 2c 20 2d 31 29 29 3b  gObj(zBuf, -1));
10410 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
10420 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  L_OK;.}.#endif /
10430 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
10440 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66  SNAPSHOT */..#if
10450 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
10460 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a  E_SNAPSHOT./*.**
10470 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
10480 73 6e 61 70 73 68 6f 74 5f 72 65 63 6f 76 65 72  snapshot_recover
10490 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74   DB DBNAME.*/.st
104a0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
104b0 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70  TCLAPI test_snap
104c0 73 68 6f 74 5f 72 65 63 6f 76 65 72 28 0a 20 20  shot_recover(.  
104d0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
104e0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
104f0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10500 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10510 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10520 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
10530 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
10540 2a 7a 4e 61 6d 65 3b 0a 0a 20 20 69 66 28 20 6f  *zName;..  if( o
10550 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
10560 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
10570 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
10580 22 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20  "DB DBNAME");.  
10590 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
105a0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
105b0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
105c0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
105d0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
105e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
105f0 4f 52 3b 0a 20 20 7a 4e 61 6d 65 20 3d 20 54 63  OR;.  zName = Tc
10600 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
10610 5b 32 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  [2]);..  rc = sq
10620 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72  lite3_snapshot_r
10630 65 63 6f 76 65 72 28 64 62 2c 20 7a 4e 61 6d 65  ecover(db, zName
10640 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
10650 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63  ITE_OK ){.    Tc
10660 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
10670 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
10680 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45  ringObj(sqlite3E
10690 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29  rrName(rc), -1))
106a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
106b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b  _ERROR;.  }else{
106c0 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
106d0 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
106e0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
106f0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
10700 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41  QLITE_ENABLE_SNA
10710 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66  PSHOT */..#ifdef
10720 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
10730 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73  NAPSHOT./*.** Us
10740 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61  age: sqlite3_sna
10750 70 73 68 6f 74 5f 6f 70 65 6e 20 44 42 20 44 42  pshot_open DB DB
10760 4e 41 4d 45 20 53 4e 41 50 53 48 4f 54 0a 2a 2f  NAME SNAPSHOT.*/
10770 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
10780 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
10790 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 28 0a 20 20  napshot_open(.  
107a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
107b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
107c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
107d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
107e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
107f0 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
10800 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
10810 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  *zName;.  sqlite
10820 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70 53 6e 61  3_snapshot *pSna
10830 70 73 68 6f 74 3b 0a 0a 20 20 69 66 28 20 6f 62  pshot;..  if( ob
10840 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
10850 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
10860 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
10870 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53 48  DB DBNAME SNAPSH
10880 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  OT");.    return
10890 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
108a0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
108b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
108c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
108d0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
108e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e   TCL_ERROR;.  zN
108f0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
10900 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
10910 70 53 6e 61 70 73 68 6f 74 20 3d 20 28 73 71 6c  pSnapshot = (sql
10920 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73  ite3_snapshot*)s
10930 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f  qlite3TestTextTo
10940 50 74 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e  Ptr(Tcl_GetStrin
10950 67 28 6f 62 6a 76 5b 33 5d 29 29 3b 0a 0a 20 20  g(objv[3]));..  
10960 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61  rc = sqlite3_sna
10970 70 73 68 6f 74 5f 6f 70 65 6e 28 64 62 2c 20 7a  pshot_open(db, z
10980 4e 61 6d 65 2c 20 70 53 6e 61 70 73 68 6f 74 29  Name, pSnapshot)
10990 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
109a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
109b0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
109c0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
109d0 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72  ingObj(sqlite3Er
109e0 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b  rName(rc), -1));
109f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
10a00 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
10a10 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65  urn TCL_OK;.}.#e
10a20 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 45  ndif /* SQLITE_E
10a30 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54 20 2a  NABLE_SNAPSHOT *
10a40 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
10a50 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48 4f 54  _ENABLE_SNAPSHOT
10a60 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
10a70 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66  lite3_snapshot_f
10a80 72 65 65 20 53 4e 41 50 53 48 4f 54 0a 2a 2f 0a  ree SNAPSHOT.*/.
10a90 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
10aa0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e  E_TCLAPI test_sn
10ab0 61 70 73 68 6f 74 5f 66 72 65 65 28 0a 20 20 76  apshot_free(.  v
10ac0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
10ad0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
10ae0 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
10af0 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
10b00 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
10b10 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
10b20 74 20 2a 70 53 6e 61 70 73 68 6f 74 3b 0a 20 20  t *pSnapshot;.  
10b30 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
10b40 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
10b50 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
10b60 62 6a 76 2c 20 22 53 4e 41 50 53 48 4f 54 22 29  bjv, "SNAPSHOT")
10b70 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10b80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 53  _ERROR;.  }.  pS
10b90 6e 61 70 73 68 6f 74 20 3d 20 28 73 71 6c 69 74  napshot = (sqlit
10ba0 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c  e3_snapshot*)sql
10bb0 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50 74  ite3TestTextToPt
10bc0 72 28 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  r(Tcl_GetString(
10bd0 6f 62 6a 76 5b 31 5d 29 29 3b 0a 20 20 73 71 6c  objv[1]));.  sql
10be0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
10bf0 65 65 28 70 53 6e 61 70 73 68 6f 74 29 3b 0a 20  ee(pSnapshot);. 
10c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
10c10 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
10c20 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
10c30 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OT */..#ifdef SQ
10c40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
10c50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  SHOT./*.** Usage
10c60 3a 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68  : sqlite3_snapsh
10c70 6f 74 5f 63 6d 70 20 53 4e 41 50 53 48 4f 54 31  ot_cmp SNAPSHOT1
10c80 20 53 4e 41 50 53 48 4f 54 32 0a 2a 2f 0a 73 74   SNAPSHOT2.*/.st
10c90 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
10ca0 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e 61 70  TCLAPI test_snap
10cb0 73 68 6f 74 5f 63 6d 70 28 0a 20 20 76 6f 69 64  shot_cmp(.  void
10cc0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
10cd0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
10ce0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
10cf0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
10d00 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e  T objv[].){.  in
10d10 74 20 72 65 73 3b 0a 20 20 73 71 6c 69 74 65 33  t res;.  sqlite3
10d20 5f 73 6e 61 70 73 68 6f 74 20 2a 70 31 3b 0a 20  _snapshot *p1;. 
10d30 20 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f   sqlite3_snapsho
10d40 74 20 2a 70 32 3b 0a 20 20 69 66 28 20 6f 62 6a  t *p2;.  if( obj
10d50 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
10d60 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
10d70 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
10d80 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48 4f  NAPSHOT1 SNAPSHO
10d90 54 32 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  T2");.    return
10da0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
10db0 20 20 70 31 20 3d 20 28 73 71 6c 69 74 65 33 5f    p1 = (sqlite3_
10dc0 73 6e 61 70 73 68 6f 74 2a 29 73 71 6c 69 74 65  snapshot*)sqlite
10dd0 33 54 65 73 74 54 65 78 74 54 6f 50 74 72 28 54  3TestTextToPtr(T
10de0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
10df0 76 5b 31 5d 29 29 3b 0a 20 20 70 32 20 3d 20 28  v[1]));.  p2 = (
10e00 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
10e10 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65 78  *)sqlite3TestTex
10e20 74 54 6f 50 74 72 28 54 63 6c 5f 47 65 74 53 74  tToPtr(Tcl_GetSt
10e30 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 3b 0a  ring(objv[2]));.
10e40 20 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 5f    res = sqlite3_
10e50 73 6e 61 70 73 68 6f 74 5f 63 6d 70 28 70 31 2c  snapshot_cmp(p1,
10e60 20 70 32 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f   p2);.  Tcl_SetO
10e70 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10e80 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72   Tcl_NewIntObj(r
10e90 65 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  es));.  return T
10ea0 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  CL_OK;.}.#endif 
10eb0 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  /* SQLITE_ENABLE
10ec0 5f 53 4e 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69  _SNAPSHOT */..#i
10ed0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
10ee0 4c 45 5f 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a  LE_SNAPSHOT./*.*
10ef0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
10f00 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74 5f 62 6c  _snapshot_get_bl
10f10 6f 62 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a  ob DB DBNAME.*/.
10f20 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
10f30 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73 6e  E_TCLAPI test_sn
10f40 61 70 73 68 6f 74 5f 67 65 74 5f 62 6c 6f 62 28  apshot_get_blob(
10f50 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
10f60 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
10f70 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
10f80 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
10f90 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
10fa0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
10fb0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68  qlite3 *db;.  ch
10fc0 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 73 71 6c  ar *zName;.  sql
10fd0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 20 2a 70  ite3_snapshot *p
10fe0 53 6e 61 70 73 68 6f 74 20 3d 20 30 3b 0a 0a 20  Snapshot = 0;.. 
10ff0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
11000 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
11010 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
11020 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
11030 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
11040 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
11050 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
11060 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
11070 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
11080 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
11090 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4e 61 6d  CL_ERROR;.  zNam
110a0 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  e = Tcl_GetStrin
110b0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 72  g(objv[2]);..  r
110c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 6e 61 70  c = sqlite3_snap
110d0 73 68 6f 74 5f 67 65 74 28 64 62 2c 20 7a 4e 61  shot_get(db, zNa
110e0 6d 65 2c 20 26 70 53 6e 61 70 73 68 6f 74 29 3b  me, &pSnapshot);
110f0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
11100 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
11110 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
11120 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
11130 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45 72 72  ngObj(sqlite3Err
11140 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29 3b 0a  Name(rc), -1));.
11150 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
11160 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  RROR;.  }else{. 
11170 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
11180 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20  ult(interp, .   
11190 20 20 20 20 20 54 63 6c 5f 4e 65 77 42 79 74 65       Tcl_NewByte
111a0 41 72 72 61 79 4f 62 6a 28 28 75 6e 73 69 67 6e  ArrayObj((unsign
111b0 65 64 20 63 68 61 72 2a 29 70 53 6e 61 70 73 68  ed char*)pSnapsh
111c0 6f 74 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74  ot, sizeof(sqlit
111d0 65 33 5f 73 6e 61 70 73 68 6f 74 29 29 0a 20 20  e3_snapshot)).  
111e0 20 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33    );.    sqlite3
111f0 5f 73 6e 61 70 73 68 6f 74 5f 66 72 65 65 28 70  _snapshot_free(p
11200 53 6e 61 70 73 68 6f 74 29 3b 0a 20 20 7d 0a 20  Snapshot);.  }. 
11210 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
11220 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
11230 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50 53 48  TE_ENABLE_SNAPSH
11240 4f 54 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  OT */..#ifdef SQ
11250 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
11260 53 48 4f 54 0a 20 20 2f 2a 0a 20 20 2a 2a 20 55  SHOT.  /*.  ** U
11270 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
11280 61 70 73 68 6f 74 5f 6f 70 65 6e 5f 62 6c 6f 62  apshot_open_blob
11290 20 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53   DB DBNAME SNAPS
112a0 48 4f 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  HOT.*/.static in
112b0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
112c0 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  test_snapshot_op
112d0 65 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20  en_blob(.  void 
112e0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
112f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
11300 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
11310 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
11320 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74   objv[].){.  int
11330 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   rc;.  sqlite3 *
11340 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d  db;.  char *zNam
11350 65 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  e;.  unsigned ch
11360 61 72 20 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74  ar *pBlob;.  int
11370 20 6e 42 6c 6f 62 3b 0a 0a 20 20 69 66 28 20 6f   nBlob;..  if( o
11380 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
11390 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
113a0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
113b0 22 44 42 20 44 42 4e 41 4d 45 20 53 4e 41 50 53  "DB DBNAME SNAPS
113c0 48 4f 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  HOT");.    retur
113d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
113e0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
113f0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
11400 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
11410 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
11420 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
11430 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Name = Tcl_GetSt
11440 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
11450 20 70 42 6c 6f 62 20 3d 20 54 63 6c 5f 47 65 74   pBlob = Tcl_Get
11460 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
11470 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 42 6c 6f 62  (objv[3], &nBlob
11480 29 3b 0a 20 20 69 66 28 20 6e 42 6c 6f 62 21 3d  );.  if( nBlob!=
11490 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 5f 73  sizeof(sqlite3_s
114a0 6e 61 70 73 68 6f 74 29 20 29 7b 0a 20 20 20 20  napshot) ){.    
114b0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
114c0 28 69 6e 74 65 72 70 2c 20 22 62 61 64 20 53 4e  (interp, "bad SN
114d0 41 50 53 48 4f 54 22 2c 20 30 29 3b 0a 20 20 20  APSHOT", 0);.   
114e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
114f0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
11500 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f  lite3_snapshot_o
11510 70 65 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28  pen(db, zName, (
11520 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
11530 2a 29 70 42 6c 6f 62 29 3b 0a 20 20 69 66 28 20  *)pBlob);.  if( 
11540 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11550 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
11560 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
11570 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73  l_NewStringObj(s
11580 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
11590 29 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74  ), -1));.    ret
115a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
115b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
115c0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
115d0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
115e0 41 50 53 48 4f 54 20 2a 2f 0a 0a 23 69 66 64 65  APSHOT */..#ifde
115f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
11600 53 4e 41 50 53 48 4f 54 0a 2f 2a 0a 2a 2a 20 55  SNAPSHOT./*.** U
11610 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 6e  sage: sqlite3_sn
11620 61 70 73 68 6f 74 5f 63 6d 70 5f 62 6c 6f 62 20  apshot_cmp_blob 
11630 53 4e 41 50 53 48 4f 54 31 20 53 4e 41 50 53 48  SNAPSHOT1 SNAPSH
11640 4f 54 32 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OT2.*/.static in
11650 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
11660 74 65 73 74 5f 73 6e 61 70 73 68 6f 74 5f 63 6d  test_snapshot_cm
11670 70 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  p_blob(.  void *
11680 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
11690 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
116a0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
116b0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
116c0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
116d0 72 65 73 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  res;.  unsigned 
116e0 63 68 61 72 20 2a 70 31 3b 0a 20 20 75 6e 73 69  char *p1;.  unsi
116f0 67 6e 65 64 20 63 68 61 72 20 2a 70 32 3b 0a 20  gned char *p2;. 
11700 20 69 6e 74 20 6e 31 3b 0a 20 20 69 6e 74 20 6e   int n1;.  int n
11710 32 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  2;..  if( objc!=
11720 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
11730 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
11740 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 4e 41 50  , 1, objv, "SNAP
11750 53 48 4f 54 31 20 53 4e 41 50 53 48 4f 54 32 22  SHOT1 SNAPSHOT2"
11760 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
11770 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
11780 70 31 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65  p1 = Tcl_GetByte
11790 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
117a0 76 5b 31 5d 2c 20 26 6e 31 29 3b 0a 20 20 70 32  v[1], &n1);.  p2
117b0 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
117c0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
117d0 32 5d 2c 20 26 6e 32 29 3b 0a 0a 20 20 69 66 28  2], &n2);..  if(
117e0 20 6e 31 21 3d 73 69 7a 65 6f 66 28 73 71 6c 69   n1!=sizeof(sqli
117f0 74 65 33 5f 73 6e 61 70 73 68 6f 74 29 20 7c 7c  te3_snapshot) ||
11800 20 6e 31 21 3d 6e 32 20 29 7b 0a 20 20 20 20 54   n1!=n2 ){.    T
11810 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
11820 69 6e 74 65 72 70 2c 20 22 62 61 64 20 53 4e 41  interp, "bad SNA
11830 50 53 48 4f 54 22 2c 20 30 29 3b 0a 20 20 20 20  PSHOT", 0);.    
11840 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11850 3b 0a 20 20 7d 0a 0a 20 20 72 65 73 20 3d 20 73  ;.  }..  res = s
11860 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f  qlite3_snapshot_
11870 63 6d 70 28 28 73 71 6c 69 74 65 33 5f 73 6e 61  cmp((sqlite3_sna
11880 70 73 68 6f 74 2a 29 70 31 2c 20 28 73 71 6c 69  pshot*)p1, (sqli
11890 74 65 33 5f 73 6e 61 70 73 68 6f 74 2a 29 70 32  te3_snapshot*)p2
118a0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
118b0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
118c0 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65 73 29  l_NewIntObj(res)
118d0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
118e0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
118f0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e  SQLITE_ENABLE_SN
11900 41 50 53 48 4f 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  APSHOT */../*.**
11910 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
11920 64 65 6c 65 74 65 5f 64 61 74 61 62 61 73 65 20  delete_database 
11930 46 49 4c 45 4e 41 4d 45 0a 2a 2f 0a 69 6e 74 20  FILENAME.*/.int 
11940 73 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64  sqlite3_delete_d
11950 61 74 61 62 61 73 65 28 63 6f 6e 73 74 20 63 68  atabase(const ch
11960 61 72 2a 29 3b 20 20 20 2f 2a 20 69 6e 20 74 65  ar*);   /* in te
11970 73 74 5f 64 65 6c 65 74 65 2e 63 20 2a 2f 0a 73  st_delete.c */.s
11980 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
11990 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 65 6c  _TCLAPI test_del
119a0 65 74 65 5f 64 61 74 61 62 61 73 65 28 0a 20 20  ete_database(.  
119b0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
119c0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
119d0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
119e0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
119f0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
11a00 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
11a10 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20  t char *zFile;. 
11a20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
11a30 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
11a40 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
11a50 6f 62 6a 76 2c 20 22 46 49 4c 45 22 29 3b 0a 20  objv, "FILE");. 
11a60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
11a70 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  ROR;.  }.  zFile
11a80 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
11a90 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
11aa0 6a 76 5b 31 5d 29 3b 0a 20 20 72 63 20 3d 20 73  jv[1]);.  rc = s
11ab0 71 6c 69 74 65 33 5f 64 65 6c 65 74 65 5f 64 61  qlite3_delete_da
11ac0 74 61 62 61 73 65 28 7a 46 69 6c 65 29 3b 0a 0a  tabase(zFile);..
11ad0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
11ae0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
11af0 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
11b00 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
11b10 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
11b20 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
11b30 55 73 61 67 65 3a 20 61 74 6f 6d 69 63 5f 62 61  Usage: atomic_ba
11b40 74 63 68 5f 77 72 69 74 65 20 50 41 54 48 0a 2a  tch_write PATH.*
11b50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
11b60 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
11b70 61 74 6f 6d 69 63 5f 62 61 74 63 68 5f 77 72 69  atomic_batch_wri
11b80 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  te(.  void * cli
11b90 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
11ba0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
11bb0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
11bc0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
11bd0 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 46  [].){.  char *zF
11be0 69 6c 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ile = 0;        
11bf0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 74 68 20          /* Path 
11c00 74 6f 20 66 69 6c 65 20 74 6f 20 74 65 73 74 20  to file to test 
11c10 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
11c20 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
11c30 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
11c40 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 73 71 6c   handle */.  sql
11c50 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 20 3d  ite3_file *pFd =
11c60 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
11c70 53 51 4c 69 74 65 20 66 64 20 6f 70 65 6e 20 6f  SQLite fd open o
11c80 6e 20 7a 46 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  n zFile */.  int
11c90 20 62 52 65 73 20 3d 20 30 3b 20 20 20 20 20 20   bRes = 0;      
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11cb0 49 6e 74 65 67 65 72 20 72 65 73 75 6c 74 20 6f  Integer result o
11cc0 66 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  f this command *
11cd0 2f 0a 20 20 69 6e 74 20 64 63 20 3d 20 30 3b 20  /.  int dc = 0; 
11ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11cf0 20 20 20 20 2f 2a 20 44 65 76 69 63 65 2d 63 68      /* Device-ch
11d00 61 72 61 63 74 65 72 69 73 74 69 63 73 20 6d 61  aracteristics ma
11d10 73 6b 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  sk */.  int rc; 
11d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d30 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74          /* sqlit
11d40 65 33 5f 6f 70 65 6e 28 29 20 72 65 74 75 72 6e  e3_open() return
11d50 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20   code */..  if( 
11d60 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
11d70 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
11d80 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
11d90 20 22 50 41 54 48 22 29 3b 0a 20 20 20 20 72 65   "PATH");.    re
11da0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
11db0 20 20 7d 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63    }.  zFile = Tc
11dc0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
11dd0 5b 31 5d 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  [1]);..  rc = sq
11de0 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65  lite3_open(zFile
11df0 2c 20 26 64 62 29 3b 0a 20 20 69 66 28 20 72 63  , &db);.  if( rc
11e00 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
11e10 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
11e20 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
11e30 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
11e40 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
11e50 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 72  close(db);.    r
11e60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
11e70 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
11e80 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
11e90 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 53 51  l(db, "main", SQ
11ea0 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f  LITE_FCNTL_FILE_
11eb0 50 4f 49 4e 54 45 52 2c 20 28 76 6f 69 64 2a 29  POINTER, (void*)
11ec0 26 70 46 64 29 3b 0a 20 20 64 63 20 3d 20 70 46  &pFd);.  dc = pF
11ed0 64 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 44 65  d->pMethods->xDe
11ee0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
11ef0 69 63 73 28 70 46 64 29 3b 0a 20 20 69 66 28 20  ics(pFd);.  if( 
11f00 64 63 20 26 20 53 51 4c 49 54 45 5f 49 4f 43 41  dc & SQLITE_IOCA
11f10 50 5f 42 41 54 43 48 5f 41 54 4f 4d 49 43 20 29  P_BATCH_ATOMIC )
11f20 7b 0a 20 20 20 20 62 52 65 73 20 3d 20 31 3b 0a  {.    bRes = 1;.
11f30 20 20 7d 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62    }..  Tcl_SetOb
11f40 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
11f50 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 62 52  Tcl_NewIntObj(bR
11f60 65 73 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  es));.  sqlite3_
11f70 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 72 65 74  close(db);.  ret
11f80 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
11f90 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
11fa0 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 20 20  ite3_next_stmt  
11fb0 44 42 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52  DB  STMT.**.** R
11fc0 65 74 75 72 6e 20 74 68 65 20 6e 65 78 74 20 73  eturn the next s
11fd0 74 61 74 6d 65 6e 74 20 69 6e 20 73 65 71 75 65  tatment in seque
11fe0 6e 63 65 20 61 66 74 65 72 20 53 54 4d 54 2e 0a  nce after STMT..
11ff0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
12000 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
12010 5f 6e 65 78 74 5f 73 74 6d 74 28 0a 20 20 76 6f  _next_stmt(.  vo
12020 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
12030 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
12040 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
12050 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
12060 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
12070 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
12080 74 6d 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  tmt;.  sqlite3 *
12090 64 62 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  db = 0;.  char z
120a0 42 75 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20  Buf[50];..  if( 
120b0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
120c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
120d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
120e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
120f0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
12100 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12110 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
12120 22 20 44 42 20 53 54 4d 54 22 2c 20 30 29 3b 0a  " DB STMT", 0);.
12130 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
12140 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
12150 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
12160 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
12170 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
12180 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
12190 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74  ERROR;.  if( get
121a0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
121b0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
121c0 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74  g(objv[2]), &pSt
121d0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
121e0 5f 45 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74 20  _ERROR;.  pStmt 
121f0 3d 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73  = sqlite3_next_s
12200 74 6d 74 28 64 62 2c 20 70 53 74 6d 74 29 3b 0a  tmt(db, pStmt);.
12210 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
12220 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65     if( sqlite3Te
12230 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
12240 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70  (interp, zBuf, p
12250 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
12260 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63  CL_ERROR;.    Tc
12270 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
12280 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
12290 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
122a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
122b0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73  sage:  sqlite3_s
122c0 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53 54  tmt_readonly  ST
122d0 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
122e0 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20  true if STMT is 
122f0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f  a NULL pointer o
12300 72 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  r a pointer to a
12310 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68   statement.** th
12320 61 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  at is guaranteed
12330 20 74 6f 20 6c 65 61 76 65 20 74 68 65 20 64 61   to leave the da
12340 74 61 62 61 73 65 20 75 6e 6d 6f 64 69 66 69 65  tabase unmodifie
12350 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
12360 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
12370 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  est_stmt_readonl
12380 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
12390 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
123a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
123b0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
123c0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
123d0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
123e0 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
123f0 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
12400 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
12410 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12420 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
12430 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
12440 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
12450 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
12460 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
12470 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
12480 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12490 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
124a0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
124b0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
124c0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
124d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
124e0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
124f0 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  ite3_stmt_readon
12500 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ly(pStmt);.  Tcl
12510 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
12520 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
12530 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20  leanObj(rc));.  
12540 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
12550 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
12560 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
12570 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65  y  STMT.**.** Re
12580 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d  turn true if STM
12590 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  T is a non-NULL 
125a0 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
125b0 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 68  tement.** that h
125c0 61 73 20 62 65 65 6e 20 73 74 65 70 70 65 64 20  as been stepped 
125d0 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d 70 6c  but not to compl
125e0 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  etion..*/.static
125f0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
12600 50 49 20 74 65 73 74 5f 73 74 6d 74 5f 62 75 73  PI test_stmt_bus
12610 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
12620 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
12630 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
12640 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
12650 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
12660 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
12670 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
12680 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
12690 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
126a0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
126b0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
126c0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
126d0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
126e0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
126f0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
12700 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
12710 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12720 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
12730 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
12740 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
12750 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
12760 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12770 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
12780 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 28 70  ite3_stmt_busy(p
12790 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
127a0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
127b0 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e  , Tcl_NewBoolean
127c0 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75  Obj(rc));.  retu
127d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
127e0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 75 73 65 73  .** Usage:  uses
127f0 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 20 53  _stmt_journal  S
12800 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
12810 20 74 72 75 65 20 69 66 20 53 54 4d 54 20 75 73   true if STMT us
12820 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6a  es a statement j
12830 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
12840 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
12850 41 50 49 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f  API uses_stmt_jo
12860 75 72 6e 61 6c 28 0a 20 20 76 6f 69 64 20 2a 20  urnal(.  void * 
12870 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
12880 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
12890 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
128a0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
128b0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
128c0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
128d0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
128e0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
128f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
12900 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
12910 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
12920 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
12930 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
12940 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20  ], 0), " STMT", 
12950 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
12960 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
12970 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
12980 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
12990 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
129a0 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
129b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
129c0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72    sqlite3_stmt_r
129d0 65 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a  eadonly(pStmt);.
129e0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
129f0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
12a00 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28 28 56  ewBooleanObj(((V
12a10 64 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e 75 73  dbe *)pStmt)->us
12a20 65 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 29 29 3b  esStmtJournal));
12a30 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
12a40 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
12a50 65 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  e:  sqlite3_rese
12a60 74 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  t  STMT .**.** R
12a70 65 73 65 74 20 61 20 73 74 61 74 65 6d 65 6e 74  eset a statement
12a80 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
12a90 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
12aa0 4c 41 50 49 20 74 65 73 74 5f 72 65 73 65 74 28  LAPI test_reset(
12ab0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
12ac0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
12ad0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
12ae0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
12af0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
12b00 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
12b10 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
12b20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
12b30 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
12b40 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
12b50 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
12b60 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
12b70 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
12b80 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
12b90 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54  jv[0], 0), " <ST
12ba0 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  MT>", 0);.    re
12bb0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12bc0 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
12bd0 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
12be0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
12bf0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
12c00 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
12c10 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
12c20 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
12c30 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74 20  t);.  if( pStmt 
12c40 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  && sqlite3TestEr
12c50 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
12c60 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
12c70 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  c) ){.    return
12c80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
12c90 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
12ca0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
12cb0 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
12cc0 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f 2a   TCL_STATIC);./*
12cd0 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
12ce0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
12cf0 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74 75  R;.  }.*/.  retu
12d00 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
12d10 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
12d20 74 65 33 5f 65 78 70 69 72 65 64 20 53 54 4d 54  te3_expired STMT
12d30 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54   .**.** Return T
12d40 52 55 45 20 69 66 20 61 20 72 65 63 6f 6d 70 69  RUE if a recompi
12d50 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 74  lation of the st
12d60 61 74 65 6d 65 6e 74 20 69 73 20 72 65 63 6f 6d  atement is recom
12d70 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  mended..*/.stati
12d80 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
12d90 41 50 49 20 74 65 73 74 5f 65 78 70 69 72 65 64  API test_expired
12da0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
12db0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
12dc0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
12dd0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
12de0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
12df0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
12e00 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
12e10 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ED.  sqlite3_stm
12e20 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 66 28 20  t *pStmt;.  if( 
12e30 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
12e40 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
12e50 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
12e60 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
12e70 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
12e80 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
12e90 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
12ea0 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20  " <STMT>", 0);. 
12eb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
12ec0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
12ed0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
12ee0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
12ef0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
12f00 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
12f10 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
12f20 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
12f30 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
12f40 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65 33 5f 65  eanObj(sqlite3_e
12f50 78 70 69 72 65 64 28 70 53 74 6d 74 29 29 29 3b  xpired(pStmt)));
12f60 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
12f70 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
12f80 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
12f90 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69  3_transfer_bindi
12fa0 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20 54 4f 53  ngs FROMSTMT TOS
12fb0 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61 6e 73 66  TMT.**.** Transf
12fc0 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e 67 73 20  er all bindings 
12fd0 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54 20 6f 76  from FROMSTMT ov
12fe0 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a 2a 2f 0a  er to TOSTMT.*/.
12ff0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
13000 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 74 72  E_TCLAPI test_tr
13010 61 6e 73 66 65 72 5f 62 69 6e 64 28 0a 20 20 76  ansfer_bind(.  v
13020 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
13030 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
13040 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
13050 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
13060 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
13070 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13080 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20  IT_DEPRECATED.  
13090 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
130a0 74 6d 74 31 2c 20 2a 70 53 74 6d 74 32 3b 0a 20  tmt1, *pStmt2;. 
130b0 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
130c0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
130d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
130e0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
130f0 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
13100 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
13110 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
13120 20 30 29 2c 20 22 20 46 52 4f 4d 2d 53 54 4d 54   0), " FROM-STMT
13130 20 54 4f 2d 53 54 4d 54 22 2c 20 30 29 3b 0a 20   TO-STMT", 0);. 
13140 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13150 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
13160 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
13170 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
13180 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
13190 53 74 6d 74 31 29 29 20 72 65 74 75 72 6e 20 54  Stmt1)) return T
131a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
131b0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
131c0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
131d0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
131e0 70 53 74 6d 74 32 29 29 20 72 65 74 75 72 6e 20  pStmt2)) return 
131f0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
13200 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
13210 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f  terp, .     Tcl_
13220 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65  NewIntObj(sqlite
13230 33 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69  3_transfer_bindi
13240 6e 67 73 28 70 53 74 6d 74 31 2c 70 53 74 6d 74  ngs(pStmt1,pStmt
13250 32 29 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72  2)));.#endif.  r
13260 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
13270 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
13280 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 20 44  qlite3_changes D
13290 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  B.**.** Return t
132a0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
132b0 6e 67 65 73 20 6d 61 64 65 20 74 6f 20 74 68 65  nges made to the
132c0 20 64 61 74 61 62 61 73 65 20 62 79 20 74 68 65   database by the
132d0 20 6c 61 73 74 20 53 51 4c 0a 2a 2a 20 65 78 65   last SQL.** exe
132e0 63 75 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  cution..*/.stati
132f0 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
13300 41 50 49 20 74 65 73 74 5f 63 68 61 6e 67 65 73  API test_changes
13310 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
13320 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
13330 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
13340 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
13350 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
13360 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
13370 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  b;.  if( objc!=2
13380 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
13390 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
133a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
133b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
133c0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
133d0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
133e0 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
133f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13400 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
13410 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
13420 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
13430 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
13440 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13450 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
13460 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
13470 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
13480 63 68 61 6e 67 65 73 28 64 62 29 29 29 3b 0a 20  changes(db)));. 
13490 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
134a0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
134b0 20 74 68 65 20 22 73 74 61 74 69 63 5f 62 69 6e   the "static_bin
134c0 64 5f 76 61 6c 75 65 22 20 74 68 61 74 20 76 61  d_value" that va
134d0 72 69 61 62 6c 65 73 20 61 72 65 20 62 6f 75 6e  riables are boun
134e0 64 20 74 6f 20 77 68 65 6e 0a 2a 2a 20 74 68 65  d to when.** the
134f0 20 46 4c 41 47 20 6f 70 74 69 6f 6e 20 6f 66 20   FLAG option of 
13500 73 71 6c 69 74 65 33 5f 62 69 6e 64 20 69 73 20  sqlite3_bind is 
13510 22 73 74 61 74 69 63 22 0a 2a 2f 0a 73 74 61 74  "static".*/.stat
13520 69 63 20 63 68 61 72 20 2a 73 71 6c 69 74 65 5f  ic char *sqlite_
13530 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
13540 65 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  e = 0;.static in
13550 74 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f  t sqlite_static_
13560 62 69 6e 64 5f 6e 62 79 74 65 20 3d 20 30 3b 0a  bind_nbyte = 0;.
13570 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
13580 71 6c 69 74 65 33 5f 62 69 6e 64 20 20 56 4d 20  qlite3_bind  VM 
13590 20 49 44 58 20 20 56 41 4c 55 45 20 20 46 4c 41   IDX  VALUE  FLA
135a0 47 53 0a 2a 2a 0a 2a 2a 20 53 65 74 73 20 74 68  GS.**.** Sets th
135b0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 49  e value of the I
135c0 44 58 2d 74 68 20 6f 63 63 75 72 72 65 6e 63 65  DX-th occurrence
135d0 20 6f 66 20 22 3f 22 20 69 6e 20 74 68 65 20 6f   of "?" in the o
135e0 72 69 67 69 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73  riginal SQL.** s
135f0 74 72 69 6e 67 2e 20 20 56 41 4c 55 45 20 69 73  tring.  VALUE is
13600 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65 2e 20   the new value. 
13610 20 49 66 20 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c   If FLAGS=="null
13620 22 20 74 68 65 6e 20 56 41 4c 55 45 20 69 73 0a  " then VALUE is.
13630 2a 2a 20 69 67 6e 6f 72 65 64 20 61 6e 64 20 74  ** ignored and t
13640 68 65 20 76 61 6c 75 65 20 69 73 20 73 65 74 20  he value is set 
13650 74 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 46 4c 41  to NULL.  If FLA
13660 47 53 3d 3d 22 73 74 61 74 69 63 22 20 74 68 65  GS=="static" the
13670 6e 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 69  n.** the value i
13680 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c  s set to the val
13690 75 65 20 6f 66 20 61 20 73 74 61 74 69 63 20 76  ue of a static v
136a0 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a  ariable named.**
136b0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f   "sqlite_static_
136c0 62 69 6e 64 5f 76 61 6c 75 65 22 2e 20 20 49 66  bind_value".  If
136d0 20 46 4c 41 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22   FLAGS=="normal"
136e0 20 74 68 65 6e 20 61 20 63 6f 70 79 0a 2a 2a 20   then a copy.** 
136f0 6f 66 20 74 68 65 20 56 41 4c 55 45 20 69 73 20  of the VALUE is 
13700 6d 61 64 65 2e 20 20 49 66 20 46 4c 41 47 53 3d  made.  If FLAGS=
13710 3d 22 62 6c 6f 62 31 30 22 20 74 68 65 6e 20 61  ="blob10" then a
13720 20 56 41 4c 55 45 20 69 73 20 69 67 6e 6f 72 65   VALUE is ignore
13730 64 0a 2a 2a 20 61 6e 20 61 20 31 30 2d 62 79 74  d.** an a 10-byt
13740 65 20 62 6c 6f 62 20 22 61 62 63 5c 30 30 30 78  e blob "abc\000x
13750 79 7a 5c 30 30 30 70 71 22 20 69 73 20 69 6e 73  yz\000pq" is ins
13760 65 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  erted..*/.static
13770 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
13780 50 49 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20  PI test_bind(.  
13790 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
137a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
137b0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
137c0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
137d0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
137e0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
137f0 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
13800 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
13810 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
13820 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
13830 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
13840 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
13850 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
13860 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
13870 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64  int rc;.  int id
13880 78 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35  x;.  if( argc!=5
13890 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
138a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
138b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
138c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
138d0 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
138e0 22 20 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28  " VM IDX VALUE (
138f0 6e 75 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d  null|static|norm
13900 61 6c 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  al)\"", 0);.    
13910 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
13920 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53  ;.  }.  if( getS
13930 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
13940 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74  p, argv[1], &pSt
13950 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
13960 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
13970 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
13980 20 61 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20   argv[2], &idx) 
13990 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
139a0 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
139b0 28 61 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29  (argv[4],"null")
139c0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
139d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
139e0 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20  l(pStmt, idx);. 
139f0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
13a00 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69  p(argv[4],"stati
13a10 63 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  c")==0 ){.    rc
13a20 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
13a30 74 65 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c  text(pStmt, idx,
13a40 20 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62   sqlite_static_b
13a50 69 6e 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30  ind_value, -1, 0
13a60 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
13a70 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73  trcmp(argv[4],"s
13a80 74 61 74 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d  tatic-nbytes")==
13a90 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
13aa0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
13ab0 70 53 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69  pStmt, idx, sqli
13ac0 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76  te_static_bind_v
13ad0 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20  alue,.          
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13af0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
13b00 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f  ite_static_bind_
13b10 6e 62 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c  nbyte, 0);.  }el
13b20 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
13b30 67 76 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d  gv[4],"normal")=
13b40 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
13b50 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
13b60 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67  (pStmt, idx, arg
13b70 76 5b 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  v[3], -1, SQLITE
13b80 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d  _TRANSIENT);.  }
13b90 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
13ba0 61 72 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22  argv[4],"blob10"
13bb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
13bc0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
13bd0 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 22  xt(pStmt, idx, "
13be0 61 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71  abc\000xyz\000pq
13bf0 22 2c 20 31 30 2c 20 53 51 4c 49 54 45 5f 53 54  ", 10, SQLITE_ST
13c00 41 54 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ATIC);.  }else{.
13c10 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
13c20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74  sult(interp, "4t
13c30 68 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c  h argument shoul
13c40 64 20 62 65 20 22 0a 20 20 20 20 20 20 20 20 22  d be ".        "
13c50 5c 22 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74  \"null\" or \"st
13c60 61 74 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d  atic\" or \"norm
13c70 61 6c 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  al\"", 0);.    r
13c80 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
13c90 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
13ca0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
13cb0 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70  terp, StmtToDb(p
13cc0 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74  Stmt), rc) ) ret
13cd0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
13ce0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63   if( rc ){.    c
13cf0 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
13d00 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
13d10 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
13d20 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c 20   zBuf, "(%d) ", 
13d30 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  rc);.    Tcl_App
13d40 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
13d50 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33 45  , zBuf, sqlite3E
13d60 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a 20  rrStr(rc), 0);. 
13d70 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
13d80 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ROR;.  }.  retur
13d90 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  n TCL_OK;.}..#if
13da0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
13db0 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55 73 61  _UTF16./*.** Usa
13dc0 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c  ge: add_test_col
13dd0 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20 3c 75  late <db ptr> <u
13de0 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c  tf8> <utf16le> <
13df0 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54  utf16be>.**.** T
13e00 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
13e10 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 61  used to test tha
13e20 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63 74 73  t SQLite selects
13e30 20 74 68 65 20 63 6f 72 72 65 63 74 20 63 6f 6c   the correct col
13e40 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75 65 6e  lation.** sequen
13e50 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e  ce callback when
13e60 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f   multiple versio
13e70 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e  ns (for differen
13e80 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73  t text encodings
13e90 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62  ).** are availab
13ea0 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e  le..**.** Callin
13eb0 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  g this routine r
13ec0 65 67 69 73 74 65 72 73 20 74 68 65 20 63 6f 6c  egisters the col
13ed0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
13ee0 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 0a 2a  "test_collate".*
13ef0 2a 20 77 69 74 68 20 64 61 74 61 62 61 73 65 20  * with database 
13f00 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54 68 65  handle <db>. The
13f10 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13f20 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73 74 20   must be a list 
13f30 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f 6f 6c  of three.** bool
13f40 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66 20 74  ean values. If t
13f50 68 65 20 66 69 72 73 74 20 69 73 20 74 72 75 65  he first is true
13f60 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f 6e  , then a version
13f70 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   of test_collate
13f80 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65 72 65   is.** registere
13f90 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20  d for UTF-8, if 
13fa0 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74 72  the second is tr
13fb0 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69 73  ue, a version is
13fc0 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 0a   registered for.
13fd0 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20  ** UTF-16le, if 
13fe0 74 68 65 20 74 68 69 72 64 20 69 73 20 74 72 75  the third is tru
13ff0 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20 76 65  e, a UTF-16be ve
14000 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c 61 62  rsion is availab
14010 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75 73 20  le..** Previous 
14020 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65 73 74  versions of test
14030 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64 65 6c  _collate are del
14040 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eted..**.** The 
14050 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
14060 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  ce test_collate 
14070 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 62  is implemented b
14080 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a 2a 2a  y calling the.**
14090 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73   following TCL s
140a0 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  cript:.**.**   "
140b0 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 65 6e  test_collate <en
140c0 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e 22 0a  c> <lhs> <rhs>".
140d0 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73 3e 20  **.** The <lhs> 
140e0 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20 74 68  and <rhs> are th
140f0 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62 65 69  e two values bei
14100 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65 6e 63  ng compared, enc
14110 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  oded in UTF-8..*
14120 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61 72 61  * The <enc> para
14130 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 6e 63  meter is the enc
14140 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63 6f 6c  oding of the col
14150 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  lation function 
14160 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65 20 73  that.** SQLite s
14170 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c 6c 2e  elected to call.
14180 20 54 68 65 20 54 43 4c 20 74 65 73 74 20 73 63   The TCL test sc
14190 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  ript implements 
141a0 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63 6f 6c  the.** "test_col
141b0 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a 0a 2a  late" proc..**.*
141c0 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73  * Note that this
141d0 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72 6b 20   will only work 
141e0 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 72 70 72  with one interpr
141f0 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c 20  eter at a time, 
14200 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72 70  as the.** interp
14210 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65 20   pointer to use 
14220 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67 20  when evaluating 
14230 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20 69  the TCL script i
14240 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 70  s stored in.** p
14250 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72  TestCollateInter
14260 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63 6c  p..*/.static Tcl
14270 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43 6f  _Interp* pTestCo
14280 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74 61  llateInterp;.sta
14290 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
142a0 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f 69  late_func(.  voi
142b0 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20  d *pCtx, .  int 
142c0 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  nA, const void *
142d0 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63 6f  zA,.  int nB, co
142e0 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b 0a  nst void *zB.){.
142f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 20    Tcl_Interp *i 
14300 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e  = pTestCollateIn
14310 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63 69  terp;.  int enci
14320 6e 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f 54  n = SQLITE_PTR_T
14330 4f 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20 20 69  O_INT(pCtx);.  i
14340 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e 3b  nt res;.  int n;
14350 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ..  sqlite3_valu
14360 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f 4f  e *pVal;.  Tcl_O
14370 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d 20  bj *pX;..  pX = 
14380 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
14390 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c  ("test_collate",
143a0 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72   -1);.  Tcl_Incr
143b0 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a 20  RefCount(pX);.. 
143c0 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20 29   switch( encin )
143d0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
143e0 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54 63  E_UTF8:.      Tc
143f0 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
14400 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
14410 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
14420 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20  F-8",-1));.     
14430 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
14440 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3a   SQLITE_UTF16LE:
14450 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f  .      Tcl_ListO
14460 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
14470 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69  i,pX,Tcl_NewStri
14480 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22  ngObj("UTF-16LE"
14490 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72 65  ,-1));.      bre
144a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
144b0 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20 20  ITE_UTF16BE:.   
144c0 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
144d0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58  pendElement(i,pX
144e0 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62  ,Tcl_NewStringOb
144f0 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31 29  j("UTF-16BE",-1)
14500 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
14510 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20      default:.   
14520 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20 20     assert(0);.  
14530 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69  }..  sqlite3Begi
14540 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
14550 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
14560 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
14570 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20 20  if( pVal ){.    
14580 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
14590 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41 2c  tr(pVal, nA, zA,
145a0 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53   encin, SQLITE_S
145b0 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20  TATIC);.    n = 
145c0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
145d0 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54  tes(pVal);.    T
145e0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
145f0 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20  Element(i,pX,.  
14600 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
14610 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
14620 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
14630 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20  (pVal),n));.    
14640 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
14650 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42 2c  tr(pVal, nB, zB,
14660 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f 53   encin, SQLITE_S
14670 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d 20  TATIC);.    n = 
14680 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
14690 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20 54  tes(pVal);.    T
146a0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
146b0 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20 20  Element(i,pX,.  
146c0 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72        Tcl_NewStr
146d0 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71  ingObj((char*)sq
146e0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
146f0 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20 20  (pVal),n));.    
14700 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
14710 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  (pVal);.  }.  sq
14720 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
14730 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f 45  lloc();..  Tcl_E
14740 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c 20  valObjEx(i, pX, 
14750 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
14760 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
14770 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
14780 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65 73  i, Tcl_GetObjRes
14790 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a 20  ult(i), &res);. 
147a0 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 73   return res;.}.s
147b0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
147c0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c  _TCLAPI test_col
147d0 6c 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  late(.  void * c
147e0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
147f0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
14800 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
14810 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
14820 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
14830 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61 6c  3 *db;.  int val
14840 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
14850 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72  e *pVal;.  int r
14860 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
14870 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
14880 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c 6c 61 74  s;.  pTestCollat
14890 65 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  eInterp = interp
148a0 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  ;.  if( getDbPoi
148b0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
148c0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
148d0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
148e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
148f0 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c   if( TCL_OK!=Tcl
14900 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
14910 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
14920 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
14930 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
14940 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
14950 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
14960 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
14970 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a  , SQLITE_UTF8, .
14980 20 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20            (void 
14990 2a 29 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 76  *)SQLITE_UTF8, v
149a0 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f  al?test_collate_
149b0 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66 28 20 72  func:0);.  if( r
149c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
149d0 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
149e0 7a 55 74 66 31 36 3b 0a 20 20 20 20 69 66 28 20  zUtf16;.    if( 
149f0 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42  TCL_OK!=Tcl_GetB
14a00 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
14a10 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
14a20 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  val) ) return TC
14a30 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 72 63 20  L_ERROR;.    rc 
14a40 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
14a50 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
14a60 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
14a70 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a  QLITE_UTF16LE, .
14a80 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
14a90 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36  d *)SQLITE_UTF16
14aa0 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  LE, val?test_col
14ab0 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
14ac0 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
14ad0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
14ae0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14af0 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [4], &val) ) ret
14b00 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
14b10 23 69 66 20 30 0a 20 20 20 20 69 66 28 20 73 71  #if 0.    if( sq
14b20 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69  lite3_iMallocFai
14b30 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  l>0 ){.      sql
14b40 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46 61 69 6c  ite3_iMallocFail
14b50 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ++;.    }.#endif
14b60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
14b70 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
14b80 65 78 29 3b 0a 20 20 20 20 70 56 61 6c 20 3d 20  ex);.    pVal = 
14b90 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
14ba0 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
14bb0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
14bc0 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63 6f 6c 6c  , -1, "test_coll
14bd0 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ate", SQLITE_UTF
14be0 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
14bf0 29 3b 0a 20 20 20 20 7a 55 74 66 31 36 20 3d 20  );.    zUtf16 = 
14c00 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74  sqlite3ValueText
14c10 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54  (pVal, SQLITE_UT
14c20 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 20 20  F16NATIVE);.    
14c30 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
14c40 69 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 72 63  iled ){.      rc
14c50 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
14c60 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
14c70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
14c80 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
14c90 36 28 64 62 2c 20 7a 55 74 66 31 36 2c 20 53 51  6(db, zUtf16, SQ
14ca0 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 0a 20  LITE_UTF16BE, . 
14cb0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 20 2a           (void *
14cc0 29 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c  )SQLITE_UTF16BE,
14cd0 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61 74   val?test_collat
14ce0 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 20 20 7d  e_func:0);.    }
14cf0 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
14d00 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20 20 20  eFree(pVal);.   
14d10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
14d20 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
14d30 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
14d40 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
14d50 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
14d60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14d70 3b 0a 20 20 0a 20 20 69 66 28 20 72 63 21 3d 53  ;.  .  if( rc!=S
14d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14d90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
14da0 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
14db0 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  ErrName(rc), 0);
14dc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
14dd0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
14de0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64  urn TCL_OK;..bad
14df0 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70  _args:.  Tcl_App
14e00 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
14e10 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
14e20 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
14e30 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
14e40 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
14e50 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c  0], 0), " <DB> <
14e60 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20  utf8> <utf16le> 
14e70 3c 75 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a  <utf16be>", 0);.
14e80 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
14e90 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OR;.}../*.** Usa
14ea0 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 75 74 66  ge: add_test_utf
14eb0 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 20 3c 64  16bin_collate <d
14ec0 62 20 70 74 72 3e 0a 2a 2a 0a 2a 2a 20 41 64 64  b ptr>.**.** Add
14ed0 20 61 20 75 74 66 2d 31 36 20 63 6f 6c 6c 61 74   a utf-16 collat
14ee0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d  ion sequence nam
14ef0 65 64 20 22 75 74 66 31 36 62 69 6e 22 20 74 6f  ed "utf16bin" to
14f00 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
14f10 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 63 6f   handle. This co
14f20 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14f30 20 63 6f 6d 70 61 72 65 73 20 61 72 67 75 6d 65   compares argume
14f40 6e 74 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  nts in the same 
14f50 77 61 79 20 61 73 20 74 68 65 0a 2a 2a 20 62 75  way as the.** bu
14f60 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6f 6e  ilt-in collation
14f70 20 22 62 69 6e 61 72 79 22 2e 0a 2a 2f 0a 73 74   "binary"..*/.st
14f80 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75 74  atic int test_ut
14f90 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66  f16bin_collate_f
14fa0 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 43 74  unc(.  void *pCt
14fb0 78 2c 20 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f  x, .  int nA, co
14fc0 6e 73 74 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20  nst void *zA,.  
14fd0 69 6e 74 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f  int nB, const vo
14fe0 69 64 20 2a 7a 42 0a 29 7b 0a 20 20 69 6e 74 20  id *zB.){.  int 
14ff0 6e 43 6d 70 20 3d 20 28 6e 41 3e 6e 42 20 3f 20  nCmp = (nA>nB ? 
15000 6e 42 20 3a 20 6e 41 29 3b 0a 20 20 69 6e 74 20  nB : nA);.  int 
15010 72 65 73 20 3d 20 6d 65 6d 63 6d 70 28 7a 41 2c  res = memcmp(zA,
15020 20 7a 42 2c 20 6e 43 6d 70 29 3b 0a 20 20 69 66   zB, nCmp);.  if
15030 28 20 72 65 73 3d 3d 30 20 29 20 72 65 73 20 3d  ( res==0 ) res =
15040 20 6e 41 20 2d 20 6e 42 3b 0a 20 20 72 65 74 75   nA - nB;.  retu
15050 72 6e 20 72 65 73 3b 0a 7d 0a 73 74 61 74 69 63  rn res;.}.static
15060 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
15070 50 49 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e  PI test_utf16bin
15080 5f 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64  _collate(.  void
15090 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
150a0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
150b0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
150c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
150d0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
150e0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
150f0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
15100 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f 61  !=2 ) goto bad_a
15110 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62  rgs;.  if( getDb
15120 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
15130 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
15140 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
15150 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
15160 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
15170 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
15180 6e 28 64 62 2c 20 22 75 74 66 31 36 62 69 6e 22  n(db, "utf16bin"
15190 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20  , SQLITE_UTF16, 
151a0 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74 5f 75  0, .      test_u
151b0 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65 5f  tf16bin_collate_
151c0 66 75 6e 63 0a 20 20 29 3b 0a 20 20 69 66 28 20  func.  );.  if( 
151d0 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
151e0 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
151f0 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
15200 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
15210 54 43 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67  TCL_OK;..bad_arg
15220 73 3a 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  s:.  Tcl_WrongNu
15230 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
15240 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20   objv, "DB");.  
15250 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15260 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
15270 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6e 65  the collation ne
15280 65 64 65 64 20 63 61 6c 6c 62 61 63 6b 20 69 73  eded callback is
15290 20 69 6e 76 6f 6b 65 64 2c 20 72 65 63 6f 72 64   invoked, record
152a0 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 0a 2a 2a   the name of .**
152b0 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63   the requested c
152c0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
152d0 6e 20 68 65 72 65 2e 20 20 54 68 65 20 72 65 63  n here.  The rec
152e0 6f 72 64 65 64 20 6e 61 6d 65 20 69 73 20 6c 69  orded name is li
152f0 6e 6b 65 64 0a 2a 2a 20 74 6f 20 61 20 54 43 4c  nked.** to a TCL
15300 20 76 61 72 69 61 62 6c 65 20 61 6e 64 20 75 73   variable and us
15310 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
15320 74 68 61 74 20 74 68 65 20 72 65 71 75 65 73 74  that the request
15330 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20  ed collation.** 
15340 6e 61 6d 65 20 69 73 20 63 6f 72 72 65 63 74 2e  name is correct.
15350 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
15360 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
15370 5b 32 30 30 5d 3b 0a 73 74 61 74 69 63 20 63 68  [200];.static ch
15380 61 72 20 2a 70 7a 4e 65 65 64 65 64 43 6f 6c 6c  ar *pzNeededColl
15390 61 74 69 6f 6e 20 3d 20 7a 4e 65 65 64 65 64 43  ation = zNeededC
153a0 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a  ollation;.../*.*
153b0 2a 20 43 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  * Called when a 
153c0 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
153d0 63 65 20 69 73 20 6e 65 65 64 65 64 2e 20 20 52  ce is needed.  R
153e0 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 0a  egistered using.
153f0 2a 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61  ** sqlite3_colla
15400 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 29 2e  tion_needed16().
15410 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15420 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65  test_collate_nee
15430 64 65 64 5f 63 62 28 0a 20 20 76 6f 69 64 20 2a  ded_cb(.  void *
15440 70 43 74 78 2c 20 0a 20 20 73 71 6c 69 74 65 33  pCtx, .  sqlite3
15450 20 2a 64 62 2c 0a 20 20 69 6e 74 20 65 54 65 78   *db,.  int eTex
15460 74 52 65 70 2c 0a 20 20 63 6f 6e 73 74 20 76 6f  tRep,.  const vo
15470 69 64 20 2a 70 4e 61 6d 65 0a 29 7b 0a 20 20 69  id *pName.){.  i
15480 6e 74 20 65 6e 63 20 3d 20 45 4e 43 28 64 62 29  nt enc = ENC(db)
15490 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
154a0 72 20 2a 7a 3b 0a 20 20 66 6f 72 28 7a 20 3d 20  r *z;.  for(z = 
154b0 28 63 68 61 72 2a 29 70 4e 61 6d 65 2c 20 69 3d  (char*)pName, i=
154c0 30 3b 20 2a 7a 20 7c 7c 20 7a 5b 31 5d 3b 20 7a  0; *z || z[1]; z
154d0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a 7a 20  ++){.    if( *z 
154e0 29 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  ) zNeededCollati
154f0 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a 7a 3b 0a 20 20  on[i++] = *z;.  
15500 7d 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61  }.  zNeededColla
15510 74 69 6f 6e 5b 69 5d 20 3d 20 30 3b 0a 20 20 73  tion[i] = 0;.  s
15520 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
15530 6c 6c 61 74 69 6f 6e 28 0a 20 20 20 20 20 20 64  llation(.      d
15540 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65  b, "test_collate
15550 22 2c 20 45 4e 43 28 64 62 29 2c 20 53 51 4c 49  ", ENC(db), SQLI
15560 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 65 6e  TE_INT_TO_PTR(en
15570 63 29 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65  c), test_collate
15580 5f 66 75 6e 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _func);.}../*.**
15590 20 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74   Usage: add_test
155a0 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 20  _collate_needed 
155b0 44 42 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  DB.*/.static int
155c0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
155d0 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64  est_collate_need
155e0 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ed(.  void * cli
155f0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
15600 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
15610 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
15620 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
15630 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
15640 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
15650 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 20    if( objc!=2 ) 
15660 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20  goto bad_args;. 
15670 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
15680 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
15690 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
156a0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
156b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
156c0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  = sqlite3_collat
156d0 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 64 62 2c  ion_needed16(db,
156e0 20 30 2c 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65   0, test_collate
156f0 5f 6e 65 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a  _needed_cb);.  z
15700 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
15710 30 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 71  0] = 0;.  if( sq
15720 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
15730 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
15740 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15750 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
15760 4c 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a  L_OK;..bad_args:
15770 0a 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41  .  Tcl_WrongNumA
15780 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
15790 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 72 65  bjv, "DB");.  re
157a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
157b0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
157c0 20 20 20 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74     add_alignment
157d0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73  _test_collations
157e0 20 20 44 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74    DB.**.** Add t
157f0 77 6f 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67  wo new collating
15800 20 73 65 71 75 65 6e 63 65 73 20 74 6f 20 74 68   sequences to th
15810 65 20 64 61 74 61 62 61 73 65 20 44 42 0a 2a 2a  e database DB.**
15820 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f 61 6c  .**     utf16_al
15830 69 67 6e 65 64 0a 2a 2a 20 20 20 20 20 75 74 66  igned.**     utf
15840 31 36 5f 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a  16_unaligned.**.
15850 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e  ** Both collatin
15860 67 20 73 65 71 75 65 6e 63 65 73 20 75 73 65 20  g sequences use 
15870 74 68 65 20 73 61 6d 65 20 73 6f 72 74 20 6f 72  the same sort or
15880 64 65 72 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a  der as BINARY..*
15890 2a 20 54 68 65 20 6f 6e 6c 79 20 64 69 66 66 65  * The only diffe
158a0 72 65 6e 63 65 20 69 73 20 74 68 61 74 20 74 68  rence is that th
158b0 65 20 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 20  e utf16_aligned 
158c0 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71  collating.** seq
158d0 75 65 6e 63 65 20 69 73 20 64 65 63 6c 61 72 65  uence is declare
158e0 64 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  d with the SQLIT
158f0 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20  E_UTF16_ALIGNED 
15900 66 6c 61 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f  flag..** Both co
15910 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
15920 73 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  s increment the 
15930 75 6e 61 6c 69 67 6e 65 64 20 75 74 66 31 36 20  unaligned utf16 
15940 63 6f 75 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65  counter.** whene
15950 76 65 72 20 74 68 65 79 20 73 65 65 20 61 20 73  ver they see a s
15960 74 72 69 6e 67 20 74 68 61 74 20 62 65 67 69 6e  tring that begin
15970 73 20 6f 6e 20 61 6e 20 6f 64 64 20 62 79 74 65  s on an odd byte
15980 20 62 6f 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74   boundary..*/.st
15990 61 74 69 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e  atic int unalign
159a0 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65  ed_string_counte
159b0 72 20 3d 20 30 3b 0a 73 74 61 74 69 63 20 69 6e  r = 0;.static in
159c0 74 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  t alignmentCollF
159d0 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  unc(.  void *Not
159e0 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Used,.  int nKey
159f0 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
15a00 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
15a10 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
15a20 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
15a30 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
15a40 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
15a50 20 6e 4b 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b   nKey2;.  if( nK
15a60 65 79 31 3e 30 20 26 26 20 31 3d 3d 28 31 26 28  ey1>0 && 1==(1&(
15a70 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e  SQLITE_PTR_TO_IN
15a80 54 28 70 4b 65 79 31 29 29 29 20 29 20 75 6e 61  T(pKey1))) ) una
15a90 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f  ligned_string_co
15aa0 75 6e 74 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e  unter++;.  if( n
15ab0 4b 65 79 32 3e 30 20 26 26 20 31 3d 3d 28 31 26  Key2>0 && 1==(1&
15ac0 28 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  (SQLITE_PTR_TO_I
15ad0 4e 54 28 70 4b 65 79 32 29 29 29 20 29 20 75 6e  NT(pKey2))) ) un
15ae0 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63  aligned_string_c
15af0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d  ounter++;.  rc =
15b00 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70   memcmp(pKey1, p
15b10 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20  Key2, n);.  if( 
15b20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  rc==0 ){.    rc 
15b30 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
15b40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
15b50 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 53  ;.}.static int S
15b60 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 61 64 64  QLITE_TCLAPI add
15b70 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
15b80 63 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76 6f  collations(.  vo
15b90 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
15ba0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
15bb0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
15bc0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
15bd0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
15be0 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
15bf0 66 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20 20  f( objc>=2 ){.  
15c00 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
15c10 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
15c20 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
15c30 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
15c40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
15c50 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
15c60 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74  ollation(db, "ut
15c70 66 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c 20  f16_unaligned", 
15c80 53 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20  SQLITE_UTF16, . 
15c90 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d         0, alignm
15ca0 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20  entCollFunc);.  
15cb0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
15cc0 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  _collation(db, "
15cd0 75 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 20  utf16_aligned", 
15ce0 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
15cf0 47 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20 30  GNED, .        0
15d00 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46  , alignmentCollF
15d10 75 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  unc);.  }.  retu
15d20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
15d30 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
15d40 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ed(SQLITE_OMIT_U
15d50 54 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  TF16) */../*.** 
15d60 55 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f  Usage: add_test_
15d70 66 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72  function <db ptr
15d80 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
15d90 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a  e> <utf16be>.**.
15da0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
15db0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
15dc0 20 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c   that SQLite sel
15dd0 65 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74  ects the correct
15de0 20 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f   user.** functio
15df0 6e 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20  n callback when 
15e00 6d 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e  multiple version
15e10 73 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74  s (for different
15e20 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29   text encodings)
15e30 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c  .** are availabl
15e40 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67  e..**.** Calling
15e50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
15e60 67 69 73 74 65 72 73 20 75 70 20 74 6f 20 74 68  gisters up to th
15e70 72 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20  ree versions of 
15e80 74 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  the user functio
15e90 6e 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74  n.** "test_funct
15ea0 69 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62 61  ion" with databa
15eb0 73 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20  se handle <db>. 
15ec0 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61   If the second a
15ed0 72 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72  rgument is.** tr
15ee0 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
15ef0 6f 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74  on of test_funct
15f00 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65  ion is registere
15f10 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20  d for UTF-8, if 
15f20 74 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20  the.** third is 
15f30 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
15f40 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
15f50 72 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74  r UTF-16le, if t
15f60 68 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20  he fourth is.** 
15f70 74 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65  true, a UTF-16be
15f80 20 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69   version is avai
15f90 6c 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73  lable.  Previous
15fa0 20 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20   versions of.** 
15fb0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72  test_function ar
15fc0 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  e deleted..**.**
15fd0 20 54 68 65 20 75 73 65 72 20 66 75 6e 63 74 69   The user functi
15fe0 6f 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  on is implemente
15ff0 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65  d by calling the
16000 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73   following TCL s
16010 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  cript:.**.**   "
16020 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65  test_function <e
16030 6e 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a  nc> <arg>".**.**
16040 20 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20   Where <enc> is 
16050 6f 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54  one of UTF-8, UT
16060 46 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42  F-16LE or UTF16B
16070 45 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20  E, and <arg> is 
16080 74 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72  the.** single ar
16090 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
160a0 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f   the SQL functio
160b0 6e 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  n. The value ret
160c0 75 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  urned by.** the 
160d0 54 43 4c 20 73 63 72 69 70 74 20 69 73 20 75 73  TCL script is us
160e0 65 64 20 61 73 20 74 68 65 20 72 65 74 75 72 6e  ed as the return
160f0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51   value of the SQ
16100 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a  L function. It.*
16110 2a 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 53  * is passed to S
16120 51 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d  QLite using UTF-
16130 31 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38  16BE for a UTF-8
16140 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29   test_function()
16150 2c 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61  , UTF-8.** for a
16160 20 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66   UTF-16LE test_f
16170 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55  unction(), and U
16180 54 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69  TF-16LE for an i
16190 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68  mplementation th
161a0 61 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54  at.** prefers UT
161b0 46 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64  F-16BE..*/.#ifnd
161c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
161d0 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64  TF16.static void
161e0 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
161f0 74 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tf8(.  sqlite3_c
16200 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20  ontext *pCtx, . 
16210 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c   int nArg,.  sql
16220 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
16230 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72  v.){.  Tcl_Inter
16240 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c  p *interp;.  Tcl
16250 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69  _Obj *pX;.  sqli
16260 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
16270 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c  .  interp = (Tcl
16280 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65  _Interp *)sqlite
16290 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78  3_user_data(pCtx
162a0 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65  );.  pX = Tcl_Ne
162b0 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74  wStringObj("test
162c0 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b  _function", -1);
162d0 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
162e0 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c  unt(pX);.  Tcl_L
162f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
16300 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
16310 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
16320 28 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a  ("UTF-8", -1));.
16330 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
16340 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
16350 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63  p, pX, .      Tc
16360 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28  l_NewStringObj((
16370 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
16380 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d  lue_text(argv[0]
16390 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45  ), -1));.  Tcl_E
163a0 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c  valObjEx(interp,
163b0 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44   pX, 0);.  Tcl_D
163c0 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ecrRefCount(pX);
163d0 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
163e0 74 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c  t_text(pCtx, Tcl
163f0 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
16400 28 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51  (interp), -1, SQ
16410 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
16420 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65  .  pVal = sqlite
16430 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20  3ValueNew(0);.  
16440 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53  sqlite3ValueSetS
16450 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c  tr(pVal, -1, Tcl
16460 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74  _GetStringResult
16470 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20  (interp), .     
16480 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
16490 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
164a0 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
164b0 65 78 74 31 36 62 65 28 70 43 74 78 2c 20 73 71  ext16be(pCtx, sq
164c0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
164d0 31 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20 20  16be(pVal),.    
164e0 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41    -1, SQLITE_TRA
164f0 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
16500 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c  e3ValueFree(pVal
16510 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
16520 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
16530 74 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65  tf16le(.  sqlite
16540 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
16550 20 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20   .  int nArg,.  
16560 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
16570 61 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e  argv.){.  Tcl_In
16580 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
16590 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73  Tcl_Obj *pX;.  s
165a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56  qlite3_value *pV
165b0 61 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28  al;.  interp = (
165c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c  Tcl_Interp *)sql
165d0 69 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70  ite3_user_data(p
165e0 43 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c  Ctx);.  pX = Tcl
165f0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74  _NewStringObj("t
16600 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d  est_function", -
16610 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  1);.  Tcl_IncrRe
16620 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63  fCount(pX);.  Tc
16630 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
16640 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
16650 58 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  X, Tcl_NewString
16660 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 20  Obj("UTF-16LE", 
16670 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
16680 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
16690 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20  (interp, pX, .  
166a0 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e      Tcl_NewStrin
166b0 67 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69  gObj((char*)sqli
166c0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
166d0 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20  rgv[0]), -1));. 
166e0 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69   Tcl_EvalObjEx(i
166f0 6e 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20  nterp, pX, 0);. 
16700 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
16710 74 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20  t(pX);.  pVal = 
16720 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
16730 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
16740 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
16750 31 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  1, Tcl_GetString
16760 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20  Result(interp), 
16770 0a 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54  .      SQLITE_UT
16780 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  F8, SQLITE_STATI
16790 43 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  C);.  sqlite3_re
167a0 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 28  sult_text(pCtx,(
167b0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
167c0 6c 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d  lue_text(pVal),-
167d0 31 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  1,SQLITE_TRANSIE
167e0 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61  NT);.  sqlite3Va
167f0 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d  lueFree(pVal);.}
16800 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73  .static void tes
16810 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36  t_function_utf16
16820 62 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  be(.  sqlite3_co
16830 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
16840 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
16850 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
16860 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
16870 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
16880 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
16890 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
168a0 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
168b0 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
168c0 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
168d0 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
168e0 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
168f0 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
16900 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
16910 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
16920 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
16930 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
16940 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
16950 22 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29 29  "UTF-16BE", -1))
16960 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
16970 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
16980 65 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20  erp, pX, .      
16990 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
169a0 28 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  ((char*)sqlite3_
169b0 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
169c0 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  0]), -1));.  Tcl
169d0 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72  _EvalObjEx(inter
169e0 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  p, pX, 0);.  Tcl
169f0 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
16a00 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69  );.  pVal = sqli
16a10 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a  te3ValueNew(0);.
16a20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
16a30 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54  tStr(pVal, -1, T
16a40 63 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75  cl_GetStringResu
16a50 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20  lt(interp), .   
16a60 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
16a70 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
16a80 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
16a90 5f 74 65 78 74 31 36 28 70 43 74 78 2c 20 73 71  _text16(pCtx, sq
16aa0 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
16ab0 31 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20  16le(pVal),.    
16ac0 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41    -1, SQLITE_TRA
16ad0 4e 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74  NSIENT);.  sqlit
16ae0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
16af0 62 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33  be(pCtx, sqlite3
16b00 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28  _value_text16le(
16b10 70 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c  pVal),.      -1,
16b20 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
16b30 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  T);.  sqlite3_re
16b40 73 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43  sult_text16le(pC
16b50 74 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  tx, sqlite3_valu
16b60 65 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29  e_text16le(pVal)
16b70 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49  ,.      -1, SQLI
16b80 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
16b90 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
16ba0 65 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69  e(pVal);.}.#endi
16bb0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
16bc0 5f 55 54 46 31 36 20 2a 2f 0a 73 74 61 74 69 63  _UTF16 */.static
16bd0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
16be0 50 49 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  PI test_function
16bf0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
16c00 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
16c10 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
16c20 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
16c30 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
16c40 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
16c50 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
16c60 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
16c70 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20 6f  nt val;..  if( o
16c80 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61  bjc!=5 ) goto ba
16c90 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65  d_args;.  if( ge
16ca0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
16cb0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
16cc0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
16cd0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16ce0 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f  OR;..  if( TCL_O
16cf0 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
16d00 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
16d10 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20   objv[2], &val) 
16d20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16d30 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
16d40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
16d50 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
16d60 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
16d70 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
16d80 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
16d90 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
16da0 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20 20  _utf8, 0, 0);.  
16db0 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  }.  if( TCL_OK!=
16dc0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
16dd0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16de0 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[3], &val) ) r
16df0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16e00 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20  .  if( val ){.  
16e10 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
16e20 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74  _function(db, "t
16e30 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31  est_function", 1
16e40 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
16e50 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72  , .        inter
16e60 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  p, test_function
16e70 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30 29 3b  _utf16le, 0, 0);
16e80 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f  .  }.  if( TCL_O
16e90 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61  K!=Tcl_GetBoolea
16ea0 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  nFromObj(interp,
16eb0 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20   objv[4], &val) 
16ec0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16ed0 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b  OR;.  if( val ){
16ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65  .    sqlite3_cre
16ef0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c  ate_function(db,
16f00 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22   "test_function"
16f10 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  , 1, SQLITE_UTF1
16f20 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e  6BE, .        in
16f30 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74  terp, test_funct
16f40 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c 20  ion_utf16be, 0, 
16f50 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  0);.  }..  retur
16f60 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61 72  n TCL_OK;.bad_ar
16f70 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  gs:.  Tcl_Append
16f80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
16f90 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
16fa0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
16fb0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
16fc0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
16fd0 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74 66   0), " <DB> <utf
16fe0 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74  8> <utf16le> <ut
16ff0 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65 6e  f16be>", 0);.#en
17000 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
17010 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72 65  IT_UTF16 */.  re
17020 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17030 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
17050 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72 72  test_errstr <err
17060 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65 73   code>.**.** Tes
17070 74 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c 69  t that the engli
17080 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72 69  sh language stri
17090 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20 66  ng equivalents f
170a0 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72 20  or sqlite error 
170b0 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61 6e  codes.** are san
170c0 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72  e. The parameter
170d0 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 72   is an integer r
170e0 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 73  epresenting an s
170f0 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65  qlite error code
17100 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74 20  ..** The result 
17110 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77 6f  is a list of two
17120 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20 73   elements, the s
17130 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61  tring representa
17140 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 65  tion of the.** e
17150 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74 68  rror code and th
17160 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e english langua
17170 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a  ge explanation..
17180 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
17190 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
171a0 5f 65 72 72 73 74 72 28 0a 20 20 76 6f 69 64 20  _errstr(.  void 
171b0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
171c0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
171d0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
171e0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
171f0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61   objv[].){.  cha
17200 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20  r *zCode;.  int 
17210 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31  i;.  if( objc!=1
17220 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
17230 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
17240 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f   1, objv, "<erro
17250 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a  r code>");.  }..
17260 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65    zCode = Tcl_Ge
17270 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
17280 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32  ;.  for(i=0; i<2
17290 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  00; i++){.    if
172a0 28 20 30 3d 3d 73 74 72 63 6d 70 28 74 31 45 72  ( 0==strcmp(t1Er
172b0 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64  rorName(i), zCod
172c0 65 29 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  e) ) break;.  }.
172d0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
172e0 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29  interp, (char *)
172f0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 29  sqlite3ErrStr(i)
17300 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
17310 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
17320 55 73 61 67 65 3a 20 20 20 20 62 72 65 61 6b 70  Usage:    breakp
17330 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  oint.**.** This 
17340 72 6f 75 74 69 6e 65 20 65 78 69 73 74 73 20 66  routine exists f
17350 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d  or one purpose -
17360 20 74 6f 20 70 72 6f 76 69 64 65 20 61 20 70 6c   to provide a pl
17370 61 63 65 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20  ace to put a.** 
17380 62 72 65 61 6b 70 6f 69 6e 74 20 77 69 74 68 20  breakpoint with 
17390 47 44 42 20 74 68 61 74 20 63 61 6e 20 62 65 20  GDB that can be 
173a0 74 72 69 67 67 65 72 65 64 20 75 73 69 6e 67 20  triggered using 
173b0 54 43 4c 20 63 6f 64 65 2e 20 20 54 68 65 20 75  TCL code.  The u
173c0 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 69  se.** for this i
173d0 73 20 77 68 65 6e 20 61 20 70 61 72 74 69 63 75  s when a particu
173e0 6c 61 72 20 74 65 73 74 20 66 61 69 6c 73 20 6f  lar test fails o
173f0 6e 20 28 73 61 79 29 20 74 68 65 20 31 34 38 35  n (say) the 1485
17400 74 68 20 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a  th iteration..**
17410 20 49 6e 20 74 68 65 20 54 43 4c 20 74 65 73 74   In the TCL test
17420 20 73 63 72 69 70 74 2c 20 77 65 20 63 61 6e 20   script, we can 
17430 61 64 64 20 63 6f 64 65 20 6c 69 6b 65 20 74 68  add code like th
17440 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66  is:.**.**     if
17450 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62 72 65 61   {$i==1485} brea
17460 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65  kpoint.**.** The
17470 6e 20 72 75 6e 20 74 65 73 74 66 69 78 74 75 72  n run testfixtur
17480 65 20 69 6e 20 74 68 65 20 64 65 62 75 67 67 65  e in the debugge
17490 72 20 61 6e 64 20 77 61 69 74 20 66 6f 72 20 74  r and wait for t
174a0 68 65 20 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f  he breakpoint to
174b0 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68 65 6e 20  .** fire.  Then 
174c0 61 64 64 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b  additional break
174d0 70 6f 69 6e 74 73 20 63 61 6e 20 62 65 20 73 65  points can be se
174e0 74 20 74 6f 20 74 72 61 63 65 20 64 6f 77 6e 20  t to trace down 
174f0 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74  the bug..*/.stat
17500 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
17510 4c 41 50 49 20 74 65 73 74 5f 62 72 65 61 6b 70  LAPI test_breakp
17520 6f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  oint(.  void *No
17530 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
17540 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
17550 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
17560 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
17570 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
17580 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
17590 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
175a0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
175b0 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
175c0 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
175d0 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
175e0 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
175f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
17600 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
17610 74 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  thing */.}../*.*
17620 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
17630 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
17640 20 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a    STMT IDX N.**.
17650 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69  ** Test the sqli
17660 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f  te3_bind_zeroblo
17670 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  b interface.  ST
17680 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
17690 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49   statement..** I
176a0 44 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20  DX is the index 
176b0 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
176c0 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
176d0 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
176e0 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
176f0 61 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69  a N-byte zero-fi
17700 6c 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65  lled BLOB to the
17710 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
17720 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
17730 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
17740 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f 69  _zeroblob(.  voi
17750 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
17760 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17770 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
17780 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17790 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
177a0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
177b0 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20  mt;.  int idx;. 
177c0 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63   int n;.  int rc
177d0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
177e0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
177f0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
17800 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20   1, objv, "STMT 
17810 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65 74  IDX N");.    ret
17820 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17830 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
17840 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
17850 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17860 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
17870 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17880 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
17890 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
178a0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
178b0 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
178c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
178d0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
178e0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
178f0 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54 43   &n) ) return TC
17900 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
17910 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
17920 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69 64  roblob(pStmt, id
17930 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c  x, n);.  if( sql
17940 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
17950 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
17960 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
17970 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17980 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
17990 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
179a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
179b0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
179c0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
179d0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
179e0 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 20 20 53  nd_zeroblob64  S
179f0 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a 2a 20  TMT IDX N.**.** 
17a00 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
17a10 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 36 34  _bind_zeroblob64
17a20 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
17a30 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
17a40 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44  statement..** ID
17a50 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  X is the index o
17a60 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
17a70 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
17a80 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
17a90 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
17aa0 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c   N-byte zero-fil
17ab0 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  led BLOB to the 
17ac0 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
17ad0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
17ae0 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f  CLAPI test_bind_
17af0 7a 65 72 6f 62 6c 6f 62 36 34 28 0a 20 20 76 6f  zeroblob64(.  vo
17b00 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
17b10 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
17b20 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
17b30 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
17b40 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
17b50 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
17b60 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
17b70 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 6e 3b    Tcl_WideInt n;
17b80 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
17b90 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
17ba0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
17bb0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
17bc0 76 2c 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29  v, "STMT IDX N")
17bd0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
17be0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
17bf0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
17c00 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
17c10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
17c20 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
17c30 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
17c40 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
17c50 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
17c60 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
17c70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
17c80 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69  .  if( Tcl_GetWi
17c90 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  deIntFromObj(int
17ca0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e  erp, objv[3], &n
17cb0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
17cc0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
17cd0 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
17ce0 6c 6f 62 36 34 28 70 53 74 6d 74 2c 20 69 64 78  lob64(pStmt, idx
17cf0 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , n);.  if( sqli
17d00 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
17d10 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
17d20 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
17d30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17d40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17d50 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
17d60 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
17d70 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
17d80 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
17d90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17da0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
17db0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
17dc0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
17dd0 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54  3_bind_int  STMT
17de0 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54   N VALUE.**.** T
17df0 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
17e00 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65 72 66 61  bind_int interfa
17e10 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
17e20 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
17e30 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
17e40 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
17e50 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
17e60 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
17e70 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
17e80 69 6e 64 73 20 61 20 33 32 2d 62 69 74 20 69 6e  inds a 32-bit in
17e90 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
17ea0 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
17eb0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
17ec0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
17ed0 69 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20  ind_int(.  void 
17ee0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
17ef0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
17f00 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
17f10 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
17f20 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
17f30 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
17f40 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
17f50 6e 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  nt value;.  int 
17f60 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
17f70 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
17f80 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
17f90 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
17fa0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
17fb0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
17fc0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
17fd0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
17fe0 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a  T N VALUE", 0);.
17ff0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18000 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
18010 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
18020 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
18030 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
18040 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
18050 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
18060 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
18070 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
18080 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
18090 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
180a0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
180b0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
180c0 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
180d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
180e0 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
180f0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74  te3_bind_int(pSt
18100 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b  mt, idx, value);
18110 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
18120 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
18130 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
18140 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
18150 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
18160 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
18170 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
18180 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
18190 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
181a0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
181b0 20 69 6e 74 61 72 72 61 79 5f 61 64 64 72 20 20   intarray_addr  
181c0 49 4e 54 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52  INT  ....**.** R
181d0 65 74 75 72 6e 20 74 68 65 20 61 64 64 72 65 73  eturn the addres
181e0 73 20 6f 66 20 61 20 43 2d 6c 61 6e 67 75 61 67  s of a C-languag
181f0 65 20 61 72 72 61 79 20 6f 66 20 33 32 2d 62 69  e array of 32-bi
18200 74 20 69 6e 74 65 67 65 72 73 2e 0a 2a 2a 0a 2a  t integers..**.*
18210 2a 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20  * Space to hold 
18220 74 68 65 20 61 72 72 61 79 20 69 73 20 6f 62 74  the array is obt
18230 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ained from mallo
18240 63 28 29 2e 20 20 43 61 6c 6c 20 74 68 69 73 20  c().  Call this 
18250 70 72 6f 63 65 64 75 72 65 20 6f 6e 63 65 0a 2a  procedure once.*
18260 2a 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65  * with no argume
18270 6e 74 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  nts in order to 
18280 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 2e 20  release memory. 
18290 20 45 61 63 68 20 63 61 6c 6c 20 74 6f 20 74 68   Each call to th
182a0 69 73 20 70 72 6f 63 65 64 75 72 65 0a 2a 2a 20  is procedure.** 
182b0 6f 76 65 72 77 72 69 74 65 73 20 74 68 65 20 70  overwrites the p
182c0 72 65 76 69 6f 75 73 20 61 72 72 61 79 2e 0a 2a  revious array..*
182d0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
182e0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
182f0 69 6e 74 61 72 72 61 79 5f 61 64 64 72 28 0a 20  intarray_addr(. 
18300 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
18310 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
18320 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
18330 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
18340 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
18350 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74  .  int i;.  stat
18360 69 63 20 69 6e 74 20 2a 70 20 3d 20 30 3b 0a 0a  ic int *p = 0;..
18370 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
18380 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20 20 69 66  );.  p = 0;.  if
18390 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20  ( objc>1 ){.    
183a0 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  p = sqlite3_mall
183b0 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b 30 5d 29  oc( sizeof(p[0])
183c0 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a 20 20 20  *(objc-1) );.   
183d0 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
183e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
183f0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6f 62 6a    for(i=0; i<obj
18400 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  c-1; i++){.     
18410 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
18420 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
18430 62 6a 76 5b 31 2b 69 5d 2c 20 26 70 5b 69 5d 29  bjv[1+i], &p[i])
18440 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
18450 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20  te3_free(p);.   
18460 20 20 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20       p = 0;.    
18470 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
18480 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20  RROR;.      }.  
18490 20 20 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f    }.  }  .  Tcl_
184a0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
184b0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
184c0 49 6e 74 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f  IntObj((sqlite3_
184d0 69 6e 74 36 34 29 70 29 29 3b 0a 20 20 72 65 74  int64)p));.  ret
184e0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
184f0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 69 6e 74  .** Usage:   int
18500 61 72 72 61 79 5f 61 64 64 72 20 20 49 4e 54 20  array_addr  INT 
18510 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72   ....**.** Retur
18520 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66  n the address of
18530 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72   a C-language ar
18540 72 61 79 20 6f 66 20 33 32 2d 62 69 74 20 69 6e  ray of 32-bit in
18550 74 65 67 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 53 70  tegers..**.** Sp
18560 61 63 65 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ace to hold the 
18570 61 72 72 61 79 20 69 73 20 6f 62 74 61 69 6e 65  array is obtaine
18580 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  d from malloc().
18590 20 20 43 61 6c 6c 20 74 68 69 73 20 70 72 6f 63    Call this proc
185a0 65 64 75 72 65 20 6f 6e 63 65 0a 2a 2a 20 77 69  edure once.** wi
185b0 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20  th no arguments 
185c0 69 6e 20 6f 72 64 65 72 20 74 6f 20 72 65 6c 65  in order to rele
185d0 61 73 65 20 6d 65 6d 6f 72 79 2e 20 20 45 61 63  ase memory.  Eac
185e0 68 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 70  h call to this p
185f0 72 6f 63 65 64 75 72 65 0a 2a 2a 20 6f 76 65 72  rocedure.** over
18600 77 72 69 74 65 73 20 74 68 65 20 70 72 65 76 69  writes the previ
18610 6f 75 73 20 61 72 72 61 79 2e 0a 2a 2f 0a 73 74  ous array..*/.st
18620 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
18630 54 43 4c 41 50 49 20 74 65 73 74 5f 69 6e 74 36  TCLAPI test_int6
18640 34 61 72 72 61 79 5f 61 64 64 72 28 0a 20 20 76  4array_addr(.  v
18650 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
18660 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
18670 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
18680 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
18690 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
186a0 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
186b0 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 2a   sqlite3_int64 *
186c0 70 20 3d 20 30 3b 0a 0a 20 20 73 71 6c 69 74 65  p = 0;..  sqlite
186d0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 70 20 3d  3_free(p);.  p =
186e0 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31   0;.  if( objc>1
186f0 20 29 7b 0a 20 20 20 20 70 20 3d 20 73 71 6c 69   ){.    p = sqli
18700 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  te3_malloc( size
18710 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a 63 2d 31  of(p[0])*(objc-1
18720 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 3d 3d  ) );.    if( p==
18730 30 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  0 ) return TCL_E
18740 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72 28 69 3d  RROR;.    for(i=
18750 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20 69 2b 2b  0; i<objc-1; i++
18760 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 57 69 64  ){.      Tcl_Wid
18770 65 49 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66  eInt v;.      if
18780 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
18790 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
187a0 6f 62 6a 76 5b 31 2b 69 5d 2c 20 26 76 29 20 29  objv[1+i], &v) )
187b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
187c0 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
187d0 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20     p = 0;.      
187e0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
187f0 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
18800 20 20 70 5b 69 5d 20 3d 20 76 3b 0a 20 20 20 20    p[i] = v;.    
18810 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f 53 65  }.  }  .  Tcl_Se
18820 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
18830 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
18840 74 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f 69 6e  tObj((sqlite3_in
18850 74 36 34 29 70 29 29 3b 0a 20 20 72 65 74 75 72  t64)p));.  retur
18860 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
18870 2a 20 55 73 61 67 65 3a 20 20 20 64 6f 75 62 6c  * Usage:   doubl
18880 65 61 72 72 61 79 5f 61 64 64 72 20 20 49 4e 54  earray_addr  INT
18890 20 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75    ....**.** Retu
188a0 72 6e 20 74 68 65 20 61 64 64 72 65 73 73 20 6f  rn the address o
188b0 66 20 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61  f a C-language a
188c0 72 72 61 79 20 6f 66 20 64 6f 75 62 6c 65 73 2e  rray of doubles.
188d0 0a 2a 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20  .**.** Space to 
188e0 68 6f 6c 64 20 74 68 65 20 61 72 72 61 79 20 69  hold the array i
188f0 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
18900 6d 61 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20  malloc().  Call 
18910 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f  this procedure o
18920 6e 63 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61  nce.** with no a
18930 72 67 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65  rguments in orde
18940 72 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d  r to release mem
18950 6f 72 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20  ory.  Each call 
18960 74 6f 20 74 68 69 73 20 70 72 6f 63 65 64 75 72  to this procedur
18970 65 0a 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20  e.** overwrites 
18980 74 68 65 20 70 72 65 76 69 6f 75 73 20 61 72 72  the previous arr
18990 61 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ay..*/.static in
189a0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
189b0 74 65 73 74 5f 64 6f 75 62 6c 65 61 72 72 61 79  test_doublearray
189c0 5f 61 64 64 72 28 0a 20 20 76 6f 69 64 20 2a 20  _addr(.  void * 
189d0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
189e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
189f0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18a00 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18a10 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69  bjv[].){.  int i
18a20 3b 0a 20 20 73 74 61 74 69 63 20 64 6f 75 62 6c  ;.  static doubl
18a30 65 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 73 71 6c  e *p = 0;..  sql
18a40 69 74 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20  ite3_free(p);.  
18a50 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 6f 62 6a  p = 0;.  if( obj
18a60 63 3e 31 20 29 7b 0a 20 20 20 20 70 20 3d 20 73  c>1 ){.    p = s
18a70 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 73  qlite3_malloc( s
18a80 69 7a 65 6f 66 28 70 5b 30 5d 29 2a 28 6f 62 6a  izeof(p[0])*(obj
18a90 63 2d 31 29 20 29 3b 0a 20 20 20 20 69 66 28 20  c-1) );.    if( 
18aa0 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 54 43  p==0 ) return TC
18ab0 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 66 6f 72  L_ERROR;.    for
18ac0 28 69 3d 30 3b 20 69 3c 6f 62 6a 63 2d 31 3b 20  (i=0; i<objc-1; 
18ad0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
18ae0 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f  Tcl_GetDoubleFro
18af0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
18b00 76 5b 31 2b 69 5d 2c 20 26 70 5b 69 5d 29 20 29  v[1+i], &p[i]) )
18b10 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
18b20 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20 20  3_free(p);.     
18b30 20 20 20 70 20 3d 20 30 3b 0a 20 20 20 20 20 20     p = 0;.      
18b40 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18b50 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
18b60 7d 0a 20 20 7d 20 20 0a 20 20 54 63 6c 5f 53 65  }.  }  .  Tcl_Se
18b70 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
18b80 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
18b90 74 4f 62 6a 28 28 73 71 6c 69 74 65 33 5f 69 6e  tObj((sqlite3_in
18ba0 74 36 34 29 70 29 29 3b 0a 20 20 72 65 74 75 72  t64)p));.  retur
18bb0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a  n TCL_OK;.}./*.*
18bc0 2a 20 55 73 61 67 65 3a 20 20 20 74 65 78 74 61  * Usage:   texta
18bd0 72 72 61 79 5f 61 64 64 72 20 20 54 45 58 54 20  rray_addr  TEXT 
18be0 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ....**.** Return
18bf0 20 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20   the address of 
18c00 61 20 43 2d 6c 61 6e 67 75 61 67 65 20 61 72 72  a C-language arr
18c10 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 0a 2a  ay of strings..*
18c20 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68 6f  *.** Space to ho
18c30 6c 64 20 74 68 65 20 61 72 72 61 79 20 69 73 20  ld the array is 
18c40 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61  obtained from ma
18c50 6c 6c 6f 63 28 29 2e 20 20 43 61 6c 6c 20 74 68  lloc().  Call th
18c60 69 73 20 70 72 6f 63 65 64 75 72 65 20 6f 6e 63  is procedure onc
18c70 65 0a 2a 2a 20 77 69 74 68 20 6e 6f 20 61 72 67  e.** with no arg
18c80 75 6d 65 6e 74 73 20 69 6e 20 6f 72 64 65 72 20  uments in order 
18c90 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
18ca0 79 2e 20 20 45 61 63 68 20 63 61 6c 6c 20 74 6f  y.  Each call to
18cb0 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 0a   this procedure.
18cc0 2a 2a 20 6f 76 65 72 77 72 69 74 65 73 20 74 68  ** overwrites th
18cd0 65 20 70 72 65 76 69 6f 75 73 20 61 72 72 61 79  e previous array
18ce0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
18cf0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
18d00 73 74 5f 74 65 78 74 61 72 72 61 79 5f 61 64 64  st_textarray_add
18d10 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  r(.  void * clie
18d20 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
18d30 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
18d40 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
18d50 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
18d60 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ].){.  int i;.  
18d70 73 74 61 74 69 63 20 69 6e 74 20 6e 20 3d 20 30  static int n = 0
18d80 3b 0a 20 20 73 74 61 74 69 63 20 63 68 61 72 20  ;.  static char 
18d90 2a 2a 70 20 3d 20 30 3b 0a 0a 20 20 66 6f 72 28  **p = 0;..  for(
18da0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 20 73  i=0; i<n; i++) s
18db0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 5b 69 5d  qlite3_free(p[i]
18dc0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
18dd0 65 28 70 29 3b 0a 20 20 70 20 3d 20 30 3b 0a 20  e(p);.  p = 0;. 
18de0 20 69 66 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20   if( objc>1 ){. 
18df0 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d     p = sqlite3_m
18e00 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 70 5b  alloc( sizeof(p[
18e10 30 5d 29 2a 28 6f 62 6a 63 2d 31 29 20 29 3b 0a  0])*(objc-1) );.
18e20 20 20 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72      if( p==0 ) r
18e30 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18e40 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18e50 6f 62 6a 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 20  objc-1; i++){.  
18e60 20 20 20 20 70 5b 69 5d 20 3d 20 73 71 6c 69 74      p[i] = sqlit
18e70 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
18e80 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
18e90 62 6a 76 5b 31 2b 69 5d 29 29 3b 0a 20 20 20 20  bjv[1+i]));.    
18ea0 7d 0a 20 20 7d 0a 20 20 6e 20 3d 20 6f 62 6a 63  }.  }.  n = objc
18eb0 2d 31 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  -1;.  Tcl_SetObj
18ec0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18ed0 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a  cl_NewWideIntObj
18ee0 28 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  ((sqlite3_int64)
18ef0 70 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  p));.  return TC
18f00 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
18f10 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
18f20 5f 62 69 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d  _bind_int64  STM
18f30 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20  T N VALUE.**.** 
18f40 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33  Test the sqlite3
18f50 5f 62 69 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65  _bind_int64 inte
18f60 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
18f70 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
18f80 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
18f90 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
18fa0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
18fb0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
18fc0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
18fd0 2a 20 62 69 6e 64 73 20 61 20 36 34 2d 62 69 74  * binds a 64-bit
18fe0 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
18ff0 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
19000 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
19010 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
19020 74 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20  t_bind_int64(.  
19030 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
19040 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
19050 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19060 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19070 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19080 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
19090 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
190a0 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20  ;.  Tcl_WideInt 
190b0 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
190c0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
190d0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
190e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
190f0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19100 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
19110 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19120 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
19130 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e  0], 0), " STMT N
19140 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20   VALUE", 0);.   
19150 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19160 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
19170 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
19180 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
19190 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
191a0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
191b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
191c0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
191d0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
191e0 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e  , &idx) ) return
191f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
19200 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
19210 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
19220 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29  objv[3], &value)
19230 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19240 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
19250 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28  ite3_bind_int64(
19260 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
19270 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  e);.  if( sqlite
19280 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
19290 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
192a0 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
192b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
192c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
192d0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
192e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
192f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
19300 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
19310 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
19320 5f 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20  _double  STMT N 
19330 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74  VALUE.**.** Test
19340 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
19350 64 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61  d_double interfa
19360 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
19370 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
19380 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
19390 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
193a0 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
193b0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
193c0 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
193d0 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
193e0 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
193f0 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
19400 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
19410 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62  TE_TCLAPI test_b
19420 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  ind_double(.  vo
19430 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
19440 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
19450 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
19460 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
19470 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
19480 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
19490 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
194a0 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 20 3d    double value =
194b0 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
194c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 61 6c  const char *zVal
194d0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 61  ;.  int i;.  sta
194e0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
194f0 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
19500 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a  r *zName;     /*
19510 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 73 70 65   Name of the spe
19520 63 69 61 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f  cial floating po
19530 69 6e 74 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20  int value */.   
19540 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 55   unsigned int iU
19550 70 70 65 72 3b 20 20 20 2f 2a 20 55 70 70 65 72  pper;   /* Upper
19560 20 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 20 20   32 bits */.    
19570 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f  unsigned int iLo
19580 77 65 72 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20  wer;   /* Lower 
19590 33 32 20 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61  32 bits */.  } a
195a0 53 70 65 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a  SpecialFp[] = {.
195b0 20 20 20 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20      {  "NaN",   
195c0 20 20 20 30 78 37 66 66 66 66 66 66 66 2c 20 30     0x7fffffff, 0
195d0 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20  xffffffff },.   
195e0 20 7b 20 20 22 53 4e 61 4e 22 2c 20 20 20 20 20   {  "SNaN",     
195f0 30 78 37 66 66 37 66 66 66 66 2c 20 30 78 66 66  0x7ff7ffff, 0xff
19600 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20  ffffff },.    { 
19610 20 22 2d 4e 61 4e 22 2c 20 20 20 20 20 30 78 66   "-NaN",     0xf
19620 66 66 66 66 66 66 66 2c 20 30 78 66 66 66 66 66  fffffff, 0xfffff
19630 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  fff },.    {  "-
19640 53 4e 61 4e 22 2c 20 20 20 20 30 78 66 66 66 37  SNaN",    0xfff7
19650 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
19660 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66   },.    {  "+Inf
19670 22 2c 20 20 20 20 20 30 78 37 66 66 30 30 30 30  ",     0x7ff0000
19680 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c  0, 0x00000000 },
19690 0a 20 20 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20  .    {  "-Inf", 
196a0 20 20 20 20 30 78 66 66 66 30 30 30 30 30 2c 20      0xfff00000, 
196b0 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
196c0 20 20 7b 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20    {  "Epsilon", 
196d0 20 30 78 30 30 30 30 30 30 30 30 2c 20 30 78 30   0x00000000, 0x0
196e0 30 30 30 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b  0000001 },.    {
196f0 20 20 22 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78    "-Epsilon", 0x
19700 38 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30  80000000, 0x0000
19710 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0001 },.    {  "
19720 4e 61 4e 30 22 2c 20 20 20 20 20 30 78 37 66 66  NaN0",     0x7ff
19730 38 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  80000, 0x0000000
19740 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61  0 },.    {  "-Na
19750 4e 30 22 2c 20 20 20 20 30 78 66 66 66 38 30 30  N0",    0xfff800
19760 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
19770 2c 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62  ,.  };..  if( ob
19780 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
19790 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
197a0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
197b0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
197c0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
197d0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
197e0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
197f0 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c 20 30  STMT N VALUE", 0
19800 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
19810 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
19820 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
19830 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
19840 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
19850 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
19860 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19870 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
19880 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
19890 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  bjv[2], &idx) ) 
198a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
198b0 3b 0a 0a 20 20 2f 2a 20 49 6e 74 65 72 63 65 70  ;..  /* Intercep
198c0 74 20 74 68 65 20 73 74 72 69 6e 67 20 22 4e 61  t the string "Na
198d0 4e 22 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  N" and generate 
198e0 61 20 4e 61 4e 20 76 61 6c 75 65 20 66 6f 72 20  a NaN value for 
198f0 69 74 2e 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68  it..  ** All oth
19900 65 72 20 73 74 72 69 6e 67 73 20 61 72 65 20 70  er strings are p
19910 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
19920 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
19930 6f 6d 4f 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63  omObj()..  ** Tc
19940 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
19950 62 6a 28 29 20 73 68 6f 75 6c 64 20 75 6e 64 65  bj() should unde
19960 72 73 74 61 6e 64 20 22 4e 61 4e 22 20 62 75 74  rstand "NaN" but
19970 20 73 6f 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20   some versions. 
19980 20 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 62 75   ** contain a bu
19990 67 2e 0a 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d  g..  */.  zVal =
199a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
199b0 62 6a 76 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[3]);.  for(i
199c0 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 53 70  =0; i<sizeof(aSp
199d0 65 63 69 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28  ecialFp)/sizeof(
199e0 61 53 70 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20  aSpecialFp[0]); 
199f0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74  i++){.    if( st
19a00 72 63 6d 70 28 61 53 70 65 63 69 61 6c 46 70 5b  rcmp(aSpecialFp[
19a10 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d  i].zName, zVal)=
19a20 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
19a30 74 65 33 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20  te3_uint64 x;.  
19a40 20 20 20 20 78 20 3d 20 61 53 70 65 63 69 61 6c      x = aSpecial
19a50 46 70 5b 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20  Fp[i].iUpper;.  
19a60 20 20 20 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20      x <<= 32;.  
19a70 20 20 20 20 78 20 7c 3d 20 61 53 70 65 63 69 61      x |= aSpecia
19a80 6c 46 70 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20  lFp[i].iLower;. 
19a90 20 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a       assert( siz
19aa0 65 6f 66 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b  eof(value)==8 );
19ab0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 73  .      assert( s
19ac0 69 7a 65 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20  izeof(x)==8 );. 
19ad0 20 20 20 20 20 6d 65 6d 63 70 79 28 26 76 61 6c       memcpy(&val
19ae0 75 65 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20  ue, &x, 8);.    
19af0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
19b00 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65   }.  if( i>=size
19b10 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f 73  of(aSpecialFp)/s
19b20 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70  izeof(aSpecialFp
19b30 5b 30 5d 29 20 26 26 0a 20 20 20 20 20 20 20 20  [0]) &&.        
19b40 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72   Tcl_GetDoubleFr
19b50 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
19b60 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
19b70 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
19b80 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
19b90 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
19ba0 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c 20 69 64  double(pStmt, id
19bb0 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69 66 28  x, value);.  if(
19bc0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
19bd0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
19be0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
19bf0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19c00 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
19c10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19c20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19c30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
19c40 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19c50 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
19c60 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d  3_bind_null  STM
19c70 54 20 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  T N.**.** Test t
19c80 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
19c90 6e 75 6c 6c 20 69 6e 74 65 72 66 61 63 65 2e 20  null interface. 
19ca0 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
19cb0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
19cc0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
19cd0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
19ce0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
19cf0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
19d00 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
19d10 20 61 20 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77   a NULL to the w
19d20 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74  ildcard..*/.stat
19d30 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
19d40 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 6e  LAPI test_bind_n
19d50 75 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ull(.  void * cl
19d60 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
19d70 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
19d80 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
19d90 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
19da0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
19db0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
19dc0 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72  int idx;.  int r
19dd0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
19de0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
19df0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19e00 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19e10 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
19e20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
19e30 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
19e40 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
19e50 20 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74   N", 0);.    ret
19e60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
19e70 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
19e80 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
19e90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19ea0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
19eb0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
19ec0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
19ed0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
19ee0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69  erp, objv[2], &i
19ef0 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
19f00 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20  _ERROR;..  rc = 
19f10 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
19f20 6c 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20  l(pStmt, idx);. 
19f30 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
19f40 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
19f50 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c  StmtToDb(pStmt),
19f60 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
19f70 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72  L_ERROR;.  if( r
19f80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
19f90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
19fa0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
19fb0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
19fc0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71  *.** Usage:   sq
19fd0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20  lite3_bind_text 
19fe0 20 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42   STMT N STRING B
19ff0 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
1a000 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
1a010 5f 74 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e  _text interface.
1a020 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
1a030 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
1a040 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
1a050 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
1a060 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
1a070 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
1a080 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
1a090 73 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67  s a UTF-8 string
1a0a0 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77   STRING to the w
1a0b0 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74  ildcard.  The st
1a0c0 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79  ring is BYTES by
1a0d0 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a  tes.** long..*/.
1a0e0 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1a0f0 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69  E_TCLAPI test_bi
1a100 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64 20  nd_text(.  void 
1a110 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1a120 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1a130 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1a140 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1a150 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
1a160 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1a170 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69  ;.  int idx;.  i
1a180 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72  nt bytes;.  char
1a190 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72   *value;.  int r
1a1a0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
1a1b0 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  5 ){.    Tcl_App
1a1c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a1d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1a1e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
1a1f0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
1a200 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
1a210 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
1a220 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22 2c   N VALUE BYTES",
1a230 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1a240 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1a250 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1a260 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1a270 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1a280 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1a290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a2a0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1a2b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1a2c0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
1a2d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a2e0 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63  OR;.  value = (c
1a2f0 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65  har*)Tcl_GetByte
1a300 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1a310 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a 20  v[3], &bytes);. 
1a320 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1a330 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1a340 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29 20  bjv[4], &bytes) 
1a350 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a360 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
1a370 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
1a380 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 2c  tmt, idx, value,
1a390 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f 54   bytes, SQLITE_T
1a3a0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66 28  RANSIENT);.  if(
1a3b0 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
1a3c0 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74  ode(interp, Stmt
1a3d0 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29  ToDb(pStmt), rc)
1a3e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a3f0 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ROR;.  if( rc!=S
1a400 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a410 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1a420 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
1a430 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  ErrName(rc), 0);
1a440 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a450 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
1a460 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1a470 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1a480 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
1a490 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53 54 4d  16 ?-static? STM
1a4a0 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45 53  T N STRING BYTES
1a4b0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
1a4c0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
1a4d0 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20 20  t16 interface.  
1a4e0 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72  STMT is a prepar
1a4f0 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a  ed statement..**
1a500 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20   N is the index 
1a510 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e  of a wildcard in
1a520 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
1a530 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63  atement.  This c
1a540 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20  ommand.** binds 
1a550 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67 20  a UTF-16 string 
1a560 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69  STRING to the wi
1a570 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72  ldcard.  The str
1a580 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74  ing is BYTES byt
1a590 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73  es.** long..*/.s
1a5a0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1a5b0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e  _TCLAPI test_bin
1a5c0 64 5f 74 65 78 74 31 36 28 0a 20 20 76 6f 69 64  d_text16(.  void
1a5d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1a5e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1a5f0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1a600 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1a610 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1a620 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a630 55 54 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f  UTF16.  sqlite3_
1a640 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
1a650 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
1a660 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
1a670 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
1a680 20 76 6f 69 64 20 28 2a 78 44 65 6c 29 28 76 6f   void (*xDel)(vo
1a690 69 64 2a 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f  id*) = (objc==6?
1a6a0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 3a 53 51  SQLITE_STATIC:SQ
1a6b0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
1a6c0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d  .  Tcl_Obj *oStm
1a6d0 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63  t    = objv[objc
1a6e0 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  -4];.  Tcl_Obj *
1a6f0 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b  oN       = objv[
1a700 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f  objc-3];.  Tcl_O
1a710 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f  bj *oString  = o
1a720 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54  bjv[objc-2];.  T
1a730 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20  cl_Obj *oBytes  
1a740 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b   = objv[objc-1];
1a750 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
1a760 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20  && objc!=6){.   
1a770 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1a780 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1a790 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1a7a0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
1a7b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
1a7c0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
1a7d0 2c 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  , " STMT N VALUE
1a7e0 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20   BYTES", 0);.   
1a7f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a800 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1a810 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1a820 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1a830 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d  ng(oStmt), &pStm
1a840 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1a850 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1a860 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1a870 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29  nterp, oN, &idx)
1a880 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a890 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28  ROR;.  value = (
1a8a0 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
1a8b0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53  eArrayFromObj(oS
1a8c0 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28  tring, 0);.  if(
1a8d0 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1a8e0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42 79 74 65  bj(interp, oByte
1a8f0 73 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  s, &bytes) ) ret
1a900 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1a910 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
1a920 69 6e 64 5f 74 65 78 74 31 36 28 70 53 74 6d 74  ind_text16(pStmt
1a930 2c 20 69 64 78 2c 20 28 76 6f 69 64 20 2a 29 76  , idx, (void *)v
1a940 61 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65  alue, bytes, xDe
1a950 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l);.  if( sqlite
1a960 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
1a970 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53  erp, StmtToDb(pS
1a980 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75  tmt), rc) ) retu
1a990 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1a9a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a9b0 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
1a9c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1a9d0 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
1a9e0 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
1a9f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1aa00 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53    }..#endif /* S
1aa10 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1aa20 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   */.  return TCL
1aa30 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1aa40 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
1aa50 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69  ind_blob ?-stati
1aa60 63 3f 20 53 54 4d 54 20 4e 20 44 41 54 41 20 42  c? STMT N DATA B
1aa70 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  YTES.**.** Test 
1aa80 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
1aa90 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65 2e  _blob interface.
1aaa0 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
1aab0 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
1aac0 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
1aad0 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
1aae0 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
1aaf0 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
1ab00 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
1ab10 73 20 61 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  s a BLOB to the 
1ab20 77 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 42  wildcard.  The B
1ab30 4c 4f 42 20 69 73 20 42 59 54 45 53 20 62 79 74  LOB is BYTES byt
1ab40 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73  es in size..*/.s
1ab50 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1ab60 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e  _TCLAPI test_bin
1ab70 64 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a  d_blob(.  void *
1ab80 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1ab90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1aba0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1abb0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1abc0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1abd0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1abe0 0a 20 20 69 6e 74 20 6c 65 6e 2c 20 69 64 78 3b  .  int len, idx;
1abf0 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
1ac00 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
1ac10 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
1ac20 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79 70 65  _destructor_type
1ac30 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53   xDestructor = S
1ac40 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b  QLITE_TRANSIENT;
1ac50 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
1ac60 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20  && objc!=6 ){.  
1ac70 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1ac80 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1ac90 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1aca0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
1acb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
1acc0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
1acd0 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54 41  ), " STMT N DATA
1ace0 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20   BYTES", 0);.   
1acf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ad00 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  R;.  }..  if( ob
1ad10 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78 44 65  jc==6 ){.    xDe
1ad20 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54  structor = SQLIT
1ad30 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 6f 62  E_STATIC;.    ob
1ad40 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  jv++;.  }..  if(
1ad50 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1ad60 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1ad70 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1ad80 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1ad90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
1ada0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1adb0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1adc0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
1add0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
1ade0 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a    value = (char*
1adf0 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61  )Tcl_GetByteArra
1ae00 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d  yFromObj(objv[3]
1ae10 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54  , &len);.  if( T
1ae20 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1ae30 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
1ae40 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1ae50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1ae60 20 69 66 28 20 62 79 74 65 73 3e 6c 65 6e 20 29   if( bytes>len )
1ae70 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
1ae80 32 30 30 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65  200];.    sqlite
1ae90 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
1aea0 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 0a 20  f(zBuf), zBuf,. 
1aeb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1aec0 20 20 20 20 22 63 61 6e 6e 6f 74 20 75 73 65 20      "cannot use 
1aed0 25 64 20 62 6c 6f 62 20 62 79 74 65 73 2c 20 68  %d blob bytes, h
1aee0 61 76 65 20 25 64 22 2c 20 62 79 74 65 73 2c 20  ave %d", bytes, 
1aef0 6c 65 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  len);.    Tcl_Ap
1af00 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1af10 70 2c 20 7a 42 75 66 2c 20 2d 31 29 3b 0a 20 20  p, zBuf, -1);.  
1af20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1af30 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  OR;.  }..  rc = 
1af40 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f  sqlite3_bind_blo
1af50 62 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  b(pStmt, idx, va
1af60 6c 75 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73  lue, bytes, xDes
1af70 74 72 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20  tructor);.  if( 
1af80 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
1af90 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54  de(interp, StmtT
1afa0 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20  oDb(pStmt), rc) 
1afb0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1afc0 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  OR;.  if( rc!=SQ
1afd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
1afe0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1aff0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
1b000 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b010 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
1b020 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
1b030 63 6f 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a  count  STMT.**.*
1b040 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1b050 62 65 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73  ber of wildcards
1b060 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74   in the given st
1b070 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  atement..*/.stat
1b080 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1b090 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 70  LAPI test_bind_p
1b0a0 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a  arameter_count(.
1b0b0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1b0c0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1b0d0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1b0e0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1b0f0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1b100 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1b110 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
1b120 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
1b130 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
1b140 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
1b150 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
1b160 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b170 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
1b180 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1b190 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1b1a0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1b1b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1b1c0 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
1b1d0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1b1e0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
1b1f0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
1b200 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74  eter_count(pStmt
1b210 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
1b220 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b230 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
1b240 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
1b250 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a  ame  STMT  N.**.
1b260 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
1b270 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77 69  me of the Nth wi
1b280 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66 69 72  ldcard.  The fir
1b290 73 74 20 77 69 6c 64 63 61 72 64 20 69 73 20 31  st wildcard is 1
1b2a0 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73 74  ..** An empty st
1b2b0 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64  ring is returned
1b2c0 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20   if N is out of 
1b2d0 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65 20  range or if the 
1b2e0 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e  wildcard.** is n
1b2f0 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  ameless..*/.stat
1b300 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1b310 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64 5f 70  LAPI test_bind_p
1b320 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 0a 20  arameter_name(. 
1b330 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b340 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b350 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b360 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b370 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b380 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1b390 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 3b  *pStmt;.  int i;
1b3a0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
1b3b0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1b3c0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1b3d0 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e  1, objv, "STMT N
1b3e0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1b3f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1b400 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1b410 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1b420 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1b430 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1b440 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b450 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1b460 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1b470 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20 72 65  bjv[2], &i) ) re
1b480 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b490 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1b4a0 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
1b4b0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
1b4c0 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70  j(sqlite3_bind_p
1b4d0 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28 70 53  arameter_name(pS
1b4e0 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29 3b 0a  tmt,i),-1).  );.
1b4f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b500 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1b510 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1b520 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 20  parameter_index 
1b530 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a   STMT  NAME.**.*
1b540 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64  * Return the ind
1b550 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61  ex of the wildca
1b560 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45 2e 20  rd called NAME. 
1b570 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   Return 0 if the
1b580 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75 63 68  re is.** no such
1b590 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
1b5a0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1b5b0 54 43 4c 41 50 49 20 74 65 73 74 5f 62 69 6e 64  TCLAPI test_bind
1b5c0 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
1b5d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b5e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b5f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b600 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b610 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b620 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1b630 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
1b640 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1b650 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
1b660 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
1b670 76 2c 20 22 53 54 4d 54 20 4e 41 4d 45 22 29 3b  v, "STMT NAME");
1b680 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1b690 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1b6a0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
1b6b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1b6c0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1b6d0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
1b6e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1b6f0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1b700 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c  nterp, .     Tcl
1b710 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20 20  _NewIntObj(.    
1b720 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1b730 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
1b740 70 53 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74 72  pStmt,Tcl_GetStr
1b750 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20 20  ing(objv[2])).  
1b760 20 20 20 29 0a 20 20 29 3b 0a 20 20 72 65 74 75     ).  );.  retu
1b770 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1b780 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
1b790 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69  ite3_clear_bindi
1b7a0 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73  ngs STMT.**.*/.s
1b7b0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1b7c0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 63 6c 65  _TCLAPI test_cle
1b7d0 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20 76  ar_bindings(.  v
1b7e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1b7f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1b800 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1b810 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1b820 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1b830 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1b840 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
1b850 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
1b860 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1b870 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
1b880 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
1b890 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1b8a0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1b8b0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1b8c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1b8d0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1b8e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b8f0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
1b900 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1b910 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
1b920 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
1b930 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  s(pStmt)));.  re
1b940 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b950 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
1b960 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c  qlite3_sleep MIL
1b970 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61  LISECONDS.*/.sta
1b980 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1b990 43 4c 41 50 49 20 74 65 73 74 5f 73 6c 65 65 70  CLAPI test_sleep
1b9a0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b9b0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b9c0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b9d0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b9e0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b9f0 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a 0a 20  .){.  int ms;.. 
1ba00 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1ba10 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1ba20 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1ba30 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45 43 4f  objv, "MILLISECO
1ba40 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74 75 72  NDS");.    retur
1ba50 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ba60 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1ba70 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1ba80 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29 20 29   objv[1], &ms) )
1ba90 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
1baa0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
1bab0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1bac0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1bad0 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73 6c 65  tObj(sqlite3_sle
1bae0 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65 74 75  ep(ms)));.  retu
1baf0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1bb00 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
1bb10 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
1bb20 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ode DB.**.** Ret
1bb30 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67 20 72  urn the string r
1bb40 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
1bb50 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
1bb60 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 0a 2a   sqlite3_* API.*
1bb70 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 65 2e  * error code. e.
1bb80 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52  g. "SQLITE_ERROR
1bb90 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
1bba0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1bbb0 65 73 74 5f 65 78 5f 65 72 72 63 6f 64 65 28 0a  est_ex_errcode(.
1bbc0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1bbd0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1bbe0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1bbf0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1bc00 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1bc10 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1bc20 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1bc30 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1bc40 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bc50 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1bc60 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1bc70 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1bc80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bc90 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20 30  jv[0]), " DB", 0
1bca0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1bcb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1bcc0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1bcd0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1bce0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1bcf0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1bd00 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1bd10 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1bd20 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
1bd30 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1bd40 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
1bd50 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
1bd60 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1bd70 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
1bd80 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1bd90 65 72 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a  errcode DB.**.**
1bda0 20 52 65 74 75 72 6e 20 74 68 65 20 73 74 72 69   Return the stri
1bdb0 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
1bdc0 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  n of the most re
1bdd0 63 65 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41  cent sqlite3_* A
1bde0 50 49 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  PI.** error code
1bdf0 2e 20 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45  . e.g. "SQLITE_E
1be00 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  RROR"..*/.static
1be10 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
1be20 50 49 20 74 65 73 74 5f 65 72 72 63 6f 64 65 28  PI test_errcode(
1be30 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1be40 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1be50 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1be60 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1be70 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1be80 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1be90 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
1bea0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1beb0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1bec0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1bed0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1bee0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
1bef0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1bf00 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c 20  bjv[0]), " DB", 
1bf10 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1bf20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1bf30 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1bf40 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1bf50 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1bf60 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1bf70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1bf80 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
1bf90 28 64 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  (db);.  Tcl_Appe
1bfa0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1bfb0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
1bfc0 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20  Name(rc), 0);.  
1bfd0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1bfe0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1bff0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 20   sqlite3_errmsg 
1c000 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 73  DB.**.** Returns
1c010 20 74 68 65 20 55 54 46 2d 38 20 72 65 70 72 65   the UTF-8 repre
1c020 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
1c030 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 73   error message s
1c040 74 72 69 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a  tring for the.**
1c050 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 71 6c   most recent sql
1c060 69 74 65 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e  ite3_* API call.
1c070 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1c080 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1c090 74 5f 65 72 72 6d 73 67 28 0a 20 20 76 6f 69 64  t_errmsg(.  void
1c0a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c0b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c0c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1c0d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1c0e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1c0f0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
1c100 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 0a  st char *zErr;..
1c110 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
1c120 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1c130 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1c140 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1c150 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1c160 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1c170 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
1c180 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1c190 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1c1a0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1c1b0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
1c1c0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
1c1d0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
1c1e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
1c1f0 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f 65  zErr = sqlite3_e
1c200 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 54 63 6c  rrmsg(db);.  Tcl
1c210 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1c220 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
1c230 69 6e 67 4f 62 6a 28 7a 45 72 72 2c 20 2d 31 29  ingObj(zErr, -1)
1c240 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1c250 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1c260 67 65 3a 20 20 20 74 65 73 74 5f 65 72 72 6d 73  ge:   test_errms
1c270 67 31 36 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  g16 DB.**.** Ret
1c280 75 72 6e 73 20 74 68 65 20 55 54 46 2d 31 36 20  urns the UTF-16 
1c290 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
1c2a0 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
1c2b0 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20 74  age string for t
1c2c0 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65 6e  he.** most recen
1c2d0 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49 20  t sqlite3_* API 
1c2e0 63 61 6c 6c 2e 20 54 68 69 73 20 69 73 20 61 20  call. This is a 
1c2f0 62 79 74 65 20 61 72 72 61 79 20 6f 62 6a 65 63  byte array objec
1c300 74 20 61 74 20 74 68 65 20 54 43 4c 20 0a 2a 2a  t at the TCL .**
1c310 20 6c 65 76 65 6c 2c 20 61 6e 64 20 69 74 20 69   level, and it i
1c320 6e 63 6c 75 64 65 73 20 74 68 65 20 30 78 30 30  ncludes the 0x00
1c330 20 30 78 30 30 20 74 65 72 6d 69 6e 61 74 6f 72   0x00 terminator
1c340 20 62 79 74 65 73 20 61 74 20 74 68 65 20 65 6e   bytes at the en
1c350 64 20 6f 66 20 74 68 65 0a 2a 2a 20 55 54 46 2d  d of the.** UTF-
1c360 31 36 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74  16 string..*/.st
1c370 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
1c380 54 43 4c 41 50 49 20 74 65 73 74 5f 65 72 72 6d  TCLAPI test_errm
1c390 73 67 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  sg16(.  void * c
1c3a0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1c3b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1c3c0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1c3d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1c3e0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
1c3f0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1c400 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
1c410 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1c420 45 72 72 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Err;.  const cha
1c430 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 62 79 74 65  r *z;.  int byte
1c440 73 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  s = 0;..  if( ob
1c450 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1c460 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1c470 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1c480 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1c490 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1c4a0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1c4b0 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
1c4c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1c4d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1c4e0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1c4f0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1c500 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1c510 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c520 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73  ROR;..  zErr = s
1c530 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28  qlite3_errmsg16(
1c540 64 62 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  db);.  if( zErr 
1c550 29 7b 0a 20 20 20 20 7a 20 3d 20 7a 45 72 72 3b  ){.    z = zErr;
1c560 0a 20 20 20 20 66 6f 72 28 62 79 74 65 73 3d 30  .    for(bytes=0
1c570 3b 20 7a 5b 62 79 74 65 73 5d 20 7c 7c 20 7a 5b  ; z[bytes] || z[
1c580 62 79 74 65 73 2b 31 5d 3b 20 62 79 74 65 73 2b  bytes+1]; bytes+
1c590 3d 32 29 7b 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f  =2){}.  }.  Tcl_
1c5a0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1c5b0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65  erp, Tcl_NewByte
1c5c0 41 72 72 61 79 4f 62 6a 28 7a 45 72 72 2c 20 62  ArrayObj(zErr, b
1c5d0 79 74 65 73 29 29 3b 0a 23 65 6e 64 69 66 20 2f  ytes));.#endif /
1c5e0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1c5f0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
1c600 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1c610 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1c620 70 72 65 70 61 72 65 20 44 42 20 73 71 6c 20 62  prepare DB sql b
1c630 79 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a  ytes ?tailvar?.*
1c640 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
1c650 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
1c660 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
1c670 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
1c680 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
1c690 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
1c6a0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
1c6b0 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
1c6c0 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
1c6d0 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
1c6e0 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1c6f0 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
1c700 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
1c710 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
1c720 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
1c730 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1c740 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1c750 5f 70 72 65 70 61 72 65 28 0a 20 20 76 6f 69 64  _prepare(.  void
1c760 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c770 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c780 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1c790 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1c7a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1c7b0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
1c7c0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
1c7d0 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 6f   int bytes;.  co
1c7e0 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 20  nst char *zTail 
1c7f0 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
1c800 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
1c810 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b    char zBuf[50];
1c820 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
1c830 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
1c840 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=4 ){.    Tcl_
1c850 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1c860 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
1c870 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
1c880 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47  ", .       Tcl_G
1c890 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d  etString(objv[0]
1c8a0 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65  ), " DB sql byte
1c8b0 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29  s ?tailvar?", 0)
1c8c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1c8d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1c8e0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1c8f0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1c900 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1c910 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1c920 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d  _ERROR;.  zSql =
1c930 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c940 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54  bjv[2]);.  if( T
1c950 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
1c960 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
1c970 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74 75  , &bytes) ) retu
1c980 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
1c990 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1c9a0 65 70 61 72 65 28 64 62 2c 20 7a 53 71 6c 2c 20  epare(db, zSql, 
1c9b0 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f  bytes, &pStmt, o
1c9c0 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20  bjc>=5 ? &zTail 
1c9d0 3a 20 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  : 0);.  Tcl_Rese
1c9e0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1c9f0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1ca00 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1ca10 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1ca20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ca30 69 66 28 20 7a 54 61 69 6c 20 26 26 20 6f 62 6a  if( zTail && obj
1ca40 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20  c>=5 ){.    if( 
1ca50 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20 20  bytes>=0 ){.    
1ca60 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73 20    bytes = bytes 
1ca70 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a 53  - (int)(zTail-zS
1ca80 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
1ca90 66 28 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a  f( (int)strlen(z
1caa0 54 61 69 6c 29 3c 62 79 74 65 73 20 29 7b 0a 20  Tail)<bytes ){. 
1cab0 20 20 20 20 20 62 79 74 65 73 20 3d 20 28 69 6e       bytes = (in
1cac0 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c 29 3b  t)strlen(zTail);
1cad0 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 4f  .    }.    Tcl_O
1cae0 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72 70  bjSetVar2(interp
1caf0 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 54 63  , objv[4], 0, Tc
1cb00 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
1cb10 54 61 69 6c 2c 20 62 79 74 65 73 29 2c 20 30 29  Tail, bytes), 0)
1cb20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
1cb30 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1cb40 20 61 73 73 65 72 74 28 20 70 53 74 6d 74 3d 3d   assert( pStmt==
1cb50 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1cb60 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
1cb70 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 28  (zBuf), zBuf, "(
1cb80 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
1cb90 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1cba0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
1cbb0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
1cbc0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
1cbd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1cbe0 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
1cbf0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
1cc00 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
1cc10 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
1cc20 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
1cc30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
1cc40 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1cc50 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
1cc60 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1cc70 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1cc80 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1cc90 70 72 65 70 61 72 65 5f 76 32 20 44 42 20 73 71  prepare_v2 DB sq
1cca0 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61 72  l bytes ?tailvar
1ccb0 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20  ?.**.** Compile 
1ccc0 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79  up to <bytes> by
1ccd0 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c  tes of the suppl
1cce0 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c  ied SQL string <
1ccf0 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61  sql> using.** da
1cd00 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44  tabase handle <D
1cd10 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  B>. The paramete
1cd20 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74  r <tailval> is t
1cd30 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f  he name of a glo
1cd40 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20  bal.** variable 
1cd50 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20 74  that is set to t
1cd60 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f  he unused portio
1cd70 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61  n of <sql> (if a
1cd80 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68  ny). A.** STMT h
1cd90 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65  andle is returne
1cda0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1cdb0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
1cdc0 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32 28 0a  est_prepare_v2(.
1cdd0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1cde0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1cdf0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1ce00 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1ce10 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1ce20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1ce30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ce40 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Sql;.  char *zCo
1ce50 70 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  py = 0;         
1ce60 20 20 20 20 20 20 20 2f 2a 20 6d 61 6c 6c 6f 63         /* malloc
1ce70 28 29 20 63 6f 70 79 20 6f 66 20 7a 53 71 6c 20  () copy of zSql 
1ce80 2a 2f 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a  */.  int bytes;.
1ce90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1cea0 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ail = 0;.  sqlit
1ceb0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
1cec0 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b   0;.  char zBuf[
1ced0 35 30 5d 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  50];.  int rc;..
1cee0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26    if( objc!=5 &&
1cef0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
1cf00 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1cf10 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1cf20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1cf30 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1cf40 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1cf50 76 5b 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20  v[0]), " DB sql 
1cf60 62 79 74 65 73 20 74 61 69 6c 76 61 72 22 2c 20  bytes tailvar", 
1cf70 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1cf80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1cf90 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1cfa0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1cfb0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1cfc0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1cfd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
1cfe0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
1cff0 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
1d000 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1d010 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1d020 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1d030 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d040 0a 20 20 2f 2a 20 49 6e 73 74 65 61 64 20 6f 66  .  /* Instead of
1d050 20 75 73 69 6e 67 20 7a 53 71 6c 20 64 69 72 65   using zSql dire
1d060 63 74 6c 79 2c 20 6d 61 6b 65 20 61 20 63 6f 70  ctly, make a cop
1d070 79 20 69 6e 74 6f 20 61 20 62 75 66 66 65 72 20  y into a buffer 
1d080 6f 62 74 61 69 6e 65 64 0a 20 20 2a 2a 20 64 69  obtained.  ** di
1d090 72 65 63 74 6c 79 20 66 72 6f 6d 20 6d 61 6c 6c  rectly from mall
1d0a0 6f 63 28 29 2e 20 54 68 65 20 69 64 65 61 20 69  oc(). The idea i
1d0b0 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73  s to make it eas
1d0c0 69 65 72 20 66 6f 72 20 76 61 6c 67 72 69 6e 64  ier for valgrind
1d0d0 0a 20 20 2a 2a 20 74 6f 20 73 70 6f 74 20 62 75  .  ** to spot bu
1d0e0 66 66 65 72 20 6f 76 65 72 72 65 61 64 73 2e 20  ffer overreads. 
1d0f0 20 2a 2f 0a 20 20 69 66 28 20 62 79 74 65 73 3e   */.  if( bytes>
1d100 3d 30 20 29 7b 0a 20 20 20 20 7a 43 6f 70 79 20  =0 ){.    zCopy 
1d110 3d 20 6d 61 6c 6c 6f 63 28 62 79 74 65 73 29 3b  = malloc(bytes);
1d120 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 43 6f 70  .    memcpy(zCop
1d130 79 2c 20 7a 53 71 6c 2c 20 62 79 74 65 73 29 3b  y, zSql, bytes);
1d140 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1d150 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
1d160 6e 28 7a 53 71 6c 29 20 2b 20 31 3b 0a 20 20 20  n(zSql) + 1;.   
1d170 20 7a 43 6f 70 79 20 3d 20 6d 61 6c 6c 6f 63 28   zCopy = malloc(
1d180 6e 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a  n);.    memcpy(z
1d190 43 6f 70 79 2c 20 7a 53 71 6c 2c 20 6e 29 3b 0a  Copy, zSql, n);.
1d1a0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1d1b0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
1d1c0 2c 20 7a 43 6f 70 79 2c 20 62 79 74 65 73 2c 20  , zCopy, bytes, 
1d1d0 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20  &pStmt, objc>=5 
1d1e0 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20  ? &zTail : 0);. 
1d1f0 20 66 72 65 65 28 7a 43 6f 70 79 29 3b 0a 20 20   free(zCopy);.  
1d200 7a 54 61 69 6c 20 3d 20 26 7a 53 71 6c 5b 28 7a  zTail = &zSql[(z
1d210 54 61 69 6c 20 2d 20 7a 43 6f 70 79 29 5d 3b 0a  Tail - zCopy)];.
1d220 0a 20 20 61 73 73 65 72 74 28 72 63 3d 3d 53 51  .  assert(rc==SQ
1d230 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74  LITE_OK || pStmt
1d240 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52 65 73 65  ==0);.  Tcl_Rese
1d250 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b  tResult(interp);
1d260 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1d270 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
1d280 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
1d290 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1d2a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d2b0 4b 20 26 26 20 7a 54 61 69 6c 20 26 26 20 6f 62  K && zTail && ob
1d2c0 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66 28  jc>=5 ){.    if(
1d2d0 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20 20 20   bytes>=0 ){.   
1d2e0 20 20 20 62 79 74 65 73 20 3d 20 62 79 74 65 73     bytes = bytes
1d2f0 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c 2d 7a   - (int)(zTail-z
1d300 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
1d310 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69  Tcl_ObjSetVar2(i
1d320 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20  nterp, objv[4], 
1d330 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  0, Tcl_NewString
1d340 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74 65 73  Obj(zTail, bytes
1d350 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ), 0);.  }.  if(
1d360 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1d370 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 53  {.    assert( pS
1d380 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  tmt==0 );.    sq
1d390 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
1d3a0 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
1d3b0 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
1d3c0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d3d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1d3e0 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
1d3f0 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
1d400 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d410 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
1d420 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
1d430 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
1d440 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
1d450 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
1d460 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d470 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1d480 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1d490 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
1d4a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1d4b0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1d4c0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b 74  ite3_prepare_tkt
1d4d0 33 31 33 34 20 44 42 0a 2a 2a 0a 2a 2a 20 47 65  3134 DB.**.** Ge
1d4e0 6e 65 72 61 74 65 20 61 20 70 72 65 70 61 72 65  nerate a prepare
1d4f0 64 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20  d statement for 
1d500 61 20 7a 65 72 6f 2d 62 79 74 65 20 73 74 72 69  a zero-byte stri
1d510 6e 67 20 61 73 20 61 20 74 65 73 74 0a 2a 2a 20  ng as a test.** 
1d520 66 6f 72 20 74 69 63 6b 65 74 20 23 33 31 33 34  for ticket #3134
1d530 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 73 68  .  The string sh
1d540 6f 75 6c 64 20 62 65 20 70 72 65 63 65 64 65 64  ould be preceded
1d550 20 62 79 20 61 20 7a 65 72 6f 20 62 79 74 65 2e   by a zero byte.
1d560 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
1d570 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
1d580 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33  t_prepare_tkt313
1d590 34 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  4(.  void * clie
1d5a0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1d5b0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1d5c0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1d5d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1d5e0 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
1d5f0 64 62 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  db;.  static con
1d600 73 74 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d  st char zSql[] =
1d610 20 22 5c 30 30 30 53 45 4c 45 43 54 20 31 22 3b   "\000SELECT 1";
1d620 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1d630 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1d640 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
1d650 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
1d660 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1d670 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d680 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1d690 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1d6a0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1d6b0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1d6c0 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74  ]), " DB sql byt
1d6d0 65 73 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b  es tailvar", 0);
1d6e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d6f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1d700 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1d710 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1d720 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1d730 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1d740 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1d750 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
1d760 28 64 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30  (db, &zSql[1], 0
1d770 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1d780 61 73 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54  assert(rc==SQLIT
1d790 45 5f 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30  E_OK || pStmt==0
1d7a0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1d7b0 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
1d7c0 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65  rp, db, rc) ) re
1d7d0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1d7e0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1d7f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
1d800 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t( pStmt==0 );. 
1d810 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
1d820 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
1d830 2c 20 7a 42 75 66 2c 20 22 28 25 64 29 20 22 2c  , zBuf, "(%d) ",
1d840 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70   rc);.    Tcl_Ap
1d850 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d860 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65 33  p, zBuf, sqlite3
1d870 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29 3b  _errmsg(db), 0);
1d880 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1d890 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1d8a0 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
1d8b0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1d8c0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1d8d0 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
1d8e0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1d8f0 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70  RROR;.    Tcl_Ap
1d900 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d910 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d  p, zBuf, 0);.  }
1d920 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1d930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1d940 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
1d950 65 31 36 20 44 42 20 73 71 6c 20 62 79 74 65 73  e16 DB sql bytes
1d960 20 74 61 69 6c 76 61 72 0a 2a 2a 0a 2a 2a 20 43   tailvar.**.** C
1d970 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
1d980 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
1d990 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
1d9a0 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
1d9b0 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
1d9c0 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
1d9d0 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
1d9e0 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
1d9f0 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
1da00 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
1da10 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
1da20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
1da30 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
1da40 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
1da50 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
1da60 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1da70 43 4c 41 50 49 20 74 65 73 74 5f 70 72 65 70 61  CLAPI test_prepa
1da80 72 65 31 36 28 0a 20 20 76 6f 69 64 20 2a 20 63  re16(.  void * c
1da90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1daa0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1dab0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1dac0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1dad0 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20  jv[].){.#ifndef 
1dae0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1daf0 36 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  6.  sqlite3 *db;
1db00 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
1db10 53 71 6c 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  Sql;.  const voi
1db20 64 20 2a 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20  d *zTail = 0;.  
1db30 54 63 6c 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d  Tcl_Obj *pTail =
1db40 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
1db50 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1db60 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20   char zBuf[50]; 
1db70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
1db80 20 62 79 74 65 73 3b 20 20 20 20 20 20 20 20 20   bytes;         
1db90 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
1dba0 74 65 67 65 72 20 73 70 65 63 69 66 69 65 64 20  teger specified 
1dbb0 61 73 20 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e  as arg 3 */.  in
1dbc0 74 20 6f 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20  t objlen;       
1dbd0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 62          /* The b
1dbe0 79 74 65 2d 61 72 72 61 79 20 6c 65 6e 67 74 68  yte-array length
1dbf0 20 6f 66 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20   of arg 2 */..  
1dc00 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f  if( objc!=5 && o
1dc10 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
1dc20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1dc30 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1dc40 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1dc50 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1dc60 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1dc70 30 5d 29 2c 20 22 20 44 42 20 73 71 6c 20 62 79  0]), " DB sql by
1dc80 74 65 73 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20  tes ?tailvar?", 
1dc90 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1dca0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1dcb0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1dcc0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1dcd0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1dce0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1dcf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
1dd00 20 3d 20 54 63 6c 5f 47 65 74 42 79 74 65 41 72   = Tcl_GetByteAr
1dd10 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  rayFromObj(objv[
1dd20 32 5d 2c 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20  2], &objlen);.  
1dd30 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1dd40 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1dd50 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 20 29  jv[3], &bytes) )
1dd60 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1dd70 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
1dd80 65 33 5f 70 72 65 70 61 72 65 31 36 28 64 62 2c  e3_prepare16(db,
1dd90 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
1dda0 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
1ddb0 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69  &zTail : 0);.  i
1ddc0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
1ddd0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
1dde0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
1ddf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1de00 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1de10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1de20 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29  .  if( objc>=5 )
1de30 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20  {.    if( zTail 
1de40 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20  ){.      objlen 
1de50 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29  = objlen - (int)
1de60 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38  ((u8 *)zTail-(u8
1de70 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65   *)zSql);.    }e
1de80 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  lse{.      objle
1de90 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 0;.    }.   
1dea0 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77   pTail = Tcl_New
1deb0 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38  ByteArrayObj((u8
1dec0 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e   *)zTail, objlen
1ded0 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
1dee0 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
1def0 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
1df00 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
1df10 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29  4], 0, pTail, 0)
1df20 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
1df30 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
1df40 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
1df50 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1df60 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1df70 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1df80 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
1df90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dfa0 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
1dfb0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1dfc0 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
1dfd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1dfe0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
1dff0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1e000 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 70  Usage: sqlite3_p
1e010 72 65 70 61 72 65 31 36 5f 76 32 20 44 42 20 73  repare16_v2 DB s
1e020 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c 76 61  ql bytes ?tailva
1e030 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65  r?.**.** Compile
1e040 20 75 70 20 74 6f 20 3c 62 79 74 65 73 3e 20 62   up to <bytes> b
1e050 79 74 65 73 20 6f 66 20 74 68 65 20 73 75 70 70  ytes of the supp
1e060 6c 69 65 64 20 53 51 4c 20 73 74 72 69 6e 67 20  lied SQL string 
1e070 3c 73 71 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64  <sql> using.** d
1e080 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c  atabase handle <
1e090 44 42 3e 2e 20 54 68 65 20 70 61 72 61 6d 65 74  DB>. The paramet
1e0a0 65 72 20 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20  er <tailval> is 
1e0b0 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c  the name of a gl
1e0c0 6f 62 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  obal.** variable
1e0d0 20 74 68 61 74 20 69 73 20 73 65 74 20 74 6f 20   that is set to 
1e0e0 74 68 65 20 75 6e 75 73 65 64 20 70 6f 72 74 69  the unused porti
1e0f0 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20  on of <sql> (if 
1e100 61 6e 79 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20  any). A.** STMT 
1e110 68 61 6e 64 6c 65 20 69 73 20 72 65 74 75 72 6e  handle is return
1e120 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
1e130 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
1e140 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76  test_prepare16_v
1e150 32 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  2(.  void * clie
1e160 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1e170 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e180 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1e190 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1e1a0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1e1b0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1e1c0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e1d0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 53 71 6c  const void *zSql
1e1e0 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ;.  const void *
1e1f0 7a 54 61 69 6c 20 3d 20 30 3b 0a 20 20 54 63 6c  zTail = 0;.  Tcl
1e200 5f 4f 62 6a 20 2a 70 54 61 69 6c 20 3d 20 30 3b  _Obj *pTail = 0;
1e210 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1e220 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
1e230 61 72 20 7a 42 75 66 5b 35 30 5d 3b 20 0a 20 20  ar zBuf[50]; .  
1e240 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 79  int rc;.  int by
1e250 74 65 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  tes;            
1e260 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 74 65 67      /* The integ
1e270 65 72 20 73 70 65 63 69 66 69 65 64 20 61 73 20  er specified as 
1e280 61 72 67 20 33 20 2a 2f 0a 20 20 69 6e 74 20 6f  arg 3 */.  int o
1e290 62 6a 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20  bjlen;          
1e2a0 20 20 20 20 20 2f 2a 20 54 68 65 20 62 79 74 65       /* The byte
1e2b0 2d 61 72 72 61 79 20 6c 65 6e 67 74 68 20 6f 66  -array length of
1e2c0 20 61 72 67 20 32 20 2a 2f 0a 0a 20 20 69 66 28   arg 2 */..  if(
1e2d0 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63   objc!=5 && objc
1e2e0 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1e2f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e300 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e310 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e320 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1e330 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1e340 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
1e350 20 3f 74 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b   ?tailvar?", 0);
1e360 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e370 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1e380 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1e390 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1e3a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
1e3b0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1e3c0 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20  ERROR;.  zSql = 
1e3d0 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
1e3e0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
1e3f0 20 26 6f 62 6a 6c 65 6e 29 3b 0a 20 20 69 66 28   &objlen);.  if(
1e400 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1e410 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1e420 33 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  3], &bytes) ) re
1e430 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1e440 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1e450 70 72 65 70 61 72 65 31 36 5f 76 32 28 64 62 2c  prepare16_v2(db,
1e460 20 7a 53 71 6c 2c 20 62 79 74 65 73 2c 20 26 70   zSql, bytes, &p
1e470 53 74 6d 74 2c 20 6f 62 6a 63 3e 3d 35 20 3f 20  Stmt, objc>=5 ? 
1e480 26 7a 54 61 69 6c 20 3a 20 30 29 3b 0a 20 20 69  &zTail : 0);.  i
1e490 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
1e4a0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
1e4b0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
1e4c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1e4d0 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
1e4e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1e4f0 0a 20 20 69 66 28 20 6f 62 6a 63 3e 3d 35 20 29  .  if( objc>=5 )
1e500 7b 0a 20 20 20 20 69 66 28 20 7a 54 61 69 6c 20  {.    if( zTail 
1e510 29 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20  ){.      objlen 
1e520 3d 20 6f 62 6a 6c 65 6e 20 2d 20 28 69 6e 74 29  = objlen - (int)
1e530 28 28 75 38 20 2a 29 7a 54 61 69 6c 2d 28 75 38  ((u8 *)zTail-(u8
1e540 20 2a 29 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65   *)zSql);.    }e
1e550 6c 73 65 7b 0a 20 20 20 20 20 20 6f 62 6a 6c 65  lse{.      objle
1e560 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  n = 0;.    }.   
1e570 20 70 54 61 69 6c 20 3d 20 54 63 6c 5f 4e 65 77   pTail = Tcl_New
1e580 42 79 74 65 41 72 72 61 79 4f 62 6a 28 28 75 38  ByteArrayObj((u8
1e590 20 2a 29 7a 54 61 69 6c 2c 20 6f 62 6a 6c 65 6e   *)zTail, objlen
1e5a0 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
1e5b0 65 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a  efCount(pTail);.
1e5c0 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61      Tcl_ObjSetVa
1e5d0 72 32 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  r2(interp, objv[
1e5e0 34 5d 2c 20 30 2c 20 70 54 61 69 6c 2c 20 30 29  4], 0, pTail, 0)
1e5f0 3b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65  ;.    Tcl_DecrRe
1e600 66 43 6f 75 6e 74 28 70 54 61 69 6c 29 3b 0a 20  fCount(pTail);. 
1e610 20 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20   }..  if( pStmt 
1e620 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
1e630 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65  e3TestMakePointe
1e640 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75  rStr(interp, zBu
1e650 66 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75  f, pStmt) ) retu
1e660 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1e670 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
1e680 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1e690 66 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  f, 0);.#endif /*
1e6a0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1e6b0 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
1e6c0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1e6d0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
1e6e0 70 65 6e 20 66 69 6c 65 6e 61 6d 65 20 3f 6f 70  pen filename ?op
1e6f0 74 69 6f 6e 73 2d 6c 69 73 74 3f 0a 2a 2f 0a 73  tions-list?.*/.s
1e700 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
1e710 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 6f 70 65  _TCLAPI test_ope
1e720 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
1e730 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1e740 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1e750 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1e760 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1e770 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ].){.  const cha
1e780 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  r *zFilename;.  
1e790 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
1e7a0 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a  har zBuf[100];..
1e7b0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
1e7c0 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63   objc!=2 && objc
1e7d0 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=1 ){.    Tcl_A
1e7e0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e7f0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e800 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e810 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1e820 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1e830 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74  , " filename opt
1e840 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a  ions-list", 0);.
1e850 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1e860 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69  RROR;.  }..  zFi
1e870 6c 65 6e 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20  lename = objc>1 
1e880 3f 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  ? Tcl_GetString(
1e890 6f 62 6a 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20  objv[1]) : 0;.  
1e8a0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69  sqlite3_open(zFi
1e8b0 6c 65 6e 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20  lename, &db);.  
1e8c0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
1e8d0 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72  stMakePointerStr
1e8e0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 64  (interp, zBuf, d
1e8f0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1e900 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70  ERROR;.  Tcl_App
1e910 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1e920 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
1e930 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1e940 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1e950 69 74 65 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c  ite3_open_v2 FIL
1e960 45 4e 41 4d 45 20 46 4c 41 47 53 20 56 46 53 0a  ENAME FLAGS VFS.
1e970 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
1e980 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
1e990 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f 69 64  _open_v2(.  void
1e9a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1e9b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e9c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1e9d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1e9e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f  T objv[].){.  co
1e9f0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1ea00 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ame;.  const cha
1ea10 72 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74 20 66  r *zVfs;.  int f
1ea20 6c 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69  lags = 0;.  sqli
1ea30 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
1ea40 63 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  c;.  char zBuf[1
1ea50 30 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c 61  00];..  int nFla
1ea60 67 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61  g;.  Tcl_Obj **a
1ea70 70 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69 3b 0a  pFlag;.  int i;.
1ea80 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
1ea90 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1eaa0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1eab0 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d  , objv, "FILENAM
1eac0 45 20 46 4c 41 47 53 20 56 46 53 22 29 3b 0a 20  E FLAGS VFS");. 
1ead0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1eae0 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65  ROR;.  }.  zFile
1eaf0 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  name = Tcl_GetSt
1eb00 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
1eb10 20 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53   zVfs = Tcl_GetS
1eb20 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
1eb30 20 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d 3d 30    if( zVfs[0]==0
1eb40 78 30 30 20 29 20 7a 56 66 73 20 3d 20 30 3b 0a  x00 ) zVfs = 0;.
1eb50 0a 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74  .  rc = Tcl_List
1eb60 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
1eb70 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1eb80 26 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61 67 29  &nFlag, &apFlag)
1eb90 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
1eba0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1ebb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 6c    for(i=0; i<nFl
1ebc0 61 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e  ag; i++){.    in
1ebd0 74 20 69 46 6c 61 67 3b 0a 20 20 20 20 73 74 72  t iFlag;.    str
1ebe0 75 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b 0a 20  uct OpenFlag {. 
1ebf0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1ec00 2a 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20 69 6e  *zFlag;.      in
1ec10 74 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20 61 46  t flag;.    } aF
1ec20 6c 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  lag[] = {.      
1ec30 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  { "SQLITE_OPEN_R
1ec40 45 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49 54 45  EADONLY", SQLITE
1ec50 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d  _OPEN_READONLY }
1ec60 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1ec70 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
1ec80 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ", SQLITE_OPEN_R
1ec90 45 41 44 57 52 49 54 45 20 7d 2c 0a 20 20 20 20  EADWRITE },.    
1eca0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1ecb0 5f 43 52 45 41 54 45 22 2c 20 53 51 4c 49 54 45  _CREATE", SQLITE
1ecc0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a  _OPEN_CREATE },.
1ecd0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1ece0 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
1ecf0 53 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  SE", SQLITE_OPEN
1ed00 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7d  _DELETEONCLOSE }
1ed10 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1ed20 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45  E_OPEN_EXCLUSIVE
1ed30 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  ", SQLITE_OPEN_E
1ed40 58 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20 20 20  XCLUSIVE },.    
1ed50 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1ed60 5f 41 55 54 4f 50 52 4f 58 59 22 2c 20 53 51 4c  _AUTOPROXY", SQL
1ed70 49 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f  ITE_OPEN_AUTOPRO
1ed80 58 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  XY },.      { "S
1ed90 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
1eda0 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB", SQLITE_OPEN
1edb0 5f 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20 20 20  _MAIN_DB },.    
1edc0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1edd0 5f 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c 49 54  _TEMP_DB", SQLIT
1ede0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7d  E_OPEN_TEMP_DB }
1edf0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1ee00 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
1ee10 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  _DB", SQLITE_OPE
1ee20 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7d  N_TRANSIENT_DB }
1ee30 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1ee40 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1ee50 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1ee60 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d  N_MAIN_JOURNAL }
1ee70 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1ee80 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
1ee90 4e 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  NAL", SQLITE_OPE
1eea0 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d  N_TEMP_JOURNAL }
1eeb0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1eec0 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
1eed0 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L", SQLITE_OPEN_
1eee0 53 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20  SUBJOURNAL },.  
1eef0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1ef00 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41  EN_MASTER_JOURNA
1ef10 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L", SQLITE_OPEN_
1ef20 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d  MASTER_JOURNAL }
1ef30 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1ef40 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c  E_OPEN_NOMUTEX",
1ef50 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
1ef60 55 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20  UTEX },.      { 
1ef70 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c  "SQLITE_OPEN_FUL
1ef80 4c 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f  LMUTEX", SQLITE_
1ef90 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7d  OPEN_FULLMUTEX }
1efa0 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54  ,.      { "SQLIT
1efb0 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
1efc0 48 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  HE", SQLITE_OPEN
1efd0 5f 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a  _SHAREDCACHE },.
1efe0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1eff0 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
1f000 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1f010 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a  PRIVATECACHE },.
1f020 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1f030 4f 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c 49 54  OPEN_WAL", SQLIT
1f040 45 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20  E_OPEN_WAL },.  
1f050 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1f060 45 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54 45 5f  EN_URI", SQLITE_
1f070 4f 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20 20 20  OPEN_URI },.    
1f080 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d    { 0, 0 }.    }
1f090 3b 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47  ;.    rc = Tcl_G
1f0a0 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74  etIndexFromObjSt
1f0b0 72 75 63 74 28 69 6e 74 65 72 70 2c 20 61 70 46  ruct(interp, apF
1f0c0 6c 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c 20 73  lag[i], aFlag, s
1f0d0 69 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29 2c  izeof(aFlag[0]),
1f0e0 20 0a 20 20 20 20 20 20 20 20 22 66 6c 61 67 22   .        "flag"
1f0f0 2c 20 30 2c 20 26 69 46 6c 61 67 0a 20 20 20 20  , 0, &iFlag.    
1f100 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54  );.    if( rc!=T
1f110 43 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  CL_OK ) return r
1f120 63 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  c;.    flags |= 
1f130 61 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66 6c 61  aFlag[iFlag].fla
1f140 67 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  g;.  }..  rc = s
1f150 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a  qlite3_open_v2(z
1f160 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c 20 66  Filename, &db, f
1f170 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 69  lags, zVfs);.  i
1f180 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1f190 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1f1a0 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
1f1b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f1c0 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
1f1d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1f1e0 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
1f1f0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1f200 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1f210 5f 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65  _open16 filename
1f220 20 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74   options.*/.stat
1f230 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1f240 4c 41 50 49 20 74 65 73 74 5f 6f 70 65 6e 31 36  LAPI test_open16
1f250 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1f260 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1f270 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1f280 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1f290 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1f2a0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1f2b0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1f2c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
1f2d0 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
1f2e0 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75   *db;.  char zBu
1f2f0 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  f[100];..  if( o
1f300 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1f310 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f320 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1f330 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1f340 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1f350 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1f360 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20  0]), " filename 
1f370 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30  options-list", 0
1f380 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1f390 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1f3a0 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f  zFilename = Tcl_
1f3b0 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1f3c0 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
1f3d0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  .  sqlite3_open1
1f3e0 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  6(zFilename, &db
1f3f0 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69  );.  .  if( sqli
1f400 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1f410 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1f420 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
1f430 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1f440 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1f450 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1f460 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1f470 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1f480 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f490 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1f4a0 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
1f4b0 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69  e16 <UTF-16 stri
1f4c0 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ng>.**.** Return
1f4d0 20 31 20 69 66 20 74 68 65 20 73 75 70 70 6c 69   1 if the suppli
1f4e0 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ed argument is a
1f4f0 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
1f500 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f  atement, or zero
1f510 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
1f520 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
1f530 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
1f540 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20 76 6f  complete16(.  vo
1f550 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f560 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f570 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f580 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f590 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1f5a0 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
1f5b0 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 29  E_OMIT_COMPLETE)
1f5c0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1f5d0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 0a  ITE_OMIT_UTF16).
1f5e0 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a 0a 20    char *zBuf;.. 
1f5f0 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1f600 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1f610 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1f620 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36 20 73  objv, "<utf-16 s
1f630 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ql>");.    retur
1f640 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f650 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63 68 61 72  ..  zBuf = (char
1f660 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72  *)Tcl_GetByteArr
1f670 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31  ayFromObj(objv[1
1f680 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ], 0);.  Tcl_Set
1f690 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1f6a0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1f6b0 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 65  sqlite3_complete
1f6c0 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65 6e 64  16(zBuf)));.#end
1f6d0 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
1f6e0 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20 53 51  T_COMPLETE && SQ
1f6f0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
1f700 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  */.  return TCL_
1f710 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1f720 67 65 3a 20 73 71 6c 69 74 65 33 5f 6e 6f 72 6d  ge: sqlite3_norm
1f730 61 6c 69 7a 65 20 53 51 4c 0a 2a 2a 0a 2a 2a 20  alize SQL.**.** 
1f740 52 65 74 75 72 6e 20 74 68 65 20 6e 6f 72 6d 61  Return the norma
1f750 6c 69 7a 65 64 20 76 61 6c 75 65 20 66 6f 72 20  lized value for 
1f760 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
1f770 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1f780 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
1f790 73 74 5f 6e 6f 72 6d 61 6c 69 7a 65 28 0a 20 20  st_normalize(.  
1f7a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1f7b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1f7c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1f7d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1f7e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1f7f0 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1f800 63 68 61 72 20 2a 7a 4e 6f 72 6d 3b 0a 20 20 65  char *zNorm;.  e
1f810 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69  xtern char *sqli
1f820 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 28 63 6f  te3_normalize(co
1f830 6e 73 74 20 63 68 61 72 2a 29 3b 0a 0a 20 20 69  nst char*);..  i
1f840 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
1f850 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
1f860 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
1f870 6a 76 2c 20 22 53 51 4c 22 29 3b 0a 20 20 20 20  jv, "SQL");.    
1f880 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f890 3b 0a 20 20 7d 0a 0a 20 20 7a 53 71 6c 20 3d 20  ;.  }..  zSql = 
1f8a0 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 53 74  (char*)Tcl_GetSt
1f8b0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
1f8c0 20 7a 4e 6f 72 6d 20 3d 20 73 71 6c 69 74 65 33   zNorm = sqlite3
1f8d0 5f 6e 6f 72 6d 61 6c 69 7a 65 28 7a 53 71 6c 29  _normalize(zSql)
1f8e0 3b 0a 20 20 69 66 28 20 7a 4e 6f 72 6d 20 29 7b  ;.  if( zNorm ){
1f8f0 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
1f900 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1f910 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
1f920 4e 6f 72 6d 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Norm, -1));.    
1f930 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 6f  sqlite3_free(zNo
1f940 72 6d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rm);.  }.  retur
1f950 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1f960 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1f970 33 5f 73 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a  3_step STMT.**.*
1f980 2a 20 41 64 76 61 6e 63 65 20 74 68 65 20 73 74  * Advance the st
1f990 61 74 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e  atement to the n
1f9a0 65 78 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74  ext row..*/.stat
1f9b0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
1f9c0 4c 41 50 49 20 74 65 73 74 5f 73 74 65 70 28 0a  LAPI test_step(.
1f9d0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f9e0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f9f0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1fa00 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1fa10 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1fa20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1fa30 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
1fa40 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
1fa50 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
1fa60 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
1fa70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
1fa80 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
1fa90 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
1faa0 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
1fab0 22 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20  " STMT", 0);.   
1fac0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fad0 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
1fae0 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
1faf0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1fb00 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
1fb10 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1fb20 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1fb30 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1fb40 6d 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72  mt);..  /* if( r
1fb50 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26  c!=SQLITE_DONE &
1fb60 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57  & rc!=SQLITE_ROW
1fb70 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1fb80 52 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65  ROR; */.  Tcl_Se
1fb90 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1fba0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1fbb0 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
1fbc0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1fbd0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
1fbe0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
1fbf0 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ql(.  void * cli
1fc00 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1fc10 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1fc20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1fc30 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1fc40 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1fc50 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
1fc60 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1fc70 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1fc80 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1fc90 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
1fca0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1fcb0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1fcc0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1fcd0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1fce0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1fcf0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1fd00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
1fd10 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1fd20 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
1fd30 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20 54 43  3_sql(pStmt), TC
1fd40 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72  L_VOLATILE);.  r
1fd50 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1fd60 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
1fd70 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 65 78  E_TCLAPI test_ex
1fd80 5f 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  _sql(.  void * c
1fd90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1fda0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1fdb0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1fdc0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1fdd0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1fde0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1fdf0 20 63 68 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28   char *z;..  if(
1fe00 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1fe10 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
1fe20 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
1fe30 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72  , "STMT");.    r
1fe40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1fe50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1fe60 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1fe70 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1fe80 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1fe90 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1fea0 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73 71 6c  ERROR;.  z = sql
1feb0 69 74 65 33 5f 65 78 70 61 6e 64 65 64 5f 73 71  ite3_expanded_sq
1fec0 6c 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f  l(pStmt);.  Tcl_
1fed0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1fee0 2c 20 7a 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  , z, TCL_VOLATIL
1fef0 45 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  E);.  sqlite3_fr
1ff00 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
1ff10 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1ff20 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1ff30 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 53 54 4d  column_count STM
1ff40 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
1ff50 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f  the number of co
1ff60 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64 20 62  lumns returned b
1ff70 79 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  y the sql statem
1ff80 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61  ent STMT..*/.sta
1ff90 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
1ffa0 43 4c 41 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d  CLAPI test_colum
1ffb0 6e 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20  n_count(.  void 
1ffc0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1ffd0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1ffe0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1fff0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
20000 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
20010 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
20020 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
20030 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
20040 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
20050 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
20060 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
20070 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
20080 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
20090 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
200a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
200b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
200c0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
200d0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
200e0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
200f0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
20100 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
20110 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
20120 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
20130 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
20140 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53  _column_count(pS
20150 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
20160 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
20170 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
20180 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 53 54 4d  _column_type STM
20190 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
201a0 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 6f  eturn the type o
201b0 66 20 74 68 65 20 64 61 74 61 20 69 6e 20 63 6f  f the data in co
201c0 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20 6f 66  lumn 'column' of
201d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 72 6f 77   the current row
201e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
201f0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
20200 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28 0a  st_column_type(.
20210 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
20220 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
20230 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
20240 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
20250 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
20260 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
20270 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63   *pStmt;.  int c
20280 6f 6c 3b 0a 20 20 69 6e 74 20 74 70 3b 0a 0a 20  ol;.  int tp;.. 
20290 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
202a0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
202b0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
202c0 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
202d0 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
202e0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
202f0 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
20300 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
20310 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
20320 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
20330 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
20340 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
20350 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
20360 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
20370 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
20380 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
20390 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
203a0 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
203b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
203c0 20 74 70 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   tp = sqlite3_co
203d0 6c 75 6d 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c  lumn_type(pStmt,
203e0 20 63 6f 6c 29 3b 0a 20 20 73 77 69 74 63 68 28   col);.  switch(
203f0 20 74 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   tp ){.    case 
20400 53 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20  SQLITE_INTEGER: 
20410 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65  .      Tcl_SetRe
20420 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 49 4e  sult(interp, "IN
20430 54 45 47 45 52 22 2c 20 54 43 4c 5f 53 54 41 54  TEGER", TCL_STAT
20440 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
20450 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
20460 54 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 54  TE_NULL:.      T
20470 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
20480 65 72 70 2c 20 22 4e 55 4c 4c 22 2c 20 54 43 4c  erp, "NULL", TCL
20490 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20 20  _STATIC); .     
204a0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
204b0 20 53 51 4c 49 54 45 5f 46 4c 4f 41 54 3a 0a 20   SQLITE_FLOAT:. 
204c0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
204d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 46 4c 4f 41  lt(interp, "FLOA
204e0 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  T", TCL_STATIC);
204f0 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
20500 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
20510 45 58 54 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  EXT:.      Tcl_S
20520 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
20530 20 22 54 45 58 54 22 2c 20 54 43 4c 5f 53 54 41   "TEXT", TCL_STA
20540 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
20550 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  ak;.    case SQL
20560 49 54 45 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20  ITE_BLOB:.      
20570 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
20580 74 65 72 70 2c 20 22 42 4c 4f 42 22 2c 20 54 43  terp, "BLOB", TC
20590 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
205a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
205b0 61 75 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65  ault:.      asse
205c0 72 74 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  rt(0);.  }..  re
205d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
205e0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
205f0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
20600 34 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  4 STMT column.**
20610 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
20620 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63  ata in column 'c
20630 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75  olumn' of the cu
20640 72 72 65 6e 74 20 72 6f 77 20 63 61 73 74 20 61  rrent row cast a
20650 73 20 61 6e 0a 2a 2a 20 77 69 64 65 20 28 36 34  s an.** wide (64
20660 2d 62 69 74 29 20 69 6e 74 65 67 65 72 2e 0a 2a  -bit) integer..*
20670 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
20680 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
20690 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20  column_int64(.  
206a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
206b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
206c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
206d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
206e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
206f0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20700 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
20710 3b 0a 20 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20  ;.  i64 iVal;.. 
20720 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
20730 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
20740 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
20750 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
20760 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
20770 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
20780 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
20790 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
207a0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
207b0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
207c0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
207d0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
207e0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
207f0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
20800 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
20810 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
20820 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
20830 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
20840 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
20850 20 69 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f   iVal = sqlite3_
20860 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74  column_int64(pSt
20870 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f  mt, col);.  Tcl_
20880 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
20890 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  erp, Tcl_NewWide
208a0 49 6e 74 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20  IntObj(iVal));. 
208b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
208c0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
208d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
208e0 6c 6f 62 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  lob STMT column.
208f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
20900 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
20910 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20  _column_blob(.  
20920 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
20930 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
20940 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
20950 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
20960 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
20970 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20980 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
20990 3b 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20  ;..  int len;.  
209a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
209b0 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  b;..  if( objc!=
209c0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
209d0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
209e0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
209f0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
20a00 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
20a10 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
20a20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20  " STMT column", 
20a30 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
20a40 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
20a50 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
20a60 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
20a70 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
20a80 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
20a90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
20aa0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
20ab0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
20ac0 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29  objv[2], &col) )
20ad0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
20ae0 52 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69  R;..  len = sqli
20af0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
20b00 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20  (pStmt, col);.  
20b10 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
20b20 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
20b30 74 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53  t, col);.  Tcl_S
20b40 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
20b50 72 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  rp, Tcl_NewByteA
20b60 72 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c  rrayObj(pBlob, l
20b70 65 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  en));.  return T
20b80 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
20b90 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
20ba0 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d  olumn_double STM
20bb0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
20bc0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69  eturn the data i
20bd0 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
20be0 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
20bf0 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64   row cast as a d
20c00 6f 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ouble..*/.static
20c10 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
20c20 50 49 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64  PI test_column_d
20c30 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
20c40 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
20c50 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
20c60 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
20c70 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
20c80 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
20c90 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
20ca0 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75    int col;.  dou
20cb0 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28  ble rVal;..  if(
20cc0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
20cd0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
20ce0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
20cf0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
20d00 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
20d10 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
20d20 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
20d30 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
20d40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
20d50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
20d60 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
20d70 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
20d80 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
20d90 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
20da0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
20db0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
20dc0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
20dd0 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
20de0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61  CL_ERROR;..  rVa
20df0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
20e00 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
20e10 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
20e20 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
20e30 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  , Tcl_NewDoubleO
20e40 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(rVal));.  ret
20e50 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
20e60 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
20e70 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53  te3_data_count S
20e80 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
20e90 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
20ea0 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
20eb0 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
20ec0 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
20ed0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
20ee0 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 61 74  _TCLAPI test_dat
20ef0 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64 20  a_count(.  void 
20f00 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
20f10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
20f20 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
20f30 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
20f40 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
20f50 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
20f60 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
20f70 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
20f80 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
20f90 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
20fa0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
20fb0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
20fc0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
20fd0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
20fe0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
20ff0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
21000 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
21010 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
21020 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
21030 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
21040 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
21050 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
21060 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
21070 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33  ewIntObj(sqlite3
21080 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53 74 6d  _data_count(pStm
21090 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  t)));.  return T
210a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
210b0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
210c0 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20  olumn_text STMT 
210d0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
210e0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
210f0 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54 4d 54  mn_decltype STMT
21100 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
21110 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
21120 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f  umn_name STMT co
21130 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  lumn.*/.static i
21140 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
21150 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 28   test_stmt_utf8(
21160 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
21170 44 61 74 61 2c 20 20 20 20 20 20 20 20 2f 2a 20  Data,        /* 
21180 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69 74  Pointer to SQLit
21190 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20 74  e API function t
211a0 6f 20 62 65 20 69 6e 76 6f 6b 65 20 2a 2f 0a 20  o be invoke */. 
211b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
211c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
211d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
211e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
211f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
21200 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
21210 63 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 78 46  const char *(*xF
21220 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
21230 74 2a 2c 20 69 6e 74 29 3b 0a 20 20 63 6f 6e 73  t*, int);.  cons
21240 74 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 0a 20  t char *zRet;.. 
21250 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e 73 74 20   xFunc = (const 
21260 63 68 61 72 20 2a 28 2a 29 28 73 71 6c 69 74 65  char *(*)(sqlite
21270 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c  3_stmt*, int))cl
21280 69 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20  ientData;.  if( 
21290 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
212a0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
212b0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
212c0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
212d0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
212e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
212f0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
21300 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
21310 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21320 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
21330 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
21340 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
21350 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
21360 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
21370 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
21380 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
21390 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
213a0 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
213b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 52 65 74 20  L_ERROR;.  zRet 
213c0 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
213d0 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 52 65 74 20  ol);.  if( zRet 
213e0 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
213f0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
21400 61 72 20 2a 29 7a 52 65 74 2c 20 30 29 3b 0a 20  ar *)zRet, 0);. 
21410 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
21420 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  OK;.}..static in
21430 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
21440 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  test_global_reco
21450 76 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ver(.  void * cl
21460 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
21470 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
21480 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
21490 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
214a0 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
214b0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
214c0 43 41 54 45 44 0a 20 20 69 6e 74 20 72 63 3b 0a  CATED.  int rc;.
214d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
214e0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
214f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
21500 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20 20   objv, "");.    
21510 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21520 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
21530 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f  ite3_global_reco
21540 76 65 72 28 29 3b 0a 20 20 54 63 6c 5f 53 65 74  ver();.  Tcl_Set
21550 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
21560 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
21570 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
21580 49 43 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  IC);.#endif.  re
21590 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
215a0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
215b0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
215c0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a   STMT column.**.
215d0 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
215e0 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
215f0 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  e STMT column.**
21600 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
21610 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53  e3_column_name S
21620 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74  TMT column.*/.st
21630 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
21640 54 43 4c 41 50 49 20 74 65 73 74 5f 73 74 6d 74  TCLAPI test_stmt
21650 5f 75 74 66 31 36 28 0a 20 20 76 6f 69 64 20 2a  _utf16(.  void *
21660 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20   clientData,    
21670 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
21680 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
21690 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
216a0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
216b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
216c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
216d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
216e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
216f0 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
21700 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
21710 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 54  ;.  int col;.  T
21720 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 20 20  cl_Obj *pRet;.  
21730 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
21740 65 31 36 3b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  e16;.  const voi
21750 64 20 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  d *(*xFunc)(sqli
21760 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b  te3_stmt*, int);
21770 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f 6e  ..  xFunc = (con
21780 73 74 20 76 6f 69 64 20 2a 28 2a 29 28 73 71 6c  st void *(*)(sql
21790 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29  ite3_stmt*, int)
217a0 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 69  )clientData;.  i
217b0 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
217c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
217d0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
217e0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
217f0 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20   be \"", .      
21800 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
21810 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20  bjv[0]), " STMT 
21820 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20  column", 0);.   
21830 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21840 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
21850 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
21860 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
21870 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
21880 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
21890 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
218a0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
218b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
218c0 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e  , &col) ) return
218d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a   TCL_ERROR;..  z
218e0 4e 61 6d 65 31 36 20 3d 20 78 46 75 6e 63 28 70  Name16 = xFunc(p
218f0 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66  Stmt, col);.  if
21900 28 20 7a 4e 61 6d 65 31 36 20 29 7b 0a 20 20 20  ( zName16 ){.   
21910 20 69 6e 74 20 6e 3b 0a 20 20 20 20 63 6f 6e 73   int n;.    cons
21920 74 20 63 68 61 72 20 2a 7a 20 3d 20 7a 4e 61 6d  t char *z = zNam
21930 65 31 36 3b 0a 20 20 20 20 66 6f 72 28 6e 3d 30  e16;.    for(n=0
21940 3b 20 7a 5b 6e 5d 20 7c 7c 20 7a 5b 6e 2b 31 5d  ; z[n] || z[n+1]
21950 3b 20 6e 2b 3d 32 29 7b 7d 0a 20 20 20 20 70 52  ; n+=2){}.    pR
21960 65 74 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65  et = Tcl_NewByte
21970 41 72 72 61 79 4f 62 6a 28 7a 4e 61 6d 65 31 36  ArrayObj(zName16
21980 2c 20 6e 2b 32 29 3b 0a 20 20 20 20 54 63 6c 5f  , n+2);.    Tcl_
21990 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
219a0 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 0a  erp, pRet);.  }.
219b0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
219c0 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
219d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
219e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
219f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
21a00 69 6e 74 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a  int STMT column.
21a10 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  **.** Usage: sql
21a20 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
21a30 73 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  s STMT column.**
21a40 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74  .** Usage: sqlit
21a50 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31  e3_column_bytes1
21a60 36 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a  6 STMT column.**
21a70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
21a80 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
21a90 74 5f 73 74 6d 74 5f 69 6e 74 28 0a 20 20 76 6f  t_stmt_int(.  vo
21aa0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
21ab0 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
21ac0 6f 20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e  o SQLite API fun
21ad0 63 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f  ction to be invo
21ae0 6b 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ked */.  Tcl_Int
21af0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
21b00 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
21b10 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
21b20 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
21b30 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
21b40 20 63 6f 6c 3b 0a 20 20 69 6e 74 20 28 2a 78 46   col;.  int (*xF
21b50 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
21b60 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75  t*, int);..  xFu
21b70 6e 63 20 3d 20 28 69 6e 74 20 28 2a 29 28 73 71  nc = (int (*)(sq
21b80 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
21b90 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ))clientData;.  
21ba0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
21bb0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
21bc0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
21bd0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
21be0 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
21bf0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
21c00 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
21c10 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
21c20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
21c30 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
21c40 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
21c50 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
21c60 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
21c70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
21c80 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
21c90 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
21ca0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
21cb0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
21cc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20  n TCL_ERROR;..  
21cd0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
21ce0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
21cf0 49 6e 74 4f 62 6a 28 78 46 75 6e 63 28 70 53 74  IntObj(xFunc(pSt
21d00 6d 74 2c 20 63 6f 6c 29 29 29 3b 0a 20 20 72 65  mt, col)));.  re
21d10 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
21d20 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
21d30 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20  lite_set_magic  
21d40 44 42 20 20 4d 41 47 49 43 2d 4e 55 4d 42 45 52  DB  MAGIC-NUMBER
21d50 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  .**.** Set the d
21d60 62 2d 3e 6d 61 67 69 63 20 76 61 6c 75 65 2e 20  b->magic value. 
21d70 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
21d80 20 74 65 73 74 20 65 72 72 6f 72 20 72 65 63 6f   test error reco
21d90 76 65 72 79 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 73  very logic..*/.s
21da0 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
21db0 5f 54 43 4c 41 50 49 20 73 71 6c 69 74 65 5f 73  _TCLAPI sqlite_s
21dc0 65 74 5f 6d 61 67 69 63 28 0a 20 20 76 6f 69 64  et_magic(.  void
21dd0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
21de0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
21df0 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
21e00 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
21e10 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
21e20 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
21e30 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
21e40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
21e50 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
21e60 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
21e70 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 22  v[0],.         "
21e80 20 44 42 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a   DB MAGIC", 0);.
21e90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
21ea0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
21eb0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
21ec0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
21ed0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
21ee0 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 73 74 72  ERROR;.  if( str
21ef0 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51  cmp(argv[2], "SQ
21f00 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22  LITE_MAGIC_OPEN"
21f10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
21f20 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
21f30 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c  AGIC_OPEN;.  }el
21f40 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
21f50 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d  gv[2], "SQLITE_M
21f60 41 47 49 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30  AGIC_CLOSED")==0
21f70 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
21f80 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
21f90 5f 43 4c 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65  _CLOSED;.  }else
21fa0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
21fb0 5b 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47  [2], "SQLITE_MAG
21fc0 49 43 5f 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a  IC_BUSY")==0 ){.
21fd0 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
21fe0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
21ff0 59 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  Y;.  }else if( s
22000 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22  trcmp(argv[2], "
22010 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
22020 4f 52 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64  OR")==0 ){.    d
22030 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
22040 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20  E_MAGIC_ERROR;. 
22050 20 7d 65 6c 73 65 20 69 66 28 20 54 63 6c 5f 47   }else if( Tcl_G
22060 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72  etInt(interp, ar
22070 67 76 5b 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62  gv[2], (int*)&db
22080 2d 3e 6d 61 67 69 63 29 20 29 7b 0a 20 20 20 20  ->magic) ){.    
22090 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
220a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
220b0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
220c0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
220d0 69 6e 74 65 72 72 75 70 74 20 20 44 42 20 0a 2a  interrupt  DB .*
220e0 2a 0a 2a 2a 20 54 72 69 67 67 65 72 20 61 6e 20  *.** Trigger an 
220f0 69 6e 74 65 72 72 75 70 74 20 6f 6e 20 44 42 0a  interrupt on DB.
22100 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
22110 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
22120 5f 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f  _interrupt(.  vo
22130 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
22140 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22150 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
22160 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
22170 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
22180 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
22190 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
221a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
221b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
221c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
221d0 72 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30  rgv[0], " DB", 0
221e0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
221f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
22200 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
22210 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
22220 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
22230 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
22240 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62  te3_interrupt(db
22250 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
22260 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
22270 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74  ge: sqlite_delet
22280 65 5f 66 75 6e 63 74 69 6f 6e 20 44 42 20 66 75  e_function DB fu
22290 6e 63 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a  nction-name.**.*
222a0 2a 20 44 65 6c 65 74 65 20 74 68 65 20 75 73 65  * Delete the use
222b0 72 20 66 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63  r function 'func
222c0 74 69 6f 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20  tion-name' from 
222d0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
222e0 44 42 2e 20 49 74 0a 2a 2a 20 69 73 20 61 73 73  DB. It.** is ass
222f0 75 6d 65 64 20 74 68 61 74 20 74 68 65 20 75 73  umed that the us
22300 65 72 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20  er function was 
22310 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38 2c  created as UTF8,
22320 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   any number of.*
22330 2a 20 61 72 67 75 6d 65 6e 74 73 20 28 74 68 65  * arguments (the
22340 20 77 61 79 20 74 68 65 20 54 43 4c 20 69 6e 74   way the TCL int
22350 65 72 66 61 63 65 20 64 6f 65 73 20 69 74 29 2e  erface does it).
22360 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
22370 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 65 6c  QLITE_TCLAPI del
22380 65 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ete_function(.  
22390 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
223a0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
223b0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
223c0 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
223d0 67 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  gv.){.  int rc;.
223e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
223f0 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
22400 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
22410 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
22420 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
22430 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
22440 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
22450 42 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22  B function-name"
22460 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
22470 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22480 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
22490 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
224a0 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
224b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
224c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
224d0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
224e0 61 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c  argv[2], -1, SQL
224f0 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20  ITE_UTF8, 0, 0, 
22500 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74  0, 0);.  Tcl_Set
22510 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
22520 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
22530 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
22540 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
22550 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
22560 73 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c  sage: sqlite_del
22570 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42  ete_collation DB
22580 20 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a   collation-name.
22590 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65  **.** Delete the
225a0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
225b0 6e 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e  nce 'collation-n
225c0 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61  ame' from databa
225d0 73 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42  se handle .** DB
225e0 2e 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20  . It is assumed 
225f0 74 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69  that the collati
22600 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20  on sequence was 
22610 63 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20  created as UTF8 
22620 28 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65  (the .** way the
22630 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64   TCL interface d
22640 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74  oes it)..*/.stat
22650 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
22660 4c 41 50 49 20 64 65 6c 65 74 65 5f 63 6f 6c 6c  LAPI delete_coll
22670 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ation(.  void * 
22680 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
22690 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
226a0 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
226b0 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
226c0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
226d0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
226e0 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
226f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
22700 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
22710 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
22720 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
22730 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74        " DB funct
22740 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20  ion-name", 0);. 
22750 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
22760 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
22770 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
22780 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
22790 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
227a0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
227b0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
227c0 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ation(db, argv[2
227d0 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ], SQLITE_UTF8, 
227e0 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74  0, 0);.  Tcl_Set
227f0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
22800 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
22810 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
22820 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
22830 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
22840 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67 65  sage: sqlite3_ge
22850 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42 0a  t_autocommit DB.
22860 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
22870 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
22880 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74 6c  e DB is currentl
22890 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74  y in auto-commit
228a0 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72 6e   mode..** Return
228b0 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
228c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
228d0 49 54 45 5f 54 43 4c 41 50 49 20 67 65 74 5f 61  ITE_TCLAPI get_a
228e0 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76 6f 69  utocommit(.  voi
228f0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
22900 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
22910 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
22920 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
22930 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33  ){.  char zBuf[3
22940 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  0];.  sqlite3 *d
22950 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
22960 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
22970 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
22980 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
22990 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
229a0 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
229b0 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
229c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
229d0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
229e0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
229f0 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
22a00 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22a10 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  R;.  sqlite3_snp
22a20 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75  rintf(sizeof(zBu
22a30 66 29 2c 20 7a 42 75 66 2c 20 22 25 64 22 2c 20  f), zBuf, "%d", 
22a40 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
22a50 63 6f 6d 6d 69 74 28 64 62 29 29 3b 0a 20 20 54  commit(db));.  T
22a60 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
22a70 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
22a80 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
22a90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
22aa0 65 3a 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  e: sqlite3_busy_
22ab0 74 69 6d 65 6f 75 74 20 44 42 20 4d 53 0a 2a 2a  timeout DB MS.**
22ac0 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79  .** Set the busy
22ad0 20 74 69 6d 65 6f 75 74 2e 20 20 54 68 69 73 20   timeout.  This 
22ae0 69 73 20 6d 6f 72 65 20 65 61 73 69 6c 79 20 64  is more easily d
22af0 6f 6e 65 20 75 73 69 6e 67 20 74 68 65 20 74 69  one using the ti
22b00 6d 65 6f 75 74 0a 2a 2a 20 6d 65 74 68 6f 64 20  meout.** method 
22b10 6f 66 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  of the TCL inter
22b20 66 61 63 65 2e 20 20 42 75 74 20 77 65 20 6e 65  face.  But we ne
22b30 65 64 20 61 20 77 61 79 20 74 6f 20 74 65 73 74  ed a way to test
22b40 20 74 68 65 20 63 61 73 65 0a 2a 2a 20 77 68 65   the case.** whe
22b50 72 65 20 69 74 20 72 65 74 75 72 6e 73 20 53 51  re it returns SQ
22b60 4c 49 54 45 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a  LITE_MISUSE..*/.
22b70 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
22b80 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 62 75  E_TCLAPI test_bu
22b90 73 79 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f  sy_timeout(.  vo
22ba0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
22bb0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
22bc0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
22bd0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
22be0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73  .){.  int rc, ms
22bf0 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  ;.  sqlite3 *db;
22c00 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
22c10 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
22c20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
22c30 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
22c40 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
22c50 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22  v[0], .        "
22c60 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
22c70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22c80 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
22c90 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
22ca0 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
22cb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22cc0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
22cd0 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
22ce0 5d 2c 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e  ], &ms) ) return
22cf0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
22d00 20 3d 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f   = sqlite3_busy_
22d10 74 69 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b  timeout(db, ms);
22d20 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
22d30 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
22d40 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
22d50 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
22d60 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
22d70 61 67 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62  age:  tcl_variab
22d80 6c 65 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45  le_type VARIABLE
22d90 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  NAME.**.** Retur
22da0 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  n the name of th
22db0 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65  e internal repre
22dc0 73 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68  sentation for th
22dd0 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68  e.** value of th
22de0 65 20 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65  e given variable
22df0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
22e00 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 63  SQLITE_TCLAPI tc
22e10 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28  l_variable_type(
22e20 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
22e30 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
22e40 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
22e50 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
22e60 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
22e70 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
22e80 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ar;.  if( objc!=
22e90 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
22ea0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
22eb0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49  , 1, objv, "VARI
22ec0 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75  ABLE");.    retu
22ed0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22ee0 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47  }.  pVar = Tcl_G
22ef0 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c  etVar2Ex(interp,
22f00 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
22f10 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f  bjv[1]), 0, TCL_
22f20 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a  LEAVE_ERR_MSG);.
22f30 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20    if( pVar==0 ) 
22f40 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
22f50 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79  ;.  if( pVar->ty
22f60 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c  pePtr ){.    Tcl
22f70 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
22f80 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
22f90 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70  ingObj(pVar->typ
22fa0 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29  ePtr->name, -1))
22fb0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
22fc0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
22fd0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
22fe0 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f  release_memory ?
22ff0 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  N?.**.** Attempt
23000 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f   to release memo
23010 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ry currently hel
23020 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  d but not actual
23030 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  ly required..** 
23040 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73  The integer N is
23050 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
23060 79 74 65 73 20 77 65 20 61 72 65 20 74 72 79 69  ytes we are tryi
23070 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20  ng to release.  
23080 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76  The .** return v
23090 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75  alue is the amou
230a0 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74  nt of memory act
230b0 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a  ually released..
230c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
230d0 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
230e0 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
230f0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
23100 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
23110 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
23120 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
23130 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
23140 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
23150 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
23160 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29 20  ORY_MANAGEMENT) 
23170 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
23180 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29 0a  TE_OMIT_DISKIO).
23190 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20 61    int N;.  int a
231a0 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  mt;.  if( objc!=
231b0 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a  1 && objc!=2 ){.
231c0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
231d0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
231e0 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20  objv, "?N?");.  
231f0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23200 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  OR;.  }.  if( ob
23210 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28  jc==2 ){.    if(
23220 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
23230 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
23240 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72 6e  1], &N) ) return
23250 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
23260 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31 3b  lse{.    N = -1;
23270 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c  .  }.  amt = sql
23280 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
23290 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  ory(N);.  Tcl_Se
232a0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
232b0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
232c0 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a 20  (amt));.#endif. 
232d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
232e0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
232f0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c    sqlite3_db_rel
23300 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42 0a 2a  ease_memory DB.*
23310 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20  *.** Attempt to 
23320 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 63  release memory c
23330 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62 79  urrently held by
23340 20 64 61 74 61 62 61 73 65 20 44 42 2e 20 20 52   database DB.  R
23350 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72 65 73  eturn the.** res
23360 75 6c 74 20 63 6f 64 65 20 28 77 68 69 63 68 20  ult code (which 
23370 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  in the current i
23380 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69 73  mplementation is
23390 20 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e 0a 2a   always zero)..*
233a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
233b0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
233c0 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  db_release_memor
233d0 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
233e0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
233f0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
23400 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
23410 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
23420 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  ].){.  sqlite3 *
23430 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
23440 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
23450 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
23460 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
23470 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
23480 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23490 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
234a0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
234b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
234c0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
234d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
234e0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
234f0 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  _db_release_memo
23500 72 79 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65  ry(db);.  Tcl_Se
23510 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
23520 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
23530 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (rc));.  return 
23540 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
23550 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
23560 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 20 44  _db_cacheflush D
23570 42 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  B.**.** Attempt 
23580 74 6f 20 66 6c 75 73 68 20 61 6e 79 20 64 69 72  to flush any dir
23590 74 79 20 70 61 67 65 73 20 74 6f 20 64 69 73 6b  ty pages to disk
235a0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
235b0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65  SQLITE_TCLAPI te
235c0 73 74 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68  st_db_cacheflush
235d0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
235e0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
235f0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
23600 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
23610 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
23620 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
23630 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  b;.  int rc;.  i
23640 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
23650 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
23660 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
23670 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
23680 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
23690 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
236a0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
236b0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
236c0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
236d0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
236e0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
236f0 64 62 5f 63 61 63 68 65 66 6c 75 73 68 28 64 62  db_cacheflush(db
23700 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
23710 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
23720 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
23730 29 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72  )sqlite3ErrStr(r
23740 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
23750 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23760 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 54 63  ERROR;.  }..  Tc
23770 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
23780 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
23790 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
237a0 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
237b0 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 20 44 42  _system_errno DB
237c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
237d0 65 20 6c 6f 77 2d 6c 65 76 65 6c 20 73 79 73 74  e low-level syst
237e0 65 6d 20 65 72 72 6e 6f 20 76 61 6c 75 65 2e 0a  em errno value..
237f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
23800 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74  LITE_TCLAPI test
23810 5f 73 79 73 74 65 6d 5f 65 72 72 6e 6f 28 0a 20  _system_errno(. 
23820 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
23830 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
23840 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
23850 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
23860 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
23870 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
23880 20 20 69 6e 74 20 69 45 72 72 6e 6f 3b 0a 20 20    int iErrno;.  
23890 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
238a0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
238b0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
238c0 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20  bjv, "DB");.    
238d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
238e0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
238f0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
23900 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
23910 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
23920 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23930 3b 0a 20 20 69 45 72 72 6e 6f 20 3d 20 73 71 6c  ;.  iErrno = sql
23940 69 74 65 33 5f 73 79 73 74 65 6d 5f 65 72 72 6e  ite3_system_errn
23950 6f 28 64 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74  o(db);.  Tcl_Set
23960 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
23970 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
23980 69 45 72 72 6e 6f 29 29 3b 0a 20 20 72 65 74 75  iErrno));.  retu
23990 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
239a0 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
239b0 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 20  te3_db_filename 
239c0 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  DB DBNAME.**.** 
239d0 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
239e0 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63 69  of a file associ
239f0 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
23a00 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
23a10 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
23a20 49 20 74 65 73 74 5f 64 62 5f 66 69 6c 65 6e 61  I test_db_filena
23a30 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  me(.  void * cli
23a40 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
23a50 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
23a60 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
23a70 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
23a80 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
23a90 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
23aa0 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20 69 66  r *zDbName;.  if
23ab0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
23ac0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
23ad0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
23ae0 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22 29 3b  v, "DB DBNAME");
23af0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
23b00 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
23b10 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
23b20 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
23b30 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
23b40 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
23b50 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61 6d 65  ERROR;.  zDbName
23b60 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
23b70 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54 63 6c  (objv[2]);.  Tcl
23b80 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
23b90 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 64 62  terp, sqlite3_db
23ba0 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c 20 7a 44  _filename(db, zD
23bb0 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64 2a 29 30  bName), (void*)0
23bc0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
23bd0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
23be0 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  ge:  sqlite3_db_
23bf0 72 65 61 64 6f 6e 6c 79 20 44 42 20 44 42 4e 41  readonly DB DBNA
23c00 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ME.**.** Return 
23c10 31 20 6f 72 20 30 20 69 66 20 44 42 4e 41 4d 45  1 or 0 if DBNAME
23c20 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 6f 72 20   is readonly or 
23c30 6e 6f 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  not.  Return -1 
23c40 69 66 20 44 42 4e 41 4d 45 20 64 6f 65 73 0a 2a  if DBNAME does.*
23c50 2a 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2f 0a  * not exist..*/.
23c60 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
23c70 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 64 62  E_TCLAPI test_db
23c80 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20 76 6f 69  _readonly(.  voi
23c90 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
23ca0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
23cb0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
23cc0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
23cd0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
23ce0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
23cf0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
23d00 65 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  e;.  if( objc!=3
23d10 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
23d20 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
23d30 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42   1, objv, "DB DB
23d40 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75  NAME");.    retu
23d50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23d60 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
23d70 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
23d80 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
23d90 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
23da0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
23db0 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  zDbName = Tcl_Ge
23dc0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
23dd0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
23de0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
23df0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
23e00 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 64  e3_db_readonly(d
23e10 62 2c 20 7a 44 62 4e 61 6d 65 29 29 29 3b 0a 20  b, zDbName)));. 
23e20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
23e30 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
23e40 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
23e50 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f 0a 2a 2a 0a  ap_limit ?N?.**.
23e60 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
23e70 74 68 65 20 73 6f 66 74 20 68 65 61 70 20 6c 69  the soft heap li
23e80 6d 69 74 20 66 6f 72 20 74 68 65 20 63 75 72 72  mit for the curr
23e90 65 6e 74 20 74 68 72 65 61 64 2e 20 20 54 68 65  ent thread.  The
23ea0 0a 2a 2a 20 6c 69 6d 69 74 20 69 73 20 6f 6e 6c  .** limit is onl
23eb0 79 20 63 68 61 6e 67 65 64 20 69 66 20 74 68 65  y changed if the
23ec0 20 4e 20 69 73 20 70 72 65 73 65 6e 74 2e 20 20   N is present.  
23ed0 54 68 65 20 70 72 65 76 69 6f 75 73 20 6c 69 6d  The previous lim
23ee0 69 74 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  it.** is returne
23ef0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
23f00 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
23f10 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69  est_soft_heap_li
23f20 6d 69 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  mit(.  void * cl
23f30 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
23f40 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
23f50 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
23f60 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
23f70 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
23f80 5f 69 6e 74 36 34 20 61 6d 74 3b 0a 20 20 54 63  _int64 amt;.  Tc
23f90 6c 5f 57 69 64 65 49 6e 74 20 4e 20 3d 20 2d 31  l_WideInt N = -1
23fa0 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20  ;.  if( objc!=1 
23fb0 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  && objc!=2 ){.  
23fc0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
23fd0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
23fe0 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20 20 20 20  jv, "?N?");.    
23ff0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24000 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
24010 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==2 ){.    if( T
24020 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
24030 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
24040 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
24050 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
24060 7d 0a 20 20 61 6d 74 20 3d 20 73 71 6c 69 74 65  }.  amt = sqlite
24070 33 5f 73 6f 66 74 5f 68 65 61 70 5f 6c 69 6d 69  3_soft_heap_limi
24080 74 36 34 28 4e 29 3b 0a 20 20 54 63 6c 5f 53 65  t64(N);.  Tcl_Se
24090 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
240a0 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
240b0 74 4f 62 6a 28 61 6d 74 29 29 3b 0a 20 20 72 65  tObj(amt));.  re
240c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
240d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
240e0 71 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c  qlite3_thread_cl
240f0 65 61 6e 75 70 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  eanup.**.** Call
24100 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 68 72   the sqlite3_thr
24110 65 61 64 5f 63 6c 65 61 6e 75 70 20 41 50 49 2e  ead_cleanup API.
24120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
24130 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
24140 74 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  t_thread_cleanup
24150 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
24160 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
24170 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
24180 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
24190 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
241a0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
241b0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
241c0 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 74 68 72  ED.  sqlite3_thr
241d0 65 61 64 5f 63 6c 65 61 6e 75 70 28 29 3b 0a 23  ead_cleanup();.#
241e0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54  endif.  return T
241f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
24200 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33  Usage:   sqlite3
24210 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
24220 20 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72    DB.**.** Retur
24230 6e 20 61 20 6c 69 73 74 20 6f 66 20 6e 75 6d 62  n a list of numb
24240 65 72 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ers which are th
24250 65 20 50 61 67 65 72 52 65 66 63 6f 75 6e 74 20  e PagerRefcount 
24260 66 6f 72 20 61 6c 6c 0a 2a 2a 20 70 61 67 65 72  for all.** pager
24270 73 20 6f 6e 20 65 61 63 68 20 64 61 74 61 62 61  s on each databa
24280 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
24290 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
242a0 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f  ITE_TCLAPI test_
242b0 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 28  pager_refcounts(
242c0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
242d0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
242e0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
242f0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
24300 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
24310 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
24320 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
24330 20 76 2c 20 2a 61 3b 0a 20 20 54 63 6c 5f 4f 62   v, *a;.  Tcl_Ob
24340 6a 20 2a 70 52 65 73 75 6c 74 3b 0a 0a 20 20 69  j *pResult;..  i
24350 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
24360 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
24370 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
24380 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
24390 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
243a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
243b0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
243c0 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20  ), " DB", 0);.  
243d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
243e0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
243f0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
24400 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
24410 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
24420 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
24430 4f 52 3b 0a 20 20 70 52 65 73 75 6c 74 20 3d 20  OR;.  pResult = 
24440 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20  Tcl_NewObj();.  
24450 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
24460 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
24470 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
24480 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  ==0 ){.      v =
24490 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   -1;.    }else{.
244a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
244b0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
244c0 74 65 78 29 3b 0a 20 20 20 20 20 20 61 20 3d 20  tex);.      a = 
244d0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
244e0 73 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  s(sqlite3BtreePa
244f0 67 65 72 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ger(db->aDb[i].p
24500 42 74 29 29 3b 0a 20 20 20 20 20 20 76 20 3d 20  Bt));.      v = 
24510 61 5b 30 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69  a[0];.      sqli
24520 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
24530 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
24540 7d 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  }.    Tcl_ListOb
24550 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
24560 2c 20 70 52 65 73 75 6c 74 2c 20 54 63 6c 5f 4e  , pResult, Tcl_N
24570 65 77 49 6e 74 4f 62 6a 28 76 29 29 3b 0a 20 20  ewIntObj(v));.  
24580 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  }.  Tcl_SetObjRe
24590 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
245a0 73 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  sult);.  return 
245b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  TCL_OK;.}.../*.*
245c0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 77 6f 72 6b  * tclcmd:   work
245d0 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 0a 2a 2a  ing_64bit_int.**
245e0 0a 2a 2a 20 53 6f 6d 65 20 54 43 4c 20 62 75 69  .** Some TCL bui
245f0 6c 64 73 20 28 65 78 3a 20 63 79 67 77 69 6e 29  lds (ex: cygwin)
24600 20 64 6f 20 6e 6f 74 20 73 75 70 70 6f 72 74 20   do not support 
24610 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 73 2e  64-bit integers.
24620 20 20 54 68 69 73 0a 2a 2a 20 6c 65 61 64 73 20    This.** leads 
24630 74 6f 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 74  to a number of t
24640 65 73 74 20 66 61 69 6c 75 72 65 73 2e 20 20 54  est failures.  T
24650 68 65 20 70 72 65 73 65 6e 74 20 63 6f 6d 6d 61  he present comma
24660 6e 64 20 63 68 65 63 6b 73 20 74 68 65 0a 2a 2a  nd checks the.**
24670 20 54 43 4c 20 62 75 69 6c 64 20 74 6f 20 73 65   TCL build to se
24680 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74  e whether or not
24690 20 69 74 20 73 75 70 70 6f 72 74 73 20 36 34 2d   it supports 64-
246a0 62 69 74 20 69 6e 74 65 67 65 72 73 2e 20 20 49  bit integers.  I
246b0 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 54 52 55  t.** returns TRU
246c0 45 20 69 66 20 69 74 20 64 6f 65 73 20 61 6e 64  E if it does and
246d0 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 0a 2a   FALSE if not..*
246e0 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e  *.** This comman
246f0 64 20 69 73 20 75 73 65 64 20 74 6f 20 77 61 72  d is used to war
24700 6e 20 75 73 65 72 73 20 74 68 61 74 20 74 68 65  n users that the
24710 69 72 20 54 43 4c 20 62 75 69 6c 64 20 69 73 20  ir TCL build is 
24720 64 65 66 65 63 74 69 76 65 0a 2a 2a 20 61 6e 64  defective.** and
24730 20 74 68 61 74 20 74 68 65 20 65 72 72 6f 72 73   that the errors
24740 20 74 68 65 79 20 61 72 65 20 73 65 65 69 6e 67   they are seeing
24750 20 69 6e 20 74 68 65 20 74 65 73 74 20 73 63 72   in the test scr
24760 69 70 74 73 20 6d 69 67 68 74 20 62 65 0a 2a 2a  ipts might be.**
24770 20 61 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65   a result of the
24780 69 72 20 64 65 66 65 63 74 69 76 65 20 54 43 4c  ir defective TCL
24790 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 72 6f   rather than pro
247a0 62 6c 65 6d 73 20 69 6e 20 53 51 4c 69 74 65 2e  blems in SQLite.
247b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
247c0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 6f 72  QLITE_TCLAPI wor
247d0 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a  king_64bit_int(.
247e0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
247f0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e  entData, /* Poin
24800 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  ter to sqlite3_e
24810 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69  nable_XXX functi
24820 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  on */.  Tcl_Inte
24830 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
24840 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
24850 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
24860 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
24870 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
24880 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24890 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
248a0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
248b0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
248c0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
248d0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
248e0 4f 62 6a 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20  Obj *pTestObj;. 
248f0 20 69 6e 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30   int working = 0
24900 3b 0a 0a 20 20 70 54 65 73 74 4f 62 6a 20 3d 20  ;..  pTestObj = 
24910 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62  Tcl_NewWideIntOb
24920 6a 28 31 30 30 30 30 30 30 2a 28 69 36 34 29 31  j(1000000*(i64)1
24930 32 33 34 35 36 37 38 39 30 29 3b 0a 20 20 77 6f  234567890);.  wo
24940 72 6b 69 6e 67 20 3d 20 73 74 72 63 6d 70 28 54  rking = strcmp(T
24950 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 70 54 65  cl_GetString(pTe
24960 73 74 4f 62 6a 29 2c 20 22 31 32 33 34 35 36 37  stObj), "1234567
24970 38 39 30 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a  890000000")==0;.
24980 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
24990 6e 74 28 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20  nt(pTestObj);.  
249a0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
249b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
249c0 42 6f 6f 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69  BooleanObj(worki
249d0 6e 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  ng));.  return T
249e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
249f0 20 74 63 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75   tclcmd:   vfs_u
24a00 6e 6c 69 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a  nlink_test.**.**
24a10 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
24a20 64 20 75 6e 72 65 67 69 73 74 65 72 73 20 74 68  d unregisters th
24a30 65 20 70 72 69 6d 61 72 79 20 56 46 53 20 61 6e  e primary VFS an
24a40 64 20 74 68 65 6e 20 72 65 67 69 73 74 65 72 73  d then registers
24a50 0a 2a 2a 20 69 74 20 62 61 63 6b 20 61 67 61 69  .** it back agai
24a60 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
24a70 20 74 6f 20 74 65 73 74 20 74 68 65 20 61 62 69   to test the abi
24a80 6c 69 74 79 20 74 6f 20 72 65 67 69 73 74 65 72  lity to register
24a90 20 61 0a 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e   a.** VFS when n
24aa0 6f 6e 65 20 61 72 65 20 70 72 65 76 69 6f 75 73  one are previous
24ab0 6c 79 20 72 65 67 69 73 74 65 72 65 64 2c 20 61  ly registered, a
24ac0 6e 64 20 74 68 65 20 61 62 69 6c 69 74 79 20 74  nd the ability t
24ad0 6f 20 0a 2a 2a 20 75 6e 72 65 67 69 73 74 65 72  o .** unregister
24ae0 20 74 68 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61   the only availa
24af0 62 6c 65 20 56 46 53 2e 20 20 54 69 63 6b 65 74  ble VFS.  Ticket
24b00 20 23 32 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63   #2738.*/.static
24b10 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
24b20 50 49 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65  PI vfs_unlink_te
24b30 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
24b40 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
24b50 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
24b60 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
24b70 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
24b80 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
24b90 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
24ba0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24bb0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24bc0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
24bd0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24be0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
24bf0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
24c00 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24c10 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
24c20 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
24c30 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
24c40 5f 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20 73  _vfs *pMain;.  s
24c50 71 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66  qlite3_vfs *apVf
24c60 73 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  s[20];.  sqlite3
24c70 5f 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a  _vfs one, two;..
24c80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
24c90 72 65 67 69 73 74 65 72 28 30 29 3b 20 20 20 2f  register(0);   /
24ca0 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66 20  * Unregister of 
24cb0 4e 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73 73  NULL is harmless
24cc0 20 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20   */.  one.zName 
24cd0 3d 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f  = "__one";.  two
24ce0 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f 22  .zName = "__two"
24cf0 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20  ;..  /* Calling 
24d00 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69  sqlite3_vfs_regi
24d10 73 74 65 72 20 77 69 74 68 20 32 6e 64 20 61 72  ster with 2nd ar
24d20 67 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65 73  gument of 0 does
24d30 20 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65   not.  ** change
24d40 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
24d50 0a 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d 20  .  */.  pMain = 
24d60 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
24d70 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  (0);.  sqlite3_v
24d80 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65  fs_register(&one
24d90 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
24da0 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69  pMain==0 || pMai
24db0 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  n==sqlite3_vfs_f
24dc0 69 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c 69  ind(0) );.  sqli
24dd0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
24de0 28 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73 73  (&two, 0);.  ass
24df0 65 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c  ert( pMain==0 ||
24e00 20 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f   pMain==sqlite3_
24e10 76 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a  vfs_find(0) );..
24e20 20 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e 64    /* We can find
24e30 20 61 20 56 46 53 20 62 79 20 69 74 73 20 6e 61   a VFS by its na
24e40 6d 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  me */.  assert( 
24e50 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
24e60 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
24e70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
24e80 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
24e90 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a  _two")==&two );.
24ea0 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71  .  /* Calling sq
24eb0 6c 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74 65  lite_vfs_registe
24ec0 72 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20  r with non-zero 
24ed0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
24ee0 20 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20 2a   changes the.  *
24ef0 2a 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20 65  * default VFS, e
24f00 76 65 6e 20 69 66 20 74 68 65 20 31 73 74 20 70  ven if the 1st p
24f10 61 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 65  arameter is an e
24f20 78 69 73 74 69 67 20 56 46 53 20 74 68 61 74 20  xistig VFS that 
24f30 69 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73  is.  ** previous
24f40 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73  ly registered as
24f50 20 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c 74   the non-default
24f60 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
24f70 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f  _vfs_register(&o
24f80 6e 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74  ne, 1);.  assert
24f90 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
24fa0 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e  nd("__one")==&on
24fb0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
24fc0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
24fd0 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29  "__two")==&two )
24fe0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
24ff0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d  te3_vfs_find(0)=
25000 3d 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69 74  =&one );.  sqlit
25010 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
25020 26 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73 65  &two, 1);.  asse
25030 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
25040 66 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26  find("__one")==&
25050 6f 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  one );.  assert(
25060 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
25070 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f  d("__two")==&two
25080 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
25090 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
250a0 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66 28  )==&two );.  if(
250b0 20 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73 71   pMain ){.    sq
250c0 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
250d0 65 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20 20  er(pMain, 1);.  
250e0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
250f0 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
25100 65 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 20  e")==&one );.   
25110 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
25120 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f  _vfs_find("__two
25130 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20 20  ")==&two );.    
25140 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
25150 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61  vfs_find(0)==pMa
25160 69 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f  in );.  }.  .  /
25170 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65 66  * Unlink the def
25180 61 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65 61  ault VFS.  Repea
25190 74 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61 72  t until there ar
251a0 65 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73 0a  e no more VFSes.
251b0 20 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64 2e    ** registered.
251c0 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
251d0 20 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73 29   i<sizeof(apVfs)
251e0 2f 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d  /sizeof(apVfs[0]
251f0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56  ); i++){.    apV
25200 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f  fs[i] = sqlite3_
25210 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20  vfs_find(0);.   
25220 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b   if( apVfs[i] ){
25230 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61  .      assert( a
25240 70 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33  pVfs[i]==sqlite3
25250 5f 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b  _vfs_find(apVfs[
25260 69 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20  i]->zName) );.  
25270 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f      sqlite3_vfs_
25280 75 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73  unregister(apVfs
25290 5b 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65  [i]);.      asse
252a0 72 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76  rt( 0==sqlite3_v
252b0 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d  fs_find(apVfs[i]
252c0 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20  ->zName) );.    
252d0 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
252e0 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  0==sqlite3_vfs_f
252f0 69 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20 2f  ind(0) );.  .  /
25300 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20 6d  * Register the m
25310 61 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d 64  ain VFS as non-d
25320 65 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65 20  efault (will be 
25330 6d 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73 69  made default, si
25340 6e 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20 62  nce.  ** it'll b
25350 65 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 69  e the only one i
25360 6e 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20 20  n existence)..  
25370 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
25380 5f 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c  _register(pMain,
25390 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73   0);.  assert( s
253a0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
253b0 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 0a  0)==pMain );.  .
253c0 20 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65 72    /* Un-register
253d0 20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 67   the main VFS ag
253e0 61 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20 61  ain to restore a
253f0 6e 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73 74  n empty VFS list
25400 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
25410 73 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d 61  s_unregister(pMa
25420 69 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30  in);.  assert( 0
25430 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
25440 6e 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 52  nd(0) );..  /* R
25450 65 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73 20  elink all VFSes 
25460 69 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72  in reverse order
25470 2e 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 73  . */  .  for(i=s
25480 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a  izeof(apVfs)/siz
25490 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31 3b  eof(apVfs[0])-1;
254a0 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
254b0 20 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b   if( apVfs[i] ){
254c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  .      sqlite3_v
254d0 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66  fs_register(apVf
254e0 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20  s[i], 1);.      
254f0 61 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d  assert( apVfs[i]
25500 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
25510 6e 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20 61  nd(0) );.      a
25520 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
25530 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
25540 64 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d  d(apVfs[i]->zNam
25550 65 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e) );.    }.  }.
25560 0a 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72  .  /* Unregister
25570 20 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53 65   out sample VFSe
25580 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  s. */.  sqlite3_
25590 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
255a0 6f 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  one);.  sqlite3_
255b0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
255c0 74 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65  two);..  /* Unre
255d0 67 69 73 74 65 72 69 6e 67 20 61 20 56 46 53 20  gistering a VFS 
255e0 74 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72 72  that is not curr
255f0 65 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65 64  ently registered
25600 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a   is harmless */.
25610 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
25620 72 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a  register(&one);.
25630 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
25640 72 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a  register(&two);.
25650 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
25660 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e  3_vfs_find("__on
25670 65 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  e")==0 );.  asse
25680 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  rt( sqlite3_vfs_
25690 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 30  find("__two")==0
256a0 20 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f   );..  /* We sho
256b0 75 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74 68  uld be left with
256c0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65   the original de
256d0 66 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20 61  fault VFS back a
256e0 73 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69  s the.  ** origi
256f0 6e 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  nal */.  assert(
25700 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
25710 64 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a  d(0)==pMain );..
25720 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25730 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  .}../*.** tclcmd
25740 3a 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c  :   vfs_initfail
25750 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73  _test.**.** This
25760 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74 74   TCL command att
25770 65 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69 6e  empts to vfs_fin
25780 64 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73 74  d and vfs_regist
25790 65 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 73  er when the.** s
257a0 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
257b0 65 28 29 20 69 6e 74 65 72 66 61 63 65 20 69 73  e() interface is
257c0 20 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20 63   failing.  All c
257d0 61 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69 6c  alls should fail
257e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
257f0 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 76 66  SQLITE_TCLAPI vf
25800 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 28  s_initfail_test(
25810 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
25820 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
25830 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
25840 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
25850 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
25860 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
25870 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
25880 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
25890 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
258a0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
258b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
258c0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
258d0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
258e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
258f0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
25900 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
25910 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20 20  ite3_vfs one;.  
25920 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f  one.zName = "__o
25930 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  ne";..  if( sqli
25940 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
25950 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
25960 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  OR;.  sqlite3_vf
25970 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
25980 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
25990 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
259a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
259b0 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  R;.  sqlite3_vfs
259c0 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20  _register(&one, 
259d0 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  1);.  if( sqlite
259e0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20  3_vfs_find(0) ) 
259f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25a00 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
25a10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  K;.}../*.** Save
25a20 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74 69  d VFSes.*/.stati
25a30 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61  c sqlite3_vfs *a
25a40 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69 63  pVfs[20];.static
25a50 20 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a 0a   int nVfs = 0;..
25a60 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
25a70 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
25a80 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69 73  ll.**.** Unregis
25a90 74 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a 2a  ter all VFSes..*
25aa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
25ab0 49 54 45 5f 54 43 4c 41 50 49 20 76 66 73 5f 75  ITE_TCLAPI vfs_u
25ac0 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20  nregister_all(. 
25ad0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
25ae0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
25af0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
25b00 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
25b10 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
25b20 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
25b30 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
25b40 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
25b50 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
25b60 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
25b70 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
25b80 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
25b90 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
25ba0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
25bb0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
25bc0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
25bd0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
25be0 72 72 61 79 53 69 7a 65 28 61 70 56 66 73 29 3b  rraySize(apVfs);
25bf0 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73   i++){.    apVfs
25c00 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  [i] = sqlite3_vf
25c10 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69  s_find(0);.    i
25c20 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d 30 20 29  f( apVfs[i]==0 )
25c30 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69   break;.    sqli
25c40 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74  te3_vfs_unregist
25c50 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a 20 20  er(apVfs[i]);.  
25c60 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b 0a 20 20  }.  nVfs = i;.  
25c70 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
25c80 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
25c90 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
25ca0 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74 6f 72  all.**.** Restor
25cb0 65 20 61 6c 6c 20 56 46 53 65 73 20 74 68 61 74  e all VFSes that
25cc0 20 77 65 72 65 20 72 65 6d 6f 76 65 64 20 75 73   were removed us
25cd0 69 6e 67 20 76 66 73 5f 75 6e 72 65 67 69 73 74  ing vfs_unregist
25ce0 65 72 5f 61 6c 6c 2e 20 54 61 6b 69 6e 67 0a 2a  er_all. Taking.*
25cf0 2a 20 63 61 72 65 20 74 6f 20 70 75 74 20 74 68  * care to put th
25d00 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 62 61  e linked list ba
25d10 63 6b 20 74 6f 67 65 74 68 65 72 20 69 6e 20 74  ck together in t
25d20 68 65 20 73 61 6d 65 20 6f 72 64 65 72 20 61 73  he same order as
25d30 20 69 74 20 77 61 73 0a 2a 2a 20 69 6e 20 62 65   it was.** in be
25d40 66 6f 72 65 20 76 66 73 5f 75 6e 72 65 67 69 73  fore vfs_unregis
25d50 74 65 72 5f 61 6c 6c 20 77 61 73 20 69 6e 76 6f  ter_all was invo
25d60 6b 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ked..*/.static i
25d70 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
25d80 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
25d90 61 6c 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  all(.  ClientDat
25da0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
25db0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
25dc0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
25dd0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
25de0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25df0 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25e00 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25e10 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25e20 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25e30 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25e40 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25e50 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25e60 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
25e70 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
25e80 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
25e90 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
25ea0 6e 56 66 73 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nVfs-1; i>=0; i-
25eb0 2d 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -){.    sqlite3_
25ec0 76 66 73 5f 72 65 67 69 73 74 65 72 28 61 70 56  vfs_register(apV
25ed0 66 73 5b 69 5d 2c 20 31 29 3b 0a 20 20 7d 0a 20  fs[i], 1);.  }. 
25ee0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
25ef0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  }.../*.** tclcmd
25f00 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  :   file_control
25f10 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54  _test DB.**.** T
25f20 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
25f30 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
25f40 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
25f50 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
25f60 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
25f70 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
25f80 20 73 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   same..*/.static
25f90 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
25fa0 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  PI file_control_
25fb0 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  test(.  ClientDa
25fc0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
25fd0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
25fe0 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
25ff0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
26000 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
26010 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
26020 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
26030 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
26040 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
26050 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
26060 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
26070 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
26080 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
26090 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
260a0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
260b0 20 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a    int iArg = 0;.
260c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
260d0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
260e0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
260f0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
26100 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
26110 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
26120 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
26130 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
26140 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
26150 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
26160 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26170 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
26180 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
26190 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
261a0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
261b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
261c0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
261d0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
261e0 20 30 2c 20 30 2c 20 26 69 41 72 67 29 3b 0a 20   0, 0, &iArg);. 
261f0 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
26200 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a  ITE_NOTFOUND );.
26210 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
26220 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
26230 22 6e 6f 74 61 64 61 74 61 62 61 73 65 22 2c 20  "notadatabase", 
26240 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 4c 4f 43  SQLITE_FCNTL_LOC
26250 4b 53 54 41 54 45 2c 20 26 69 41 72 67 29 3b 0a  KSTATE, &iArg);.
26260 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
26270 4c 49 54 45 5f 45 52 52 4f 52 20 29 3b 0a 20 20  LITE_ERROR );.  
26280 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
26290 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 6d  e_control(db, "m
262a0 61 69 6e 22 2c 20 2d 31 2c 20 26 69 41 72 67 29  ain", -1, &iArg)
262b0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
262c0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20  SQLITE_NOTFOUND 
262d0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
262e0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
262f0 62 2c 20 22 74 65 6d 70 22 2c 20 2d 31 2c 20 26  b, "temp", -1, &
26300 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
26310 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
26320 4f 55 4e 44 20 7c 7c 20 72 63 3d 3d 53 51 4c 49  OUND || rc==SQLI
26330 54 45 5f 45 52 52 4f 52 20 29 3b 0a 0a 20 20 72  TE_ERROR );..  r
26340 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
26350 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
26360 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c    file_control_l
26370 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 20 44 42  asterrno_test DB
26380 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
26390 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
263a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
263b0 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
263c0 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20  and.** verifies 
263d0 63 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f  correct operatio
263e0 6e 20 6f 66 20 74 68 65 20 53 51 4c 49 54 45 5f  n of the SQLITE_
263f0 4c 41 53 54 5f 45 52 52 4e 4f 20 76 65 72 62 2e  LAST_ERRNO verb.
26400 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
26410 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 66 69 6c  QLITE_TCLAPI fil
26420 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72  e_control_laster
26430 72 6e 6f 5f 74 65 73 74 28 0a 20 20 43 6c 69 65  rno_test(.  Clie
26440 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
26450 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
26460 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
26470 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
26480 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
26490 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
264a0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
264b0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
264c0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
264d0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
264e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
264f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
26500 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
26510 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
26520 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
26530 0a 29 7b 0a 20 20 69 6e 74 20 69 41 72 67 20 3d  .){.  int iArg =
26540 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
26550 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
26560 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
26570 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
26580 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
26590 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
265a0 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
265b0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
265c0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
265d0 30 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  0), " DB", 0);. 
265e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
265f0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
26600 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
26610 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
26620 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
26630 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
26640 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26650 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
26660 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
26670 4c 4c 2c 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f  LL, SQLITE_LAST_
26680 45 52 52 4e 4f 2c 20 26 69 41 72 67 29 3b 0a 20  ERRNO, &iArg);. 
26690 20 69 66 28 20 72 63 20 29 7b 20 0a 20 20 20 20   if( rc ){ .    
266a0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
266b0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
266c0 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a 20 20  IntObj(rc)); .  
266d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
266e0 4f 52 3b 20 0a 20 20 7d 0a 20 20 69 66 28 20 69  OR; .  }.  if( i
266f0 41 72 67 21 3d 30 20 29 20 7b 0a 20 20 20 20 54  Arg!=0 ) {.    T
26700 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
26710 69 6e 74 65 72 70 2c 20 22 55 6e 65 78 70 65 63  interp, "Unexpec
26720 74 65 64 20 6e 6f 6e 2d 7a 65 72 6f 20 65 72 72  ted non-zero err
26730 6e 6f 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20  no: ",.         
26740 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
26750 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
26760 28 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 69  (Tcl_NewIntObj(i
26770 41 72 67 29 2c 20 30 29 2c 20 22 20 22 2c 20 30  Arg), 0), " ", 0
26780 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
26790 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
267a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
267b0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
267c0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
267d0 63 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 20 44  chunksize_test D
267e0 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a 2a  B DBNAME SIZE.**
267f0 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d  .** This TCL com
26800 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71  mand runs the sq
26810 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
26820 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  ol interface and
26830 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
26840 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
26850 66 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54  f the SQLITE_GET
26860 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61  _LOCKPROXYFILE a
26870 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54  nd.** SQLITE_SET
26880 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76  _LOCKPROXYFILE v
26890 65 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  erbs..*/.static 
268a0 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
268b0 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63  I file_control_c
268c0 68 75 6e 6b 73 69 7a 65 5f 74 65 73 74 28 0a 20  hunksize_test(. 
268d0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
268e0 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
268f0 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
26900 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
26910 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
26920 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
26930 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
26940 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
26950 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
26960 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
26970 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26980 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
26990 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
269a0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
269b0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
269c0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  ts */.){.  int n
269d0 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
269e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 65             /* Ne
269f0 77 20 63 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a  w chunk size */.
26a00 20 20 63 68 61 72 20 2a 7a 44 62 3b 20 20 20 20    char *zDb;    
26a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a20 20 20 2f 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d    /* Db name ("m
26a30 61 69 6e 22 2c 20 22 74 65 6d 70 22 20 65 74 63  ain", "temp" etc
26a40 2e 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  .) */.  sqlite3 
26a50 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
26a60 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
26a70 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
26a80 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
26a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26aa0 2f 2a 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  /* file_control(
26ab0 29 20 72 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  ) return code */
26ac0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
26ad0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
26ae0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
26af0 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e  1, objv, "DB DBN
26b00 41 4d 45 20 53 49 5a 45 22 29 3b 0a 20 20 20 20  AME SIZE");.    
26b10 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
26b20 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
26b30 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
26b40 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
26b50 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20  bjv[1]), &db) . 
26b60 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46    || Tcl_GetIntF
26b70 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
26b80 62 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a  bjv[3], &nSize).
26b90 20 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54    ){.   return T
26ba0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
26bb0 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
26bc0 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
26bd0 69 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27  if( zDb[0]=='\0'
26be0 20 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a   ) zDb = NULL;..
26bf0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
26c00 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
26c10 7a 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  zDb, SQLITE_FCNT
26c20 4c 5f 43 48 55 4e 4b 5f 53 49 5a 45 2c 20 28 76  L_CHUNK_SIZE, (v
26c30 6f 69 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20  oid *)&nSize);. 
26c40 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54   if( rc ){.    T
26c50 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
26c60 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
26c70 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c  ite3ErrName(rc),
26c80 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20   TCL_STATIC);.  
26c90 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
26ca0 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
26cb0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
26cc0 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
26cd0 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e  _control_sizehin
26ce0 74 5f 74 65 73 74 20 44 42 20 44 42 4e 41 4d 45  t_test DB DBNAME
26cf0 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73   SIZE.**.** This
26d00 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
26d10 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
26d20 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
26d30 66 61 63 65 20 0a 2a 2a 20 77 69 74 68 20 53 51  face .** with SQ
26d40 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f  LITE_FCNTL_SIZE_
26d50 48 49 4e 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69  HINT.*/.static i
26d60 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
26d70 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69   file_control_si
26d80 7a 65 68 69 6e 74 5f 74 65 73 74 28 0a 20 20 43  zehint_test(.  C
26d90 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
26da0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
26db0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
26dc0 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
26dd0 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
26de0 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
26df0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
26e00 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
26e10 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
26e20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
26e30 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
26e40 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
26e50 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
26e60 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
26e70 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
26e80 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64   */.){.  Tcl_Wid
26e90 65 49 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20  eInt nSize;     
26ea0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e 74           /* Hint
26eb0 65 64 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61  ed size */.  cha
26ec0 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20  r *zDb;         
26ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
26ee0 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c  Db name ("main",
26ef0 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f   "temp" etc.) */
26f00 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20  .  sqlite3 *db; 
26f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68     /* Database h
26f30 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72  andle */.  int r
26f40 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
26f50 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69             /* fi
26f60 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74  le_control() ret
26f70 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69  urn code */..  i
26f80 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20  f( objc!=4 ){.  
26f90 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
26fa0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
26fb0 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53  jv, "DB DBNAME S
26fc0 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  IZE");.    retur
26fd0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
26fe0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
26ff0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
27000 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
27010 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c 20  ]), &db) .   || 
27020 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72  Tcl_GetWideIntFr
27030 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
27040 6a 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20  jv[3], &nSize). 
27050 20 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43   ){.   return TC
27060 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a  L_ERROR;.  }.  z
27070 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
27080 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69  ng(objv[2]);.  i
27090 66 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20  f( zDb[0]=='\0' 
270a0 29 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  ) zDb = NULL;.. 
270b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
270c0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
270d0 44 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  Db, SQLITE_FCNTL
270e0 5f 53 49 5a 45 5f 48 49 4e 54 2c 20 28 76 6f 69  _SIZE_HINT, (voi
270f0 64 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69  d *)&nSize);.  i
27100 66 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c  f( rc ){.    Tcl
27110 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
27120 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
27130 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54  e3ErrName(rc), T
27140 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  CL_STATIC);.    
27150 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27160 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
27170 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
27180 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
27190 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79  ontrol_lockproxy
271a0 5f 74 65 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a  _test DB PWD.**.
271b0 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
271c0 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
271d0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
271e0 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a  l interface and.
271f0 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72  ** verifies corr
27200 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  ect operation of
27210 20 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f   the SQLITE_GET_
27220 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e  LOCKPROXYFILE an
27230 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f  d.** SQLITE_SET_
27240 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65  LOCKPROXYFILE ve
27250 72 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  rbs..*/.static i
27260 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
27270 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f   file_control_lo
27280 63 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20 20  ckproxy_test(.  
27290 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
272a0 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
272b0 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
272c0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
272d0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
272e0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
272f0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
27300 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27310 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27320 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27330 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27340 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
27350 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
27360 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
27370 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
27380 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
27390 33 20 2a 64 62 3b 0a 20 20 0a 20 20 69 66 28 20  3 *db;.  .  if( 
273a0 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
273b0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
273c0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
273d0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
273e0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20   \"",.          
273f0 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47             Tcl_G
27400 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
27410 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
27420 42 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20 20  B PWD", 0);.    
27430 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
27440 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
27450 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
27460 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
27470 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
27480 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  .   return TCL_E
27490 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69 66  RROR;.  }.  .#if
274a0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
274b0 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f  _ENABLE_LOCKING_
274c0 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65 66  STYLE).#  if def
274d0 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a  ined(__APPLE__).
274e0 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49  #    define SQLI
274f0 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
27500 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c 73  G_STYLE 1.#  els
27510 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51  e.#    define SQ
27520 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b  LITE_ENABLE_LOCK
27530 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20 65  ING_STYLE 0.#  e
27540 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66 20  ndif.#endif.#if 
27550 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f  SQLITE_ENABLE_LO
27560 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20 64  CKING_STYLE && d
27570 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f  efined(__APPLE__
27580 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20 2a  ).  {.    char *
27590 74 65 73 74 50 61 74 68 3b 0a 20 20 20 20 69 6e  testPath;.    in
275a0 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e 50  t rc;.    int nP
275b0 77 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  wd;.    const ch
275c0 61 72 20 2a 7a 50 77 64 3b 0a 20 20 20 20 63 68  ar *zPwd;.    ch
275d0 61 72 20 70 72 6f 78 79 50 61 74 68 5b 34 30 30  ar proxyPath[400
275e0 5d 3b 0a 20 20 20 20 0a 20 20 20 20 7a 50 77 64  ];.    .    zPwd
275f0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
27600 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c  FromObj(objv[2],
27610 20 26 6e 50 77 64 29 3b 0a 20 20 20 20 69 66 28   &nPwd);.    if(
27620 20 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61 74   sizeof(proxyPat
27630 68 29 3c 6e 50 77 64 2b 32 30 20 29 7b 0a 20 20  h)<nPwd+20 ){.  
27640 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
27650 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 50 57  sult(interp, "PW
27660 44 20 74 6f 6f 20 62 69 67 22 2c 20 28 76 6f 69  D too big", (voi
27670 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65 74  d*)0);.      ret
27680 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
27690 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
276a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
276b0 28 70 72 6f 78 79 50 61 74 68 29 2c 20 70 72 6f  (proxyPath), pro
276c0 78 79 50 61 74 68 2c 20 22 25 73 2f 74 65 73 74  xyPath, "%s/test
276d0 2e 70 72 6f 78 79 22 2c 20 7a 50 77 64 29 3b 0a  .proxy", zPwd);.
276e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
276f0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
27700 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 53  , NULL, SQLITE_S
27710 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45  ET_LOCKPROXYFILE
27720 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20 20  , proxyPath);.  
27730 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
27740 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
27750 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
27760 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20 0a  ewIntObj(rc)); .
27770 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
27780 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
27790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
277a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
277b0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45 54  NULL, SQLITE_GET
277c0 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20  _LOCKPROXYFILE, 
277d0 26 74 65 73 74 50 61 74 68 29 3b 0a 20 20 20 20  &testPath);.    
277e0 69 66 28 20 73 74 72 6e 63 6d 70 28 70 72 6f 78  if( strncmp(prox
277f0 79 50 61 74 68 2c 74 65 73 74 50 61 74 68 2c 31  yPath,testPath,1
27800 31 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  1) ){.      Tcl_
27810 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
27820 65 72 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78 79  erp, "Lock proxy
27830 20 66 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d 61   file did not ma
27840 74 63 68 20 74 68 65 20 22 0a 20 20 20 20 20 20  tch the ".      
27850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27860 20 20 20 20 20 20 20 20 20 22 70 72 65 76 69 6f           "previo
27870 75 73 6c 79 20 61 73 73 69 67 6e 65 64 20 76 61  usly assigned va
27880 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  lue", 0);.      
27890 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
278a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
278b0 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  rc ){.      Tcl_
278c0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
278d0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
278e0 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72  bj(rc));.      r
278f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
27900 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
27910 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
27920 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
27930 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52  QLITE_SET_LOCKPR
27940 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61  OXYFILE, proxyPa
27950 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  th);.    if( rc 
27960 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
27970 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
27980 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
27990 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  rc));.      retu
279a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
279b0 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
279c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
279d0 20 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f   .}..#if SQLITE_
279e0 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  OS_WIN./*.** tcl
279f0 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
27a00 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74  rol_win32_av_ret
27a10 72 79 20 44 42 20 20 4e 52 45 54 52 59 20 20 44  ry DB  NRETRY  D
27a20 45 4c 41 59 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ELAY.**.** This 
27a30 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
27a40 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
27a50 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
27a60 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ace with.** the 
27a70 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e  SQLITE_FCNTL_WIN
27a80 33 32 5f 41 56 5f 52 45 54 52 59 20 6f 70 63 6f  32_AV_RETRY opco
27a90 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
27aa0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
27ab0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
27ac0 33 32 5f 61 76 5f 72 65 74 72 79 28 0a 20 20 43  32_av_retry(.  C
27ad0 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
27ae0 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
27af0 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
27b00 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
27b10 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
27b20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
27b30 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
27b40 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
27b50 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
27b60 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
27b70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27b80 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27b90 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
27ba0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
27bb0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
27bc0 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
27bd0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
27be0 20 20 69 6e 74 20 61 5b 32 5d 3b 0a 20 20 63 68    int a[2];.  ch
27bf0 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  ar z[100];..  if
27c00 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
27c10 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
27c20 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
27c30 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
27c40 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20  be \"",.        
27c50 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
27c60 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
27c70 2c 20 22 20 44 42 20 4e 52 45 54 52 59 20 44 45  , " DB NRETRY DE
27c80 4c 41 59 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LAY", 0);.    re
27c90 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
27ca0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
27cb0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
27cc0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
27cd0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
27ce0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
27cf0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
27d00 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
27d10 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d  (interp, objv[2]
27d20 2c 20 26 61 5b 30 5d 29 20 29 20 72 65 74 75 72  , &a[0]) ) retur
27d30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
27d40 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
27d50 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
27d60 76 5b 33 5d 2c 20 26 61 5b 31 5d 29 20 29 20 72  v[3], &a[1]) ) r
27d70 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
27d80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
27d90 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
27da0 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43   NULL, SQLITE_FC
27db0 4e 54 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54  NTL_WIN32_AV_RET
27dc0 52 59 2c 20 28 76 6f 69 64 2a 29 61 29 3b 0a 20  RY, (void*)a);. 
27dd0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
27de0 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20  f(sizeof(z), z, 
27df0 22 25 64 20 25 64 20 25 64 22 2c 20 72 63 2c 20  "%d %d %d", rc, 
27e00 61 5b 30 5d 2c 20 61 5b 31 5d 29 3b 0a 20 20 54  a[0], a[1]);.  T
27e10 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
27e20 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72  interp, z, (char
27e30 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
27e40 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a  CL_OK;  .}../*.*
27e50 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
27e60 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 67  _control_win32_g
27e70 65 74 5f 68 61 6e 64 6c 65 20 44 42 0a 2a 2a 0a  et_handle DB.**.
27e80 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
27e90 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
27ea0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
27eb0 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  l interface with
27ec0 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46  .** the SQLITE_F
27ed0 43 4e 54 4c 5f 57 49 4e 33 32 5f 47 45 54 5f 48  CNTL_WIN32_GET_H
27ee0 41 4e 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f  ANDLE opcode..*/
27ef0 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
27f00 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 67  _control_win32_g
27f10 65 74 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69  et_handle(.  Cli
27f20 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
27f30 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
27f40 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
27f50 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
27f60 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
27f70 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
27f80 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
27f90 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
27fa0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
27fb0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
27fc0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
27fd0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
27fe0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
27ff0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
28000 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
28010 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
28020 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
28030 48 41 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e  HANDLE hFile = N
28040 55 4c 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30  ULL;.  char z[10
28050 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
28060 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
28070 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
28080 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
28090 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
280a0 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
280b0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
280c0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22  jv[0], 0), " DB"
280d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
280e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
280f0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
28100 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
28110 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
28120 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
28130 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28140 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
28150 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
28160 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
28170 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 47 45  E_FCNTL_WIN32_GE
28180 54 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20 20  T_HANDLE,.      
28190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
281a0 20 20 20 20 20 20 28 76 6f 69 64 2a 29 26 68 46        (void*)&hF
281b0 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ile);.  sqlite3_
281c0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
281d0 7a 29 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c 20  z), z, "%d %p", 
281e0 72 63 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c 65  rc, (void*)hFile
281f0 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
28200 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
28210 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65   (char*)0);.  re
28220 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
28230 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
28240 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
28250 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65 20 44 42  32_set_handle DB
28260 20 48 41 4e 44 4c 45 0a 2a 2a 0a 2a 2a 20 54 68   HANDLE.**.** Th
28270 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
28280 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
28290 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
282a0 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
282b0 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
282c0 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44 4c 45  WIN32_SET_HANDLE
282d0 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
282e0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
282f0 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  LAPI file_contro
28300 6c 5f 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64  l_win32_set_hand
28310 6c 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  le(.  ClientData
28320 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
28330 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
28340 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
28350 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
28360 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
28370 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
28380 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
28390 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
283a0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
283b0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
283c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
283d0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
283e0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
283f0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
28400 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
28410 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
28420 6e 74 20 72 63 3b 0a 20 20 48 41 4e 44 4c 45 20  nt rc;.  HANDLE 
28430 68 46 69 6c 65 20 3d 20 4e 55 4c 4c 3b 0a 20 20  hFile = NULL;.  
28440 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20  char z[100];..  
28450 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
28460 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
28470 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
28480 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
28490 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
284a0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
284b0 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
284c0 30 29 2c 20 22 20 44 42 20 48 41 4e 44 4c 45 22  0), " DB HANDLE"
284d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
284e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
284f0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
28500 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
28510 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
28520 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
28530 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28540 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 57 69  .  }.  if( getWi
28550 6e 33 32 48 61 6e 64 6c 65 28 69 6e 74 65 72 70  n32Handle(interp
28560 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
28570 6f 62 6a 76 5b 32 5d 29 2c 20 26 68 46 69 6c 65  objv[2]), &hFile
28580 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
28590 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
285a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
285b0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e  le_control(db, N
285c0 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ULL, SQLITE_FCNT
285d0 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e 44  L_WIN32_SET_HAND
285e0 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  LE,.            
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 28 76 6f 69 64 2a 29 26 68 46 69 6c 65 29 3b 0a  (void*)&hFile);.
28610 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
28620 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c  tf(sizeof(z), z,
28630 20 22 25 64 20 25 70 22 2c 20 72 63 2c 20 28 76   "%d %p", rc, (v
28640 6f 69 64 2a 29 68 46 69 6c 65 29 3b 0a 20 20 54  oid*)hFile);.  T
28650 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
28660 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61 72  interp, z, (char
28670 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
28680 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 23 65 6e 64 69  CL_OK;  .}.#endi
28690 66 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  f../*.** tclcmd:
286a0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
286b0 70 65 72 73 69 73 74 5f 77 61 6c 20 44 42 20 50  persist_wal DB P
286c0 45 52 53 49 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a  ERSIST-FLAG.**.*
286d0 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
286e0 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
286f0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
28700 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a   interface with.
28710 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43  ** the SQLITE_FC
28720 4e 54 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 20  NTL_PERSIST_WAL 
28730 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  opcode..*/.stati
28740 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
28750 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  API file_control
28760 5f 70 65 72 73 69 73 74 5f 77 61 6c 28 0a 20 20  _persist_wal(.  
28770 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
28780 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
28790 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
287a0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
287b0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
287c0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
287d0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
287e0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
287f0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
28800 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
28810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
28820 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
28830 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
28840 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
28850 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
28860 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
28870 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
28880 0a 20 20 69 6e 74 20 62 50 65 72 73 69 73 74 3b  .  int bPersist;
28890 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
288a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
288b0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
288c0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
288d0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
288e0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
288f0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
28900 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
28910 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47  ], 0), " DB FLAG
28920 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
28930 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
28940 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
28950 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
28960 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
28970 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
28980 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28990 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
289a0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
289b0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
289c0 62 50 65 72 73 69 73 74 29 20 29 20 72 65 74 75  bPersist) ) retu
289d0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
289e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
289f0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
28a00 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  LL, SQLITE_FCNTL
28a10 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 76  _PERSIST_WAL, (v
28a20 6f 69 64 2a 29 26 62 50 65 72 73 69 73 74 29 3b  oid*)&bPersist);
28a30 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
28a40 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
28a50 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62  , "%d %d", rc, b
28a60 50 65 72 73 69 73 74 29 3b 0a 20 20 54 63 6c 5f  Persist);.  Tcl_
28a70 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
28a80 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
28a90 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
28aa0 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
28ab0 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
28ac0 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f  ntrol_powersafe_
28ad0 6f 76 65 72 77 72 69 74 65 20 44 42 20 50 53 4f  overwrite DB PSO
28ae0 57 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69  W-FLAG.**.** Thi
28af0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
28b00 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
28b10 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
28b20 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68  rface with.** th
28b30 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
28b40 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
28b50 54 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74  TE opcode..*/.st
28b60 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
28b70 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74  TCLAPI file_cont
28b80 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76  rol_powersafe_ov
28b90 65 72 77 72 69 74 65 28 0a 20 20 43 6c 69 65 6e  erwrite(.  Clien
28ba0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
28bb0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
28bc0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
28bd0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
28be0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28bf0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
28c00 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
28c10 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
28c20 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
28c30 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
28c40 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28c50 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
28c60 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
28c70 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
28c80 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
28c90 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
28ca0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
28cb0 74 20 62 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30  t b;.  char z[10
28cc0 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  0];..  if( objc!
28cd0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
28ce0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
28cf0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
28d00 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
28d10 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
28d20 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
28d30 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20  jv[0], 0), " DB 
28d40 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20 20 72  FLAG", 0);.    r
28d50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28d60 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
28d70 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
28d80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
28d90 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
28da0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28db0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
28dc0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
28dd0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
28de0 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72 6e 20  ], &b) ) return 
28df0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
28e00 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
28e10 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c 2c 53  ontrol(db,NULL,S
28e20 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f 57 45  QLITE_FCNTL_POWE
28e30 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54 45 2c  RSAFE_OVERWRITE,
28e40 28 76 6f 69 64 2a 29 26 62 29 3b 0a 20 20 73 71  (void*)&b);.  sq
28e50 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
28e60 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 25 64  izeof(z), z, "%d
28e70 20 25 64 22 2c 20 72 63 2c 20 62 29 3b 0a 20 20   %d", rc, b);.  
28e80 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
28e90 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63 68 61  (interp, z, (cha
28ea0 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  r*)0);.  return 
28eb0 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a  TCL_OK;  .}.../*
28ec0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
28ed0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61  le_control_vfsna
28ee0 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a  me DB ?AUXDB?.**
28ef0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72  .** Return a str
28f00 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
28f10 65 73 20 74 68 65 20 73 74 61 63 6b 20 6f 66 20  es the stack of 
28f20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  VFSes..*/.static
28f30 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
28f40 50 49 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  PI file_control_
28f50 76 66 73 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e  vfsname(.  Clien
28f60 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
28f70 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
28f80 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
28f90 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
28fa0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28fb0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
28fc0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
28fd0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
28fe0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
28ff0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
29000 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
29010 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
29020 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
29030 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
29040 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
29050 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
29060 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
29070 7a 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22  zDbName = "main"
29080 3b 0a 20 20 63 68 61 72 20 2a 7a 56 66 73 4e 61  ;.  char *zVfsNa
29090 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f  me = 0;..  if( o
290a0 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d  bjc!=2 && objc!=
290b0 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
290c0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
290d0 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
290e0 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
290f0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
29100 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
29110 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f  v[0], 0), " DB ?
29120 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20  AUXDB?", 0);.   
29130 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29140 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
29150 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
29160 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
29170 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
29180 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
29190 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
291a0 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20  ( objc==3 ){.   
291b0 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47   zDbName = Tcl_G
291c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d  etString(objv[2]
291d0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
291e0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62  _file_control(db
291f0 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54  , zDbName, SQLIT
29200 45 5f 46 43 4e 54 4c 5f 56 46 53 4e 41 4d 45 2c  E_FCNTL_VFSNAME,
29210 28 76 6f 69 64 2a 29 26 7a 56 66 73 4e 61 6d 65  (void*)&zVfsName
29220 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
29230 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 56  esult(interp, zV
29240 66 73 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30  fsName, (char*)0
29250 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
29260 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 72  e(zVfsName);.  r
29270 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
29280 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
29290 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
292a0 74 65 6d 70 66 69 6c 65 6e 61 6d 65 20 44 42 20  tempfilename DB 
292b0 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65  ?AUXDB?.**.** Re
292c0 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68  turn a string th
292d0 61 74 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72  at is a temporar
292e0 79 20 66 69 6c 65 6e 61 6d 65 0a 2a 2f 0a 73 74  y filename.*/.st
292f0 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
29300 54 43 4c 41 50 49 20 66 69 6c 65 5f 63 6f 6e 74  TCLAPI file_cont
29310 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65  rol_tempfilename
29320 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
29330 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
29340 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
29350 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
29360 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
29370 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
29380 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
29390 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
293a0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
293b0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
293c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
293d0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
293e0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
293f0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
29400 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
29410 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
29420 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
29430 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
29440 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68 61   = "main";.  cha
29450 72 20 2a 7a 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a  r *zTName = 0;..
29460 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 26 26    if( objc!=2 &&
29470 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
29480 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29490 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
294a0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
294b0 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
294c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
294d0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
294e0 20 22 20 44 42 20 3f 41 55 58 44 42 3f 22 2c 20   " DB ?AUXDB?", 
294f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
29500 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
29510 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
29520 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
29530 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
29540 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
29550 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29560 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33   }.  if( objc==3
29570 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20   ){.    zDbName 
29580 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
29590 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20  objv[2]);.  }.  
295a0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
295b0 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65  trol(db, zDbName
295c0 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54  , SQLITE_FCNTL_T
295d0 45 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 28 76 6f  EMPFILENAME, (vo
295e0 69 64 2a 29 26 7a 54 4e 61 6d 65 29 3b 0a 20 20  id*)&zTName);.  
295f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29600 28 69 6e 74 65 72 70 2c 20 7a 54 4e 61 6d 65 2c  (interp, zTName,
29610 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 73 71   (char*)0);.  sq
29620 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 4e 61 6d  lite3_free(zTNam
29630 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  e);.  return TCL
29640 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  _OK;  .}.../*.**
29650 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74   tclcmd:   sqlit
29660 65 33 5f 76 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a  e3_vfs_list.**.*
29670 2a 20 20 20 52 65 74 75 72 6e 20 61 20 74 63 6c  *   Return a tcl
29680 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
29690 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
296a0 6c 20 72 65 67 69 73 74 65 72 65 64 20 76 66 73  l registered vfs
296b0 27 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  's..*/.static in
296c0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
296d0 76 66 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65  vfs_list(.  Clie
296e0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
296f0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
29700 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
29710 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
29720 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
29730 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
29740 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
29750 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
29760 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
29770 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
29780 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29790 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
297a0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
297b0 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
297c0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
297d0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  .){.  sqlite3_vf
297e0 73 20 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f  s *pVfs;.  Tcl_O
297f0 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e  bj *pRet = Tcl_N
29800 65 77 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f  ewObj();.  if( o
29810 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63  bjc!=1 ){.    Tc
29820 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
29830 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
29840 22 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  "");.    return 
29850 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
29860 20 66 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65   for(pVfs=sqlite
29870 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70  3_vfs_find(0); p
29880 56 66 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e  Vfs; pVfs=pVfs->
29890 70 4e 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f  pNext){.    Tcl_
298a0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
298b0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
298c0 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
298d0 4f 62 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  Obj(pVfs->zName,
298e0 20 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c   -1));.  }.  Tcl
298f0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
29900 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72  terp, pRet);.  r
29910 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
29920 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
29930 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
29940 20 44 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a   DB ID VALUE.**.
29950 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
29960 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
29970 69 74 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72  ite3_limit inter
29980 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
29990 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
299a0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61  ration of the sa
299b0 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  me..*/.static in
299c0 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
299d0 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43 6c  test_limit(.  Cl
299e0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
299f0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
29a00 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
29a10 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
29a20 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
29a30 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
29a40 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
29a50 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
29a60 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
29a70 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
29a80 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
29a90 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
29aa0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
29ab0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
29ac0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
29ad0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
29ae0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
29af0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
29b00 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
29b10 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e   *zName;.     in
29b20 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d 20  t id;.  } aId[] 
29b30 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
29b40 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22 2c  E_LIMIT_LENGTH",
29b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
29b60 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
29b70 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
29b80 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
29b90 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
29ba0 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  H",          SQL
29bb0 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
29bc0 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 7d  NGTH           }
29bd0 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
29be0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20  LIMIT_COLUMN",  
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
29c00 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20  TE_LIMIT_COLUMN 
29c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
29c20 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
29c30 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 22  IMIT_EXPR_DEPTH"
29c40 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
29c50 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
29c60 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TH           },.
29c70 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
29c80 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
29c90 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49 54 45  ECT",     SQLITE
29ca0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
29cb0 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a 20  SELECT      },. 
29cc0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
29cd0 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20 20  IT_VDBE_OP",    
29ce0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
29cf0 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20  LIMIT_VDBE_OP   
29d00 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
29d10 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
29d20 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22 2c  T_FUNCTION_ARG",
29d30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
29d40 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
29d50 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  G         },.   
29d60 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
29d70 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20 20 20  _ATTACHED",     
29d80 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
29d90 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20 20  MIT_ATTACHED    
29da0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
29db0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
29dc0 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
29dd0 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49 4d  GTH", SQLITE_LIM
29de0 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
29df0 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20 7b  LENGTH  },.    {
29e00 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56   "SQLITE_LIMIT_V
29e10 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22 2c  ARIABLE_NUMBER",
29e20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
29e30 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
29e40 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  R      },.    { 
29e50 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  "SQLITE_LIMIT_TR
29e60 49 47 47 45 52 5f 44 45 50 54 48 22 2c 20 20 20  IGGER_DEPTH",   
29e70 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
29e80 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 20  _TRIGGER_DEPTH  
29e90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
29ea0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
29eb0 4b 45 52 5f 54 48 52 45 41 44 53 22 2c 20 20 20  KER_THREADS",   
29ec0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
29ed0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20  WORKER_THREADS  
29ee0 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20       },.    .   
29ef0 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61 6e 67 65   /* Out of range
29f00 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f 0a 20   test cases */. 
29f10 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
29f20 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20  IT_TOOSMALL",   
29f30 20 20 20 20 20 20 20 20 20 2d 31 2c 20 20 20 20           -1,    
29f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29f50 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
29f60 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
29f70 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20 20 20 20  T_TOOBIG",      
29f80 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
29f90 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
29fa0 41 44 53 2b 31 20 20 20 20 20 7d 2c 0a 20 20 7d  ADS+1     },.  }
29fb0 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 20 3d 20  ;.  int i, id = 
29fc0 30 3b 0a 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20  0;.  int val;.  
29fd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
29fe0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20  ..  if( objc!=4 
29ff0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2a000 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2a010 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2a020 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
2a030 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
2a040 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
2a050 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 49 44 20  0], 0), " DB ID 
2a060 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
2a070 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a080 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2a090 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2a0a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2a0b0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
2a0c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2a0d0 3b 0a 20 20 7a 49 64 20 3d 20 54 63 6c 5f 47 65  ;.  zId = Tcl_Ge
2a0e0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
2a0f0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  ;.  for(i=0; i<s
2a100 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f  izeof(aId)/sizeo
2a110 66 28 61 49 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b  f(aId[0]); i++){
2a120 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
2a130 7a 49 64 2c 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d  zId, aId[i].zNam
2a140 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  e)==0 ){.      i
2a150 64 20 3d 20 61 49 64 5b 69 5d 2e 69 64 3b 0a 20  d = aId[i].id;. 
2a160 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a170 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69 3e 3d 73  }.  }.  if( i>=s
2a180 69 7a 65 6f 66 28 61 49 64 29 2f 73 69 7a 65 6f  izeof(aId)/sizeo
2a190 66 28 61 49 64 5b 30 5d 29 20 29 7b 0a 20 20 20  f(aId[0]) ){.   
2a1a0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
2a1b0 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e 6f  t(interp, "unkno
2a1c0 77 6e 20 6c 69 6d 69 74 20 74 79 70 65 3a 20 22  wn limit type: "
2a1d0 2c 20 7a 49 64 2c 20 28 63 68 61 72 2a 29 30 29  , zId, (char*)0)
2a1e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2a1f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2a200 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2a210 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2a220 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [3], &val) ) ret
2a230 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2a240 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 69   rc = sqlite3_li
2a250 6d 69 74 28 64 62 2c 20 69 64 2c 20 76 61 6c 29  mit(db, id, val)
2a260 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
2a270 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
2a280 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
2a290 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2a2a0 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
2a2b0 63 6d 64 3a 20 20 73 61 76 65 5f 70 72 6e 67 5f  cmd:  save_prng_
2a2c0 73 74 61 74 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65  state.**.** Save
2a2d0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
2a2e0 65 20 70 73 65 75 64 6f 2d 72 61 6e 64 6f 6d 20  e pseudo-random 
2a2f0 6e 75 6d 62 65 72 20 67 65 6e 65 72 61 74 6f 72  number generator
2a300 2e 0a 2a 2a 20 41 74 20 74 68 65 20 73 61 6d 65  ..** At the same
2a310 20 74 69 6d 65 2c 20 76 65 72 69 66 79 20 74 68   time, verify th
2a320 61 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  at sqlite3_test_
2a330 63 6f 6e 74 72 6f 6c 20 77 6f 72 6b 73 20 65 76  control works ev
2a340 65 6e 20 77 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65  en when.** calle
2a350 64 20 77 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66  d with an out-of
2a360 2d 72 61 6e 67 65 20 6f 70 63 6f 64 65 2e 0a 2a  -range opcode..*
2a370 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
2a380 49 54 45 5f 54 43 4c 41 50 49 20 73 61 76 65 5f  ITE_TCLAPI save_
2a390 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c  prng_state(.  Cl
2a3a0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2a3b0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
2a3c0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
2a3d0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
2a3e0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
2a3f0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2a400 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2a410 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2a420 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2a430 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
2a440 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a450 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2a460 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
2a470 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
2a480 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2a490 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
2a4a0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
2a4b0 6e 74 72 6f 6c 28 39 39 39 39 29 3b 0a 20 20 61  ntrol(9999);.  a
2a4c0 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a  ssert( rc==0 );.
2a4d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
2a4e0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b  est_control(-1);
2a4f0 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30  .  assert( rc==0
2a500 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65   );.  sqlite3_te
2a510 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
2a520 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
2a530 53 41 56 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  SAVE);.  return 
2a540 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
2a550 74 63 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72 65  tclcmd:  restore
2a560 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73  _prng_state.*/.s
2a570 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45  tatic int SQLITE
2a580 5f 54 43 4c 41 50 49 20 72 65 73 74 6f 72 65 5f  _TCLAPI restore_
2a590 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c  prng_state(.  Cl
2a5a0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2a5b0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
2a5c0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
2a5d0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
2a5e0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
2a5f0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
2a600 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
2a610 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
2a620 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
2a630 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
2a640 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2a650 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
2a660 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
2a670 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
2a680 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
2a690 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
2a6a0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
2a6b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
2a6c0 47 5f 52 45 53 54 4f 52 45 29 3b 0a 20 20 72 65  G_RESTORE);.  re
2a6d0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
2a6e0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65  *.** tclcmd:  re
2a6f0 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a  set_prng_state.*
2a700 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
2a710 49 54 45 5f 54 43 4c 41 50 49 20 72 65 73 65 74  ITE_TCLAPI reset
2a720 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43  _prng_state(.  C
2a730 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
2a740 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
2a750 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
2a760 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
2a770 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
2a780 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2a790 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2a7a0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2a7b0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2a7c0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
2a7d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2a7e0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
2a7f0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
2a800 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
2a810 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2a820 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
2a830 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
2a840 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
2a850 4e 47 5f 52 45 53 45 54 29 3b 0a 20 20 72 65 74  NG_RESET);.  ret
2a860 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2a870 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61  *.** tclcmd:  da
2a880 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f  tabase_may_be_co
2a890 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69  rrupt.**.** Indi
2a8a0 63 61 74 65 20 74 68 61 74 20 64 61 74 61 62 61  cate that databa
2a8b0 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20 62  se files might b
2a8c0 65 20 63 6f 72 72 75 70 74 2e 20 20 49 6e 20 6f  e corrupt.  In o
2a8d0 74 68 65 72 20 77 6f 72 64 73 2c 20 73 65 74 20  ther words, set 
2a8e0 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20 73 74  the normal.** st
2a8f0 61 74 65 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e  ate of operation
2a900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2a910 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 64 61  SQLITE_TCLAPI da
2a920 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f  tabase_may_be_co
2a930 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e 74 44  rrupt(.  ClientD
2a940 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
2a950 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
2a960 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
2a970 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
2a980 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2a990 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2a9a0 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2a9b0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2a9c0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2a9d0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
2a9e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2a9f0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
2aa00 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
2aa10 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
2aa20 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
2aa30 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
2aa40 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2aa50 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f  ESTCTRL_NEVER_CO
2aa60 52 52 55 50 54 2c 20 30 29 3b 0a 20 20 72 65 74  RRUPT, 0);.  ret
2aa70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a  urn TCL_OK;.}./*
2aa80 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 64 61 74  .** tclcmd:  dat
2aa90 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72  abase_never_corr
2aaa0 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e 64 69 63 61  upt.**.** Indica
2aab0 74 65 20 74 68 61 74 20 64 61 74 61 62 61 73 65  te that database
2aac0 20 66 69 6c 65 73 20 61 72 65 20 61 6c 77 61 79   files are alway
2aad0 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 2e 20 20  s well-formed.  
2aae0 54 68 69 73 20 65 6e 61 62 6c 65 73 20 65 78 74  This enables ext
2aaf0 72 61 20 61 73 73 65 72 74 28 29 0a 2a 2a 20 73  ra assert().** s
2ab00 74 61 74 65 6d 65 6e 74 73 20 74 68 61 74 20 74  tatements that t
2ab10 65 73 74 20 63 6f 6e 64 69 74 69 6f 6e 73 20 74  est conditions t
2ab20 68 61 74 20 61 72 65 20 61 6c 77 61 79 73 20 74  hat are always t
2ab30 72 75 65 20 66 6f 72 20 77 65 6c 6c 2d 66 6f 72  rue for well-for
2ab40 6d 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  med databases..*
2ab50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
2ab60 49 54 45 5f 54 43 4c 41 50 49 20 64 61 74 61 62  ITE_TCLAPI datab
2ab70 61 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70  ase_never_corrup
2ab80 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
2ab90 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
2aba0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
2abb0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
2abc0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
2abd0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
2abe0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
2abf0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
2ac00 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
2ac10 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
2ac20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
2ac30 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
2ac40 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
2ac50 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2ac60 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
2ac70 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
2ac80 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2ac90 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2aca0 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50  TRL_NEVER_CORRUP
2acb0 54 2c 20 31 29 3b 0a 20 20 72 65 74 75 72 6e 20  T, 1);.  return 
2acc0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
2acd0 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63 68 65   tclcmd:  pcache
2ace0 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69 63  _stats.*/.static
2acf0 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
2ad00 50 49 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73  PI test_pcache_s
2ad10 74 61 74 73 28 0a 20 20 43 6c 69 65 6e 74 44 61  tats(.  ClientDa
2ad20 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
2ad30 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
2ad40 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
2ad50 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
2ad60 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2ad70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2ad80 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2ad90 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2ada0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
2adb0 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
2adc0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
2add0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
2ade0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2adf0 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
2ae00 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
2ae10 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20 20 69 6e    int nMin;.  in
2ae20 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74 20 6e 43  t nMax;.  int nC
2ae30 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74 20 6e 52  urrent;.  int nR
2ae40 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20 54 63 6c  ecyclable;.  Tcl
2ae50 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 73  _Obj *pRet;..  s
2ae60 71 6c 69 74 65 33 50 63 61 63 68 65 53 74 61 74  qlite3PcacheStat
2ae70 73 28 26 6e 43 75 72 72 65 6e 74 2c 20 26 6e 4d  s(&nCurrent, &nM
2ae80 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e 52 65 63  ax, &nMin, &nRec
2ae90 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20 70 52 65  yclable);..  pRe
2aea0 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29  t = Tcl_NewObj()
2aeb0 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
2aec0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2aed0 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
2aee0 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 63 75 72  ewStringObj("cur
2aef0 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a 20 20 54  rent", -1));.  T
2af00 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2af10 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2af20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
2af30 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29 29 3b 0a  Obj(nCurrent));.
2af40 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
2af50 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
2af60 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
2af70 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61 78 22 2c  StringObj("max",
2af80 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73   -1));.  Tcl_Lis
2af90 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2afa0 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
2afb0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d  Tcl_NewIntObj(nM
2afc0 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  ax));.  Tcl_List
2afd0 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2afe0 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54  (interp, pRet, T
2aff0 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
2b000 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a 20 20 54  "min", -1));.  T
2b010 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2b020 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
2b030 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
2b040 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20 20 54 63  Obj(nMin));.  Tc
2b050 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2b060 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
2b070 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
2b080 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c 61 62 6c  ngObj("recyclabl
2b090 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  e", -1));.  Tcl_
2b0a0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2b0b0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
2b0c0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
2b0d0 28 6e 52 65 63 79 63 6c 61 62 6c 65 29 29 3b 0a  (nRecyclable));.
2b0e0 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
2b0f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ult(interp, pRet
2b100 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  );..  return TCL
2b110 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
2b120 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c  QLITE_ENABLE_UNL
2b130 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69  OCK_NOTIFY.stati
2b140 63 20 76 6f 69 64 20 74 65 73 74 5f 75 6e 6c 6f  c void test_unlo
2b150 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28 76 6f 69  ck_notify_cb(voi
2b160 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74 20 6e 41  d **aArg, int nA
2b170 72 67 29 7b 0a 20 20 69 6e 74 20 69 69 3b 0a 20  rg){.  int ii;. 
2b180 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 41   for(ii=0; ii<nA
2b190 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 54  rg; ii++){.    T
2b1a0 63 6c 5f 45 76 61 6c 45 78 28 28 54 63 6c 5f 49  cl_EvalEx((Tcl_I
2b1b0 6e 74 65 72 70 20 2a 29 61 41 72 67 5b 69 69 5d  nterp *)aArg[ii]
2b1c0 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  , "unlock_notify
2b1d0 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56 41 4c 5f  ", -1, TCL_EVAL_
2b1e0 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a 7d 0a 23  GLOBAL);.  }.}.#
2b1f0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
2b200 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f  ENABLE_UNLOCK_NO
2b210 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 74  TIFY */../*.** t
2b220 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f  clcmd:  sqlite3_
2b230 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 20 64 62  unlock_notify db
2b240 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
2b250 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f  E_ENABLE_UNLOCK_
2b260 4e 4f 54 49 46 59 0a 73 74 61 74 69 63 20 69 6e  NOTIFY.static in
2b270 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
2b280 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  test_unlock_noti
2b290 66 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  fy(.  ClientData
2b2a0 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
2b2b0 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  Unused */.  Tcl_
2b2c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2b2d0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2b2e0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2b2f0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
2b300 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
2b310 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
2b320 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
2b330 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
2b340 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2b350 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
2b360 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
2b370 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
2b380 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
2b390 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
2b3a0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2b3b0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2b3c0 44 42 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  DB");.    return
2b3d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2b3e0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2b3f0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
2b400 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
2b410 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
2b420 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2b430 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
2b440 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  ite3_unlock_noti
2b450 66 79 28 64 62 2c 20 74 65 73 74 5f 75 6e 6c 6f  fy(db, test_unlo
2b460 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 2c 20 28 76  ck_notify_cb, (v
2b470 6f 69 64 20 2a 29 69 6e 74 65 72 70 29 3b 0a 20  oid *)interp);. 
2b480 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
2b490 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
2b4a0 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
2b4b0 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72  TCL_STATIC);.  r
2b4c0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2b4d0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63  #endif../*.** tc
2b4e0 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77  lcmd:  sqlite3_w
2b4f0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 64 62  al_checkpoint db
2b500 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a 73 74 61 74 69   ?NAME?.*/.stati
2b510 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2b520 41 50 49 20 74 65 73 74 5f 77 61 6c 5f 63 68 65  API test_wal_che
2b530 63 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e  ckpoint(.  Clien
2b540 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
2b550 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
2b560 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2b570 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
2b580 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
2b590 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
2b5a0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
2b5b0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
2b5c0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2b5d0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
2b5e0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2b5f0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
2b600 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
2b610 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
2b620 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
2b630 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
2b640 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
2b650 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2b660 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2b670 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2b680 22 44 42 20 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20  "DB ?NAME?");.  
2b690 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2b6a0 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
2b6b0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2b6c0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2b6d0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2b6e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
2b6f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2b700 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20  if( objc==3 ){. 
2b710 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
2b720 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
2b730 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
2b740 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
2b750 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 54  nt(db, zDb);.  T
2b760 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
2b770 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
2b780 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
2b790 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74  L_STATIC);.  ret
2b7a0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2b7b0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71  *.** tclcmd:  sq
2b7c0 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
2b7d0 6f 69 6e 74 5f 76 32 20 64 62 20 4d 4f 44 45 20  oint_v2 db MODE 
2b7e0 3f 4e 41 4d 45 3f 0a 2a 2a 0a 2a 2a 20 54 68 69  ?NAME?.**.** Thi
2b7f0 73 20 63 6f 6d 6d 61 6e 64 20 63 61 6c 6c 73 20  s command calls 
2b800 74 68 65 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69  the wal_checkpoi
2b810 6e 74 5f 76 32 28 29 20 66 75 6e 63 74 69 6f 6e  nt_v2() function
2b820 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 66   with the specif
2b830 69 65 64 0a 2a 2a 20 6d 6f 64 65 20 61 72 67 75  ied.** mode argu
2b840 6d 65 6e 74 20 28 70 61 73 73 69 76 65 2c 20 66  ment (passive, f
2b850 75 6c 6c 20 6f 72 20 72 65 73 74 61 72 74 29 2e  ull or restart).
2b860 20 49 66 20 70 72 65 73 65 6e 74 2c 20 74 68 65   If present, the
2b870 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 0a 2a   database name.*
2b880 2a 20 4e 41 4d 45 20 69 73 20 70 61 73 73 65 64  * NAME is passed
2b890 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61   as the second a
2b8a0 72 67 75 6d 65 6e 74 20 74 6f 20 77 61 6c 5f 63  rgument to wal_c
2b8b0 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 2e 20  heckpoint_v2(). 
2b8c0 49 66 20 69 74 20 74 68 65 0a 2a 2a 20 4e 41 4d  If it the.** NAM
2b8d0 45 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f  E argument is no
2b8e0 74 20 70 72 65 73 65 6e 74 2c 20 61 20 4e 55 4c  t present, a NUL
2b8f0 4c 20 70 6f 69 6e 74 65 72 20 69 73 20 70 61 73  L pointer is pas
2b900 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a  sed instead..**.
2b910 2a 2a 20 49 66 20 77 61 6c 5f 63 68 65 63 6b 70  ** If wal_checkp
2b920 6f 69 6e 74 5f 76 32 28 29 20 72 65 74 75 72 6e  oint_v2() return
2b930 73 20 61 6e 79 20 76 61 6c 75 65 20 6f 74 68 65  s any value othe
2b940 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 42 55  r than SQLITE_BU
2b950 53 59 20 6f 72 0a 2a 2a 20 53 51 4c 49 54 45 5f  SY or.** SQLITE_
2b960 4f 4b 2c 20 74 68 65 6e 20 74 68 69 73 20 63 6f  OK, then this co
2b970 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 54 43  mmand returns TC
2b980 4c 5f 45 52 52 4f 52 2e 20 54 68 65 20 54 63 6c  L_ERROR. The Tcl
2b990 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 0a 2a   result is set.*
2b9a0 2a 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6d  * to the error m
2b9b0 65 73 73 61 67 65 20 6f 62 74 61 69 6e 65 64 20  essage obtained 
2b9c0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72  from sqlite3_err
2b9d0 6d 73 67 28 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  msg()..**.** Oth
2b9e0 65 72 77 69 73 65 2c 20 74 68 69 73 20 63 6f 6d  erwise, this com
2b9f0 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 6c  mand returns a l
2ba00 69 73 74 20 6f 66 20 74 68 72 65 65 20 69 6e 74  ist of three int
2ba10 65 67 65 72 73 2e 20 54 68 65 20 66 69 72 73 74  egers. The first
2ba20 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 73 20 31   integer.** is 1
2ba30 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
2ba40 77 61 73 20 72 65 74 75 72 6e 65 64 2c 20 6f 72  was returned, or
2ba50 20 30 20 6f 74 68 65 72 77 69 73 65 2e 20 54 68   0 otherwise. Th
2ba60 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20  e following two 
2ba70 69 6e 74 65 67 65 72 73 0a 2a 2a 20 61 72 65 20  integers.** are 
2ba80 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72  the values retur
2ba90 6e 65 64 20 76 69 61 20 74 68 65 20 6f 75 74 70  ned via the outp
2baa0 75 74 20 70 61 72 61 6d 65 74 65 72 73 20 62 79  ut parameters by
2bab0 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f   wal_checkpoint_
2bac0 76 32 28 29 20 2d 0a 2a 2a 20 74 68 65 20 6e 75  v2() -.** the nu
2bad0 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
2bae0 6e 20 74 68 65 20 6c 6f 67 20 61 6e 64 20 74 68  n the log and th
2baf0 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
2bb00 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 0a 2a 2a  es in the log.**
2bb10 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
2bb20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f  checkpointed..*/
2bb30 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
2bb40 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 77  TE_TCLAPI test_w
2bb50 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
2bb60 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
2bb70 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e  lientData, /* Un
2bb80 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
2bb90 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
2bba0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
2bbb0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
2bbc0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
2bbd0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
2bbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bbf0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
2bc00 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
2bc10 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
2bc20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2bc30 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68  ments */.){.  ch
2bc40 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73  ar *zDb = 0;.  s
2bc50 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
2bc60 74 20 72 63 3b 0a 0a 20 20 69 6e 74 20 65 4d 6f  t rc;..  int eMo
2bc70 64 65 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67 20 3d  de;.  int nLog =
2bc80 20 2d 35 35 35 3b 0a 20 20 69 6e 74 20 6e 43 6b   -555;.  int nCk
2bc90 70 74 20 3d 20 2d 35 35 35 3b 0a 20 20 54 63 6c  pt = -555;.  Tcl
2bca0 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63  _Obj *pRet;..  c
2bcb0 6f 6e 73 74 20 63 68 61 72 20 2a 20 61 4d 6f 64  onst char * aMod
2bcc0 65 5b 5d 20 3d 20 7b 20 22 70 61 73 73 69 76 65  e[] = { "passive
2bcd0 22 2c 20 22 66 75 6c 6c 22 2c 20 22 72 65 73 74  ", "full", "rest
2bce0 61 72 74 22 2c 20 22 74 72 75 6e 63 61 74 65 22  art", "truncate"
2bcf0 2c 20 30 20 7d 3b 0a 20 20 61 73 73 65 72 74 28  , 0 };.  assert(
2bd00 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
2bd10 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20 29 3b  NT_PASSIVE==0 );
2bd20 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
2bd30 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
2bd40 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74  L==1 );.  assert
2bd50 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
2bd60 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32 20 29  INT_RESTART==2 )
2bd70 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
2bd80 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 54 52  TE_CHECKPOINT_TR
2bd90 55 4e 43 41 54 45 3d 3d 33 20 29 3b 0a 0a 20 20  UNCATE==3 );..  
2bda0 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f  if( objc!=3 && o
2bdb0 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
2bdc0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2bdd0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2bde0 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 22  "DB MODE ?NAME?"
2bdf0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2be00 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2be10 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
2be20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74     zDb = Tcl_Get
2be30 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
2be40 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2be50 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2be60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2be70 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 7c 7c 20  jv[1]), &db) || 
2be80 28 0a 20 20 20 20 20 20 54 43 4c 5f 4f 4b 21 3d  (.      TCL_OK!=
2be90 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
2bea0 6a 28 30 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 65  j(0, objv[2], &e
2beb0 4d 6f 64 65 29 0a 20 20 20 26 26 20 54 43 4c 5f  Mode).   && TCL_
2bec0 4f 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 64 65 78  OK!=Tcl_GetIndex
2bed0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2bee0 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c 20  objv[2], aMode, 
2bef0 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65 4d 6f 64  "mode", 0, &eMod
2bf00 65 29 20 0a 20 20 29 29 7b 0a 20 20 20 20 72 65  e) .  )){.    re
2bf10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2bf20 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
2bf30 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
2bf40 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 65  nt_v2(db, zDb, e
2bf50 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e 43  Mode, &nLog, &nC
2bf60 6b 70 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  kpt);.  if( rc!=
2bf70 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
2bf80 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
2bf90 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2bfa0 7a 45 72 72 43 6f 64 65 20 3d 20 73 71 6c 69 74  zErrCode = sqlit
2bfb0 65 33 45 72 72 4e 61 6d 65 28 72 63 29 3b 0a 20  e3ErrName(rc);. 
2bfc0 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75     Tcl_ResetResu
2bfd0 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20  lt(interp);.    
2bfe0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2bff0 28 69 6e 74 65 72 70 2c 20 7a 45 72 72 43 6f 64  (interp, zErrCod
2c000 65 2c 20 22 20 2d 20 22 2c 20 28 63 68 61 72 20  e, " - ", (char 
2c010 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
2c020 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (db), 0);.    re
2c030 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2c040 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54 63    }..  pRet = Tc
2c050 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63  l_NewObj();.  Tc
2c060 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
2c070 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
2c080 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
2c090 62 6a 28 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  bj(rc==SQLITE_BU
2c0a0 53 59 3f 31 3a 30 29 29 3b 0a 20 20 54 63 6c 5f  SY?1:0));.  Tcl_
2c0b0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
2c0c0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
2c0d0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
2c0e0 28 6e 4c 6f 67 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nLog));.  Tcl_L
2c0f0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2c100 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
2c110 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
2c120 6e 43 6b 70 74 29 29 3b 0a 20 20 54 63 6c 5f 53  nCkpt));.  Tcl_S
2c130 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
2c140 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65  rp, pRet);..  re
2c150 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2c160 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
2c170 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
2c180 68 65 63 6b 70 6f 69 6e 74 20 64 62 20 56 41 4c  heckpoint db VAL
2c190 55 45 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  UE.*/.static int
2c1a0 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
2c1b0 65 73 74 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  est_wal_autochec
2c1c0 6b 70 6f 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74  kpoint(.  Client
2c1d0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
2c1e0 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20   /* Unused */.  
2c1f0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2c200 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
2c210 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
2c220 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
2c230 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
2c240 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
2c250 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2c260 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
2c270 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2c280 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
2c290 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
2c2a0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
2c2b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
2c2c0 20 69 56 61 6c 3b 0a 0a 0a 20 20 69 66 28 20 6f   iVal;...  if( o
2c2d0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
2c2e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2c2f0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2c300 22 44 42 20 56 41 4c 55 45 22 29 3b 0a 20 20 20  "DB VALUE");.   
2c310 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2c320 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
2c330 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2c340 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2c350 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2c360 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e  .   || Tcl_GetIn
2c370 74 46 72 6f 6d 4f 62 6a 28 30 2c 20 6f 62 6a 76  tFromObj(0, objv
2c380 5b 32 5d 2c 20 26 69 56 61 6c 29 0a 20 20 29 7b  [2], &iVal).  ){
2c390 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2c3a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63  ERROR;.  }..  rc
2c3b0 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61   = sqlite3_wal_a
2c3c0 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  utocheckpoint(db
2c3d0 2c 20 69 56 61 6c 29 3b 0a 20 20 54 63 6c 5f 52  , iVal);.  Tcl_R
2c3e0 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
2c3f0 70 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  p);.  if( rc!=SQ
2c400 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63  LITE_OK ){.    c
2c410 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 43  onst char *zErrC
2c420 6f 64 65 20 3d 20 73 71 6c 69 74 65 33 45 72 72  ode = sqlite3Err
2c430 4e 61 6d 65 28 72 63 29 3b 0a 20 20 20 20 54 63  Name(rc);.    Tc
2c440 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
2c450 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
2c460 72 69 6e 67 4f 62 6a 28 7a 45 72 72 43 6f 64 65  ringObj(zErrCode
2c470 2c 20 2d 31 29 29 3b 0a 20 20 20 20 72 65 74 75  , -1));.    retu
2c480 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2c490 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  }..  return TCL_
2c4a0 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  OK;.}.../*.** tc
2c4b0 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73 71 6c 69  lcmd:  test_sqli
2c4c0 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49 50 54 3f  te3_log ?SCRIPT?
2c4d0 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74 72 75 63  .*/.static struc
2c4e0 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b 20 7b 0a  t LogCallback {.
2c4f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 70 49    Tcl_Interp *pI
2c500 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
2c510 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67 63 61 6c   *pObj;.} logcal
2c520 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30 7d 3b 0a  lback = {0, 0};.
2c530 73 74 61 74 69 63 20 76 6f 69 64 20 78 4c 6f 67  static void xLog
2c540 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 75  callback(void *u
2c550 6e 75 73 65 64 2c 20 69 6e 74 20 65 72 72 2c 20  nused, int err, 
2c560 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 54  char *zMsg){.  T
2c570 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20 3d 20 54  cl_Obj *pNew = T
2c580 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28  cl_DuplicateObj(
2c590 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
2c5a0 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
2c5b0 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 20 20 54  Count(pNew);.  T
2c5c0 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
2c5d0 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20 20 20 30  Element(.      0
2c5e0 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e 65 77 53  , pNew, Tcl_NewS
2c5f0 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33  tringObj(sqlite3
2c600 45 72 72 4e 61 6d 65 28 65 72 72 29 2c 20 2d 31  ErrName(err), -1
2c610 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  ).  );.  Tcl_Lis
2c620 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
2c630 74 28 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e  t(0, pNew, Tcl_N
2c640 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a 4d 73 67  ewStringObj(zMsg
2c650 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
2c660 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61 6c 6c 62  alObjEx(logcallb
2c670 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20 70 4e 65  ack.pInterp, pNe
2c680 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  w, TCL_EVAL_GLOB
2c690 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  AL|TCL_EVAL_DIRE
2c6a0 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52  CT);.  Tcl_DecrR
2c6b0 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a 7d  efCount(pNew);.}
2c6c0 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
2c6d0 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 73  TE_TCLAPI test_s
2c6e0 71 6c 69 74 65 33 5f 6c 6f 67 28 0a 20 20 43 6c  qlite3_log(.  Cl
2c6f0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
2c700 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2c710 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2c720 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2c730 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2c740 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2c750 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
2c760 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2c770 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2c780 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
2c790 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
2c7a0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
2c7b0 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6f  ts */.){.  if( o
2c7c0 62 6a 63 3e 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc>2 ){.    Tcl
2c7d0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2c7e0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2c7f0 53 43 52 49 50 54 22 29 3b 0a 20 20 20 20 72 65  SCRIPT");.    re
2c800 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2c810 20 20 7d 0a 20 20 69 66 28 20 6c 6f 67 63 61 6c    }.  if( logcal
2c820 6c 62 61 63 6b 2e 70 4f 62 6a 20 29 7b 0a 20 20  lback.pObj ){.  
2c830 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
2c840 6e 74 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  nt(logcallback.p
2c850 4f 62 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c  Obj);.    logcal
2c860 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 30 3b 0a  lback.pObj = 0;.
2c870 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e      logcallback.
2c880 70 49 6e 74 65 72 70 20 3d 20 30 3b 0a 20 20 20  pInterp = 0;.   
2c890 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
2c8a0 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
2c8b0 47 2c 20 28 76 6f 69 64 2a 29 30 2c 20 28 76 6f  G, (void*)0, (vo
2c8c0 69 64 2a 29 30 29 3b 0a 20 20 7d 0a 20 20 69 66  id*)0);.  }.  if
2c8d0 28 20 6f 62 6a 63 3e 31 20 29 7b 0a 20 20 20 20  ( objc>1 ){.    
2c8e0 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a  logcallback.pObj
2c8f0 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 20 20 20   = objv[1];.    
2c900 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
2c910 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62  (logcallback.pOb
2c920 6a 29 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62  j);.    logcallb
2c930 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 69 6e  ack.pInterp = in
2c940 74 65 72 70 3b 0a 20 20 20 20 73 71 6c 69 74 65  terp;.    sqlite
2c950 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
2c960 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67  CONFIG_LOG, xLog
2c970 63 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64 2a  callback, (void*
2c980 29 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )0);.  }.  retur
2c990 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
2c9a0 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72  **     tcl_objpr
2c9b0 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41  oc COMMANDNAME A
2c9c0 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e  RGS....**.** Run
2c9d0 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75   a TCL command u
2c9e0 73 69 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f 63  sing its objProc
2c9f0 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 72   interface.  Thr
2ca00 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a  ow an error if.*
2ca10 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61  * the command ha
2ca20 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74  s no objProc int
2ca30 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
2ca40 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c  c int SQLITE_TCL
2ca50 41 50 49 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63  API runAsObjProc
2ca60 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
2ca70 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2ca80 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2ca90 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2caa0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2cab0 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
2cac0 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69 66 28  o cmdInfo;.  if(
2cad0 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54   objc<2 ){.    T
2cae0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2caf0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2cb00 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22 29 3b   "COMMAND ...");
2cb10 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2cb20 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2cb30 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64   !Tcl_GetCommand
2cb40 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c  Info(interp, Tcl
2cb50 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2cb60 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  1]), &cmdInfo) )
2cb70 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2cb80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2cb90 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
2cba0 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d: ",.          
2cbb0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2cbc0 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29  bjv[1]), (char*)
2cbd0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
2cbe0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2cbf0 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50  if( cmdInfo.objP
2cc00 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63  roc==0 ){.    Tc
2cc10 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2cc20 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
2cc30 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 3a 20  has no objProc: 
2cc40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 54 63  ",.           Tc
2cc50 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2cc60 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30 29 3b  [1]), (char*)0);
2cc70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2cc80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
2cc90 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62 6a 50  urn cmdInfo.objP
2cca0 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  roc(cmdInfo.objC
2ccb0 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72  lientData, inter
2ccc0 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 76 2b  p, objc-1, objv+
2ccd0 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  1);.}..#ifndef S
2cce0 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
2ccf0 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49 4e 47  IN./*.** WARNING
2cd00 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  : The following 
2cd10 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e 74 45  function, printE
2cd20 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28  xplainQueryPlan(
2cd30 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a 2a 2a  ) is an exact.**
2cd40 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70 6c 65   copy of example
2cd50 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70 2e 69   code from eqp.i
2cd60 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20 49 66  n (eqp.html). If
2cd70 20 74 68 69 73 20 63 6f 64 65 20 69 73 20 6d 6f   this code is mo
2cd80 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  dified,.** then 
2cd90 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  the documentatio
2cda0 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74 6f 20  n copy needs to 
2cdb0 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73 20 77  be modified as w
2cdc0 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20 41 72  ell..*/./*.** Ar
2cdd0 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69 73 20  gument pStmt is 
2cde0 61 20 70 72 65 70 61 72 65 64 20 53 51 4c 20 73  a prepared SQL s
2cdf0 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20 66  tatement. This f
2ce00 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c 65 73  unction compiles
2ce10 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e 20 51  .** an EXPLAIN Q
2ce20 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e  UERY PLAN comman
2ce30 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e 20 74  d to report on t
2ce40 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
2ce50 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20 70 72  ement,.** and pr
2ce60 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72 74 20  ints the report 
2ce70 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e 67 20  to stdout using 
2ce80 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69 6e 74  printf()..*/.int
2ce90 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
2cea0 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33 5f 73  ryPlan(sqlite3_s
2ceb0 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20 20 63  tmt *pStmt){.  c
2cec0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
2ced0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2cee0 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f 0a 20  * Input SQL */. 
2cef0 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b   char *zExplain;
2cf00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf10 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45 58 50   /* SQL with EXP
2cf20 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
2cf30 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20 20 73  prepended */.  s
2cf40 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78  qlite3_stmt *pEx
2cf50 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20 2f  plain;         /
2cf60 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50 4c 41  * Compiled EXPLA
2cf70 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f  IN QUERY PLAN co
2cf80 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 72  mmand */.  int r
2cf90 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2cfa0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2cfb0 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73  turn code from s
2cfc0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2cfd0 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c 20 3d  2() */..  zSql =
2cfe0 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 74   sqlite3_sql(pSt
2cff0 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d  mt);.  if( zSql=
2d000 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
2d010 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a 45 78  TE_ERROR;..  zEx
2d020 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f  plain = sqlite3_
2d030 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49 4e  mprintf("EXPLAIN
2d040 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22 2c   QUERY PLAN %s",
2d050 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 45   zSql);.  if( zE
2d060 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65 74 75  xplain==0 ) retu
2d070 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
2d080 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
2d090 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71 6c 69  _prepare_v2(sqli
2d0a0 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53  te3_db_handle(pS
2d0b0 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e 2c 20  tmt), zExplain, 
2d0c0 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
2d0d0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
2d0e0 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 69  e(zExplain);.  i
2d0f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2d100 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
2d110 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52   while( SQLITE_R
2d120 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70  OW==sqlite3_step
2d130 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a 20 20  (pExplain) ){.  
2d140 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69 64 20    int iSelectid 
2d150 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
2d160 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30  _int(pExplain, 0
2d170 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72 64 65  );.    int iOrde
2d180 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r = sqlite3_colu
2d190 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
2d1a0 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69 46 72   1);.    int iFr
2d1b0 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  om = sqlite3_col
2d1c0 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
2d1d0 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 2);.    const 
2d1e0 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20 3d 20  char *zDetail = 
2d1f0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 73 71  (const char *)sq
2d200 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2d210 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a  t(pExplain, 3);.
2d220 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25 64 20  .    printf("%d 
2d230 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69 53 65  %d %d %s\n", iSe
2d240 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72 2c 20  lectid, iOrder, 
2d250 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c 29 3b  iFrom, zDetail);
2d260 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73  .  }..  return s
2d270 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2d280 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a 73 74  pExplain);.}..st
2d290 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
2d2a0 54 43 4c 41 50 49 20 74 65 73 74 5f 70 72 69 6e  TCLAPI test_prin
2d2b0 74 5f 65 71 70 28 0a 20 20 76 6f 69 64 20 2a 20  t_eqp(.  void * 
2d2c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2d2d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2d2e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2d2f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2d300 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 72  bjv[].){.  int r
2d310 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  c;.  sqlite3_stm
2d320 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
2d330 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
2d340 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2d350 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2d360 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72  , "STMT");.    r
2d370 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d380 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74  .  }.  if( getSt
2d390 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
2d3a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2d3b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
2d3c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2d3d0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 70 72 69  RROR;.  rc = pri
2d3e0 6e 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c  ntExplainQueryPl
2d3f0 61 6e 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20  an(pStmt);.  /* 
2d400 54 68 69 73 20 69 73 20 6e 65 65 64 65 64 20 6f  This is needed o
2d410 6e 20 57 69 6e 64 6f 77 73 20 73 6f 20 74 68 61  n Windows so tha
2d420 74 20 61 20 74 65 73 74 20 63 61 73 65 20 75 73  t a test case us
2d430 69 6e 67 20 74 68 69 73 20 0a 20 20 2a 2a 20 66  ing this .  ** f
2d440 75 6e 63 74 69 6f 6e 20 63 61 6e 20 6f 70 65 6e  unction can open
2d450 20 61 20 72 65 61 64 20 70 69 70 65 20 61 6e 64   a read pipe and
2d460 20 67 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   get the output 
2d470 6f 66 0a 20 20 2a 2a 20 70 72 69 6e 74 45 78 70  of.  ** printExp
2d480 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 29 20  lainQueryPlan() 
2d490 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a  immediately..  *
2d4a0 2f 0a 20 20 66 66 6c 75 73 68 28 73 74 64 6f 75  /.  fflush(stdou
2d4b0 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  t);.  Tcl_SetRes
2d4c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
2d4d0 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
2d4e0 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  rc), 0);.  retur
2d4f0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
2d500 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
2d510 54 5f 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a  T_EXPLAIN */../*
2d520 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74  .** sqlite3_test
2d530 5f 63 6f 6e 74 72 6f 6c 20 56 45 52 42 20 41 52  _control VERB AR
2d540 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  GS....*/.static 
2d550 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50  int SQLITE_TCLAP
2d560 49 20 74 65 73 74 5f 74 65 73 74 5f 63 6f 6e 74  I test_test_cont
2d570 72 6f 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  rol(.  void * cl
2d580 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2d590 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2d5a0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2d5b0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2d5c0 76 5b 5d 0a 29 7b 0a 20 20 73 74 72 75 63 74 20  v[].){.  struct 
2d5d0 56 65 72 62 20 7b 0a 20 20 20 20 63 6f 6e 73 74  Verb {.    const
2d5e0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
2d5f0 20 20 69 6e 74 20 69 3b 0a 20 20 7d 20 61 56 65    int i;.  } aVe
2d600 72 62 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  rb[] = {.    { "
2d610 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2d620 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 22  LOCALTIME_FAULT"
2d630 2c 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  , SQLITE_TESTCTR
2d640 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
2d650 54 20 7d 2c 20 0a 20 20 20 20 7b 20 22 53 51 4c  T }, .    { "SQL
2d660 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
2d670 54 45 52 5f 4d 4d 41 50 22 2c 20 20 20 20 20 53  TER_MMAP",     S
2d680 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
2d690 4f 52 54 45 52 5f 4d 4d 41 50 20 20 20 20 20 7d  ORTER_MMAP     }
2d6a0 2c 20 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  , .    { "SQLITE
2d6b0 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54  _TESTCTRL_IMPOST
2d6c0 45 52 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  ER",        SQLI
2d6d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
2d6e0 53 54 45 52 20 20 20 20 20 20 20 20 7d 2c 0a 20  STER        },. 
2d6f0 20 7d 3b 0a 20 20 69 6e 74 20 69 56 65 72 62 3b   };.  int iVerb;
2d700 0a 20 20 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20  .  int iFlag;.  
2d710 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
2d720 62 6a 63 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c  bjc<2 ){.    Tcl
2d730 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
2d740 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
2d750 56 45 52 42 20 41 52 47 53 2e 2e 2e 22 29 3b 0a  VERB ARGS...");.
2d760 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2d770 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  RROR;.  }..  rc 
2d780 3d 20 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72  = Tcl_GetIndexFr
2d790 6f 6d 4f 62 6a 53 74 72 75 63 74 28 0a 20 20 20  omObjStruct(.   
2d7a0 20 20 20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b     interp, objv[
2d7b0 31 5d 2c 20 61 56 65 72 62 2c 20 73 69 7a 65 6f  1], aVerb, sizeo
2d7c0 66 28 61 56 65 72 62 5b 30 5d 29 2c 20 22 56 45  f(aVerb[0]), "VE
2d7d0 52 42 22 2c 20 30 2c 20 26 69 56 65 72 62 0a 20  RB", 0, &iVerb. 
2d7e0 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43   );.  if( rc!=TC
2d7f0 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
2d800 3b 0a 0a 20 20 69 46 6c 61 67 20 3d 20 61 56 65  ;..  iFlag = aVe
2d810 72 62 5b 69 56 65 72 62 5d 2e 69 3b 0a 20 20 73  rb[iVerb].i;.  s
2d820 77 69 74 63 68 28 20 69 46 6c 61 67 20 29 7b 0a  witch( iFlag ){.
2d830 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2d840 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
2d850 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20  ME_FAULT: {.    
2d860 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20    int val;.     
2d870 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
2d880 20 20 20 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e          Tcl_Wron
2d890 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2d8a0 20 32 2c 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46 46   2, objv, "ONOFF
2d8b0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
2d8c0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2d8d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2d8e0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
2d8f0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2d900 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[2], &val) ) r
2d910 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
2d930 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
2d940 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41  TE_TESTCTRL_LOCA
2d950 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 76 61 6c  LTIME_FAULT, val
2d960 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2d970 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
2d980 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
2d990 53 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20  SORTER_MMAP: {. 
2d9a0 20 20 20 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20       int val;.  
2d9b0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b      sqlite3 *db;
2d9c0 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63 21  .      if( objc!
2d9d0 3d 34 20 29 7b 0a 20 20 20 20 20 20 20 20 54 63  =4 ){.        Tc
2d9e0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2d9f0 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c 20  nterp, 2, objv, 
2da00 22 44 42 20 4c 49 4d 49 54 22 29 3b 0a 20 20 20  "DB LIMIT");.   
2da10 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
2da20 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20  ERROR;.      }. 
2da30 20 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f       if( getDbPo
2da40 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2da50 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2da60 5b 32 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [2]), &db) ) ret
2da70 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2da80 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74       if( Tcl_Get
2da90 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2daa0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
2dab0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2dac0 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71 6c 69  RROR;.      sqli
2dad0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
2dae0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
2daf0 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62  _SORTER_MMAP, db
2db00 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20 62 72  , val);.      br
2db10 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
2db20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
2db30 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a 20 7b  CTRL_IMPOSTER: {
2db40 0a 20 20 20 20 20 20 69 6e 74 20 6f 6e 4f 66 66  .      int onOff
2db50 2c 20 74 6e 75 6d 3b 0a 20 20 20 20 20 20 63 6f  , tnum;.      co
2db60 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
2db70 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
2db80 20 2a 64 62 3b 0a 20 20 20 20 20 20 69 66 28 20   *db;.      if( 
2db90 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20 20 20 20  objc!=6 ){.     
2dba0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2dbb0 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c 20 6f  rgs(interp, 2, o
2dbc0 62 6a 76 2c 20 22 44 42 20 64 62 4e 61 6d 65 20  bjv, "DB dbName 
2dbd0 6f 6e 4f 66 66 20 74 6e 75 6d 22 29 3b 0a 20 20  onOff tnum");.  
2dbe0 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
2dbf0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a  _ERROR;.      }.
2dc00 20 20 20 20 20 20 69 66 28 20 67 65 74 44 62 50        if( getDbP
2dc10 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
2dc20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
2dc30 76 5b 32 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[2]), &db) ) re
2dc40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2dc50 20 20 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20        zDbName = 
2dc60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
2dc70 6a 76 5b 33 5d 29 3b 0a 20 20 20 20 20 20 69 66  jv[3]);.      if
2dc80 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
2dc90 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
2dca0 5b 34 5d 2c 20 26 6f 6e 4f 66 66 29 20 29 20 72  [4], &onOff) ) r
2dcb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2dcc0 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c 5f 47  .      if( Tcl_G
2dcd0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
2dce0 65 72 70 2c 20 6f 62 6a 76 5b 35 5d 2c 20 26 74  erp, objv[5], &t
2dcf0 6e 75 6d 29 20 29 20 72 65 74 75 72 6e 20 54 43  num) ) return TC
2dd00 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73  L_ERROR;.      s
2dd10 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
2dd20 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
2dd30 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 64 62  TRL_IMPOSTER, db
2dd40 2c 20 7a 44 62 4e 61 6d 65 2c 20 6f 6e 4f 66 66  , zDbName, onOff
2dd50 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 20 20 62  , tnum);.      b
2dd60 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2dd70 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
2dd80 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
2dd90 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2dda0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
2ddb0 49 58 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  IX.#include <sys
2ddc0 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
2ddd0 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
2dde0 68 3e 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 53  h>..static int S
2ddf0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 65 73  QLITE_TCLAPI tes
2de00 74 5f 67 65 74 72 75 73 61 67 65 28 0a 20 20 76  t_getrusage(.  v
2de10 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
2de20 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
2de30 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
2de40 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
2de50 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
2de60 20 63 68 61 72 20 62 75 66 5b 31 30 32 34 5d 3b   char buf[1024];
2de70 0a 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65  .  struct rusage
2de80 20 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 72 2c   r;.  memset(&r,
2de90 20 30 2c 20 73 69 7a 65 6f 66 28 72 29 29 3b 0a   0, sizeof(r));.
2dea0 20 20 67 65 74 72 75 73 61 67 65 28 52 55 53 41    getrusage(RUSA
2deb0 47 45 5f 53 45 4c 46 2c 20 26 72 29 3b 0a 0a 20  GE_SELF, &r);.. 
2dec0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2ded0 66 28 73 69 7a 65 6f 66 28 62 75 66 29 2c 20 62  f(sizeof(buf), b
2dee0 75 66 2c 0a 20 20 20 20 22 72 75 5f 75 74 69 6d  uf,.    "ru_utim
2def0 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 73 74 69  e=%d.%06d ru_sti
2df00 6d 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 6d 69  me=%d.%06d ru_mi
2df10 6e 66 6c 74 3d 25 64 20 72 75 5f 6d 61 6a 66 6c  nflt=%d ru_majfl
2df20 74 3d 25 64 22 2c 20 0a 20 20 20 20 28 69 6e 74  t=%d", .    (int
2df30 29 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 73  )r.ru_utime.tv_s
2df40 65 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 75 74  ec, (int)r.ru_ut
2df50 69 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20  ime.tv_usec, .  
2df60 20 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d    (int)r.ru_stim
2df70 65 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72  e.tv_sec, (int)r
2df80 2e 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65  .ru_stime.tv_use
2df90 63 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72  c, .    (int)r.r
2dfa0 75 5f 6d 69 6e 66 6c 74 2c 20 28 69 6e 74 29 72  u_minflt, (int)r
2dfb0 2e 72 75 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b 0a  .ru_majflt.  );.
2dfc0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2dfd0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2dfe0 65 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c  ewStringObj(buf,
2dff0 20 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20   -1));.  return 
2e000 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
2e010 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  ..#if SQLITE_OS_
2e020 57 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d  WIN./*.** Inform
2e030 61 74 69 6f 6e 20 70 61 73 73 65 64 20 66 72 6f  ation passed fro
2e040 6d 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61  m the main threa
2e050 64 20 69 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f  d into the windo
2e060 77 73 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a  ws file locker.*
2e070 2a 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72  * background thr
2e080 65 61 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77  ead..*/.struct w
2e090 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b  in32FileLocker {
2e0a0 0a 20 20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b  .  char *evName;
2e0b0 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
2e0c0 66 20 65 76 65 6e 74 20 74 6f 20 73 69 67 6e 61  f event to signa
2e0d0 6c 20 74 68 72 65 61 64 20 73 74 61 72 74 75 70  l thread startup
2e0e0 20 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20   */.  HANDLE h; 
2e0f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e            /* Han
2e100 64 6c 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  dle of the file 
2e110 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a  to be locked */.
2e120 20 20 69 6e 74 20 64 65 6c 61 79 31 3b 20 20 20    int delay1;   
2e130 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62        /* Delay b
2e140 65 66 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f  efore locking */
2e150 0a 20 20 69 6e 74 20 64 65 6c 61 79 32 3b 20 20  .  int delay2;  
2e160 20 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20         /* Delay 
2e170 62 65 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67  before unlocking
2e180 20 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20   */.  int ok;   
2e190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e            /* Fin
2e1a0 69 73 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e  ished ok */.  in
2e1b0 74 20 65 72 72 3b 20 20 20 20 20 20 20 20 20 20  t err;          
2e1c0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2e1d0 65 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a  error occurs */.
2e1e0 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20  };.#endif...#if 
2e1f0 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69  SQLITE_OS_WIN.#i
2e200 6e 63 6c 75 64 65 20 3c 70 72 6f 63 65 73 73 2e  nclude <process.
2e210 68 3e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63  h>./*.** The bac
2e220 6b 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74  kground thread t
2e230 68 61 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f  hat does file lo
2e240 63 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  cking..*/.static
2e250 20 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45   void SQLITE_CDE
2e260 43 4c 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  CL win32_file_lo
2e270 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70 70 44  cker(void *pAppD
2e280 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74 20 77  ata){.  struct w
2e290 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 2a  in32FileLocker *
2e2a0 70 20 3d 20 28 73 74 72 75 63 74 20 77 69 6e 33  p = (struct win3
2e2b0 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41 70  2FileLocker*)pAp
2e2c0 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70 2d 3e  pData;.  if( p->
2e2d0 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48 41  evName ){.    HA
2e2e0 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45 76  NDLE ev = OpenEv
2e2f0 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46 59  ent(EVENT_MODIFY
2e300 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c 20 70  _STATE, FALSE, p
2e310 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20 69  ->evName);.    i
2e320 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20 20 20  f ( ev ){.      
2e330 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a 20 20  SetEvent(ev);.  
2e340 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28      CloseHandle(
2e350 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ev);.    }.  }. 
2e360 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31 20 29   if( p->delay1 )
2e370 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79 31   Sleep(p->delay1
2e380 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69 6c  );.  if( LockFil
2e390 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31 30  e(p->h, 0, 0, 10
2e3a0 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b 0a 20  0000000, 0) ){. 
2e3b0 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61     Sleep(p->dela
2e3c0 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b 46  y2);.    UnlockF
2e3d0 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20  ile(p->h, 0, 0, 
2e3e0 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b 0a 20  100000000, 0);. 
2e3f0 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20 20     p->ok = 1;.  
2e400 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65 72  }else{.    p->er
2e410 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c 6f  r = 1;.  }.  Clo
2e420 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b 0a  seHandle(p->h);.
2e430 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70 2d    p->h = 0;.  p-
2e440 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20 70  >delay1 = 0;.  p
2e450 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d 0a  ->delay2 = 0;.}.
2e460 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c 49  #endif..#if SQLI
2e470 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a 20  TE_OS_WIN./*.** 
2e480 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32 5f       lock_win32_
2e490 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44 45  file FILENAME DE
2e4a0 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a 2a  LAY1 DELAY2.**.*
2e4b0 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73 69  * Get an exclusi
2e4c0 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f 63  ve manditory loc
2e4d0 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44 45  k on file for DE
2e4e0 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  LAY2 millisecond
2e4f0 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41 59  s..** Wait DELAY
2e500 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  1 milliseconds b
2e510 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67 20  efore acquiring 
2e520 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
2e530 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
2e540 43 4c 41 50 49 20 77 69 6e 33 32 5f 66 69 6c 65  CLAPI win32_file
2e550 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69 64 20 2a 20  _lock(.  void * 
2e560 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2e570 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2e580 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2e590 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2e5a0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69  bjv[].){.  stati
2e5b0 63 20 73 74 72 75 63 74 20 77 69 6e 33 32 46 69  c struct win32Fi
2e5c0 6c 65 4c 6f 63 6b 65 72 20 78 20 3d 20 7b 20 22  leLocker x = { "
2e5d0 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f 63 6b 22  win32_file_lock"
2e5e0 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 20  , 0, 0, 0, 0, 0 
2e5f0 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
2e600 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 63 68  *zFilename;.  ch
2e610 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
2e620 69 6e 74 20 72 65 74 72 79 20 3d 20 30 3b 0a 20  int retry = 0;. 
2e630 20 48 41 4e 44 4c 45 20 65 76 3b 0a 20 20 44 57   HANDLE ev;.  DW
2e640 4f 52 44 20 77 52 65 73 75 6c 74 3b 0a 20 20 0a  ORD wResult;.  .
2e650 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 26 26    if( objc!=4 &&
2e660 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20 20 20 20   objc!=1 ){.    
2e670 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
2e680 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
2e690 2c 20 22 46 49 4c 45 4e 41 4d 45 20 44 45 4c 41  , "FILENAME DELA
2e6a0 59 31 20 44 45 4c 41 59 32 22 29 3b 0a 20 20 20  Y1 DELAY2");.   
2e6b0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2e6c0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a  R;.  }.  if( obj
2e6d0 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  c==1 ){.    sqli
2e6e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2e6f0 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c  eof(zBuf), zBuf,
2e700 20 22 25 64 20 25 64 20 25 64 20 25 64 20 25 64   "%d %d %d %d %d
2e710 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2e720 20 20 20 20 20 20 20 20 78 2e 6f 6b 2c 20 78 2e          x.ok, x.
2e730 65 72 72 2c 20 78 2e 64 65 6c 61 79 31 2c 20 78  err, x.delay1, x
2e740 2e 64 65 6c 61 79 32 2c 20 78 2e 68 29 3b 0a 20  .delay2, x.h);. 
2e750 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2e760 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
2e770 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2e780 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
2e790 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 78 2e 68    }.  while( x.h
2e7a0 20 26 26 20 72 65 74 72 79 3c 33 30 20 29 7b 0a   && retry<30 ){.
2e7b0 20 20 20 20 72 65 74 72 79 2b 2b 3b 0a 20 20 20      retry++;.   
2e7c0 20 53 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 7d   Sleep(100);.  }
2e7d0 0a 20 20 69 66 28 20 78 2e 68 20 29 7b 0a 20 20  .  if( x.h ){.  
2e7e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
2e7f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 62 75 73 79  lt(interp, "busy
2e800 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  ", (char*)0);.  
2e810 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2e820 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
2e830 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
2e840 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
2e850 20 26 78 2e 64 65 6c 61 79 31 29 20 29 20 72 65   &x.delay1) ) re
2e860 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2e870 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
2e880 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2e890 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e 64 65 6c 61  objv[3], &x.dela
2e8a0 79 32 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  y2) ) return TCL
2e8b0 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69 6c 65 6e  _ERROR;.  zFilen
2e8c0 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
2e8d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
2e8e0 78 2e 68 20 3d 20 43 72 65 61 74 65 46 69 6c 65  x.h = CreateFile
2e8f0 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 47 45 4e 45  (zFilename, GENE
2e900 52 49 43 5f 52 45 41 44 7c 47 45 4e 45 52 49 43  RIC_READ|GENERIC
2e910 5f 57 52 49 54 45 2c 0a 20 20 20 20 20 20 20 20  _WRITE,.        
2e920 20 20 20 20 20 20 46 49 4c 45 5f 53 48 41 52 45        FILE_SHARE
2e930 5f 52 45 41 44 7c 46 49 4c 45 5f 53 48 41 52 45  _READ|FILE_SHARE
2e940 5f 57 52 49 54 45 2c 20 30 2c 20 4f 50 45 4e 5f  _WRITE, 0, OPEN_
2e950 41 4c 57 41 59 53 2c 0a 20 20 20 20 20 20 20 20  ALWAYS,.        
2e960 20 20 20 20 20 20 46 49 4c 45 5f 41 54 54 52 49        FILE_ATTRI
2e970 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20 30 29 3b  BUTE_NORMAL, 0);
2e980 0a 20 20 69 66 28 20 21 78 2e 68 20 29 7b 0a 20  .  if( !x.h ){. 
2e990 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2e9a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 61 6e  ult(interp, "can
2e9b0 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 22  not open file: "
2e9c0 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 63 68  , zFilename, (ch
2e9d0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
2e9e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2e9f0 7d 0a 20 20 65 76 20 3d 20 43 72 65 61 74 65 45  }.  ev = CreateE
2ea00 76 65 6e 74 28 4e 55 4c 4c 2c 20 54 52 55 45 2c  vent(NULL, TRUE,
2ea10 20 46 41 4c 53 45 2c 20 78 2e 65 76 4e 61 6d 65   FALSE, x.evName
2ea20 29 3b 0a 20 20 69 66 20 28 20 21 65 76 20 29 7b  );.  if ( !ev ){
2ea30 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2ea40 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
2ea50 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 65 76 65  annot create eve
2ea60 6e 74 3a 20 22 2c 20 78 2e 65 76 4e 61 6d 65 2c  nt: ", x.evName,
2ea70 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2ea80 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2ea90 3b 0a 20 20 7d 0a 20 20 5f 62 65 67 69 6e 74 68  ;.  }.  _beginth
2eaa0 72 65 61 64 28 77 69 6e 33 32 5f 66 69 6c 65 5f  read(win32_file_
2eab0 6c 6f 63 6b 65 72 2c 20 30 2c 20 28 76 6f 69 64  locker, 0, (void
2eac0 2a 29 26 78 29 3b 0a 20 20 53 6c 65 65 70 28 30  *)&x);.  Sleep(0
2ead0 29 3b 0a 20 20 69 66 20 28 20 28 77 52 65 73 75  );.  if ( (wResu
2eae0 6c 74 20 3d 20 57 61 69 74 46 6f 72 53 69 6e 67  lt = WaitForSing
2eaf0 6c 65 4f 62 6a 65 63 74 28 65 76 2c 20 31 30 30  leObject(ev, 100
2eb00 30 30 29 29 21 3d 57 41 49 54 5f 4f 42 4a 45 43  00))!=WAIT_OBJEC
2eb10 54 5f 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  T_0 ){.    sqlit
2eb20 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2eb30 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66 2c 20  of(zBuf), zBuf, 
2eb40 22 30 78 25 78 22 2c 20 77 52 65 73 75 6c 74 29  "0x%x", wResult)
2eb50 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
2eb60 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2eb70 77 61 69 74 20 66 61 69 6c 65 64 3a 20 22 2c 20  wait failed: ", 
2eb80 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
2eb90 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65  .    CloseHandle
2eba0 28 65 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  (ev);.    return
2ebb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2ebc0 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65 28 65 76    CloseHandle(ev
2ebd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2ebe0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
2ebf0 20 20 65 78 69 73 74 73 5f 77 69 6e 33 32 5f 70    exists_win32_p
2ec00 61 74 68 20 50 41 54 48 0a 2a 2a 0a 2a 2a 20 52  ath PATH.**.** R
2ec10 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 20  eturns non-zero 
2ec20 69 66 20 74 68 65 20 73 70 65 63 69 66 69 65 64  if the specified
2ec30 20 70 61 74 68 20 65 78 69 73 74 73 2c 20 77 68   path exists, wh
2ec40 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  ose fully qualif
2ec50 69 65 64 20 6e 61 6d 65 0a 2a 2a 20 6d 61 79 20  ied name.** may 
2ec60 65 78 63 65 65 64 20 32 36 30 20 63 68 61 72 61  exceed 260 chara
2ec70 63 74 65 72 73 20 69 66 20 69 74 20 69 73 20 70  cters if it is p
2ec80 72 65 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c  refixed with "\\
2ec90 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ?\"..*/.static i
2eca0 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49  nt SQLITE_TCLAPI
2ecb0 20 77 69 6e 33 32 5f 65 78 69 73 74 73 5f 70 61   win32_exists_pa
2ecc0 74 68 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  th(.  void *clie
2ecd0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2ece0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2ecf0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2ed00 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2ed10 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ].){.  if( objc!
2ed20 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
2ed30 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2ed40 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54  p, 1, objv, "PAT
2ed50 48 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  H");.    return 
2ed60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2ed70 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2ed80 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2ed90 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 0a 20 20 20  wBooleanObj(.   
2eda0 20 20 20 47 65 74 46 69 6c 65 41 74 74 72 69 62     GetFileAttrib
2edb0 75 74 65 73 57 28 20 54 63 6c 5f 47 65 74 55 6e  utesW( Tcl_GetUn
2edc0 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 29 21  icode(objv[1]))!
2edd0 3d 49 4e 56 41 4c 49 44 5f 46 49 4c 45 5f 41 54  =INVALID_FILE_AT
2ede0 54 52 49 42 55 54 45 53 20 29 29 3b 0a 20 20 72  TRIBUTES ));.  r
2edf0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2ee00 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 66 69 6e 64  ./*.**      find
2ee10 5f 77 69 6e 33 32 5f 66 69 6c 65 20 50 41 54 54  _win32_file PATT
2ee20 45 52 4e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ERN.**.** Return
2ee30 73 20 61 20 6c 69 73 74 20 6f 66 20 65 6e 74 72  s a list of entr
2ee40 69 65 73 20 69 6e 20 61 20 64 69 72 65 63 74 6f  ies in a directo
2ee50 72 79 20 74 68 61 74 20 6d 61 74 63 68 20 74 68  ry that match th
2ee60 65 20 73 70 65 63 69 66 69 65 64 20 70 61 74 74  e specified patt
2ee70 65 72 6e 2c 0a 2a 2a 20 77 68 6f 73 65 20 66 75  ern,.** whose fu
2ee80 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61  lly qualified na
2ee90 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34  me may exceed 24
2eea0 38 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20  8 characters if 
2eeb0 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77  it is prefixed w
2eec0 69 74 68 0a 2a 2a 20 22 5c 5c 3f 5c 22 2e 0a 2a  ith.** "\\?\"..*
2eed0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
2eee0 49 54 45 5f 54 43 4c 41 50 49 20 77 69 6e 33 32  ITE_TCLAPI win32
2eef0 5f 66 69 6e 64 5f 66 69 6c 65 28 0a 20 20 76 6f  _find_file(.  vo
2ef00 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
2ef10 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2ef20 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2ef30 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2ef40 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 48  ST objv[].){.  H
2ef50 41 4e 44 4c 45 20 68 46 69 6e 64 46 69 6c 65 20  ANDLE hFindFile 
2ef60 3d 20 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c 45  = INVALID_HANDLE
2ef70 5f 56 41 4c 55 45 3b 0a 20 20 57 49 4e 33 32 5f  _VALUE;.  WIN32_
2ef80 46 49 4e 44 5f 44 41 54 41 57 20 66 69 6e 64 44  FIND_DATAW findD
2ef90 61 74 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  ata;.  Tcl_Obj *
2efa0 6c 69 73 74 4f 62 6a 3b 0a 20 20 44 57 4f 52 44  listObj;.  DWORD
2efb0 20 6c 61 73 74 45 72 72 6e 6f 3b 0a 20 20 69 66   lastErrno;.  if
2efc0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
2efd0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2efe0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2eff0 76 2c 20 22 50 41 54 54 45 52 4e 22 29 3b 0a 20  v, "PATTERN");. 
2f000 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2f010 52 4f 52 3b 0a 20 20 7d 0a 20 20 68 46 69 6e 64  ROR;.  }.  hFind
2f020 46 69 6c 65 20 3d 20 46 69 6e 64 46 69 72 73 74  File = FindFirst
2f030 46 69 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69  FileW(Tcl_GetUni
2f040 63 6f 64 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  code(objv[1]), &
2f050 66 69 6e 64 44 61 74 61 29 3b 0a 20 20 69 66 28  findData);.  if(
2f060 20 68 46 69 6e 64 46 69 6c 65 3d 3d 49 4e 56 41   hFindFile==INVA
2f070 4c 49 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45  LID_HANDLE_VALUE
2f080 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f   ){.    Tcl_SetO
2f090 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
2f0a0 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
2f0b0 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72 28  bj(GetLastError(
2f0c0 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  )));.    return 
2f0d0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2f0e0 20 6c 69 73 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e   listObj = Tcl_N
2f0f0 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 49  ewObj();.  Tcl_I
2f100 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74  ncrRefCount(list
2f110 4f 62 6a 29 3b 0a 20 20 64 6f 20 7b 0a 20 20 20  Obj);.  do {.   
2f120 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
2f130 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2f140 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63 6c 5f 4e  , listObj, Tcl_N
2f150 65 77 55 6e 69 63 6f 64 65 4f 62 6a 28 0a 20 20  ewUnicodeObj(.  
2f160 20 20 20 20 20 20 66 69 6e 64 44 61 74 61 2e 63        findData.c
2f170 46 69 6c 65 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a  FileName, -1));.
2f180 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
2f190 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2f1a0 65 72 70 2c 20 6c 69 73 74 4f 62 6a 2c 20 54 63  erp, listObj, Tc
2f1b0 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
2f1c0 0a 20 20 20 20 20 20 20 20 66 69 6e 64 44 61 74  .        findDat
2f1d0 61 2e 64 77 46 69 6c 65 41 74 74 72 69 62 75 74  a.dwFileAttribut
2f1e0 65 73 29 29 3b 0a 20 20 7d 20 77 68 69 6c 65 28  es));.  } while(
2f1f0 20 46 69 6e 64 4e 65 78 74 46 69 6c 65 57 28 68   FindNextFileW(h
2f200 46 69 6e 64 46 69 6c 65 2c 20 26 66 69 6e 64 44  FindFile, &findD
2f210 61 74 61 29 20 29 3b 0a 20 20 6c 61 73 74 45 72  ata) );.  lastEr
2f220 72 6e 6f 20 3d 20 47 65 74 4c 61 73 74 45 72 72  rno = GetLastErr
2f230 6f 72 28 29 3b 0a 20 20 69 66 28 20 6c 61 73 74  or();.  if( last
2f240 45 72 72 6e 6f 21 3d 4e 4f 5f 45 52 52 4f 52 20  Errno!=NO_ERROR 
2f250 26 26 20 6c 61 73 74 45 72 72 6e 6f 21 3d 45 52  && lastErrno!=ER
2f260 52 4f 52 5f 4e 4f 5f 4d 4f 52 45 5f 46 49 4c 45  ROR_NO_MORE_FILE
2f270 53 20 29 7b 0a 20 20 20 20 46 69 6e 64 43 6c 6f  S ){.    FindClo
2f280 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b 0a 20  se(hFindFile);. 
2f290 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f     Tcl_DecrRefCo
2f2a0 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20  unt(listObj);.  
2f2b0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
2f2c0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
2f2d0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74  ewWideIntObj(Get
2f2e0 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20  LastError()));. 
2f2f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2f300 52 4f 52 3b 0a 20 20 7d 0a 20 20 46 69 6e 64 43  ROR;.  }.  FindC
2f310 6c 6f 73 65 28 68 46 69 6e 64 46 69 6c 65 29 3b  lose(hFindFile);
2f320 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73  .  Tcl_SetObjRes
2f330 75 6c 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ult(interp, list
2f340 4f 62 6a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  Obj);.  return T
2f350 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2f360 20 20 20 20 20 64 65 6c 65 74 65 5f 77 69 6e 33       delete_win3
2f370 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 0a  2_file FILENAME.
2f380 2a 2a 0a 2a 2a 20 44 65 6c 65 74 65 73 20 74 68  **.** Deletes th
2f390 65 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65  e specified file
2f3a0 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75  , whose fully qu
2f3b0 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d 61 79  alified name may
2f3c0 20 65 78 63 65 65 64 20 32 36 30 0a 2a 2a 20 63   exceed 260.** c
2f3d0 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
2f3e0 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
2f3f0 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74   "\\?\"..*/.stat
2f400 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
2f410 4c 41 50 49 20 77 69 6e 33 32 5f 64 65 6c 65 74  LAPI win32_delet
2f420 65 5f 66 69 6c 65 28 0a 20 20 76 6f 69 64 20 2a  e_file(.  void *
2f430 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
2f440 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2f450 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
2f460 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
2f470 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f  bjv[].){.  if( o
2f480 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
2f490 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2f4a0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2f4b0 22 46 49 4c 45 4e 41 4d 45 22 29 3b 0a 20 20 20  "FILENAME");.   
2f4c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2f4d0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 44 65  R;.  }.  if( !De
2f4e0 6c 65 74 65 46 69 6c 65 57 28 54 63 6c 5f 47 65  leteFileW(Tcl_Ge
2f4f0 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b 31 5d  tUnicode(objv[1]
2f500 29 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65  )) ){.    Tcl_Se
2f510 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2f520 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
2f530 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f  tObj(GetLastErro
2f540 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  r()));.    retur
2f550 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2f560 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75  .  Tcl_ResetResu
2f570 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65  lt(interp);.  re
2f580 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2f590 2f 2a 0a 2a 2a 20 20 20 20 20 20 6d 61 6b 65 5f  /*.**      make_
2f5a0 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43 54  win32_dir DIRECT
2f5b0 4f 52 59 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65  ORY.**.** Create
2f5c0 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  s the specified 
2f5d0 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73 65  directory, whose
2f5e0 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64   fully qualified
2f5f0 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64   name may exceed
2f600 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74 65   248.** characte
2f610 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66  rs if it is pref
2f620 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22  ixed with "\\?\"
2f630 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2f640 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77 69  SQLITE_TCLAPI wi
2f650 6e 33 32 5f 6d 6b 64 69 72 28 0a 20 20 76 6f 69  n32_mkdir(.  voi
2f660 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  d *clientData,. 
2f670 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2f680 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2f690 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2f6a0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66  T objv[].){.  if
2f6b0 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
2f6c0 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2f6d0 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2f6e0 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b  v, "DIRECTORY");
2f6f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2f700 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2f710 20 21 43 72 65 61 74 65 44 69 72 65 63 74 6f 72   !CreateDirector
2f720 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64  yW(Tcl_GetUnicod
2f730 65 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c  e(objv[1]), NULL
2f740 29 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  ) ){.    Tcl_Set
2f750 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2f760 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2f770 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
2f780 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
2f790 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2f7a0 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
2f7b0 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
2f7c0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2f7d0 2a 0a 2a 2a 20 20 20 20 20 20 72 65 6d 6f 76 65  *.**      remove
2f7e0 5f 77 69 6e 33 32 5f 64 69 72 20 44 49 52 45 43  _win32_dir DIREC
2f7f0 54 4f 52 59 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76  TORY.**.** Remov
2f800 65 73 20 74 68 65 20 73 70 65 63 69 66 69 65 64  es the specified
2f810 20 64 69 72 65 63 74 6f 72 79 2c 20 77 68 6f 73   directory, whos
2f820 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65  e fully qualifie
2f830 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65  d name may excee
2f840 64 20 32 34 38 0a 2a 2a 20 63 68 61 72 61 63 74  d 248.** charact
2f850 65 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65  ers if it is pre
2f860 66 69 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c  fixed with "\\?\
2f870 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  "..*/.static int
2f880 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 77   SQLITE_TCLAPI w
2f890 69 6e 33 32 5f 72 6d 64 69 72 28 0a 20 20 76 6f  in32_rmdir(.  vo
2f8a0 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a  id *clientData,.
2f8b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2f8c0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
2f8d0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
2f8e0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
2f8f0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
2f900 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2f910 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2f920 6a 76 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29  jv, "DIRECTORY")
2f930 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2f940 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2f950 28 20 21 52 65 6d 6f 76 65 44 69 72 65 63 74 6f  ( !RemoveDirecto
2f960 72 79 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f  ryW(Tcl_GetUnico
2f970 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a  de(objv[1])) ){.
2f980 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2f990 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
2f9a0 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
2f9b0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
2f9c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2f9d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
2f9e0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
2f9f0 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
2fa00 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
2fa10 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74  ../*.**      opt
2fa20 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f  imization_contro
2fa30 6c 20 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e  l DB OPT BOOLEAN
2fa40 0a 2a 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72  .**.** Enable or
2fa50 20 64 69 73 61 62 6c 65 20 71 75 65 72 79 20 6f   disable query o
2fa60 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69  ptimizations usi
2fa70 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74  ng the sqlite3_t
2fa80 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a  est_control().**
2fa90 20 69 6e 74 65 72 66 61 63 65 2e 20 20 44 69 73   interface.  Dis
2faa0 61 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20  able if BOOLEAN 
2fab0 69 73 20 66 61 6c 73 65 20 61 6e 64 20 65 6e 61  is false and ena
2fac0 62 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69  ble if BOOLEAN i
2fad0 73 20 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69  s true..** OPT i
2fae0 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
2faf0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74  e optimization t
2fb00 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a  o be disabled..*
2fb10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c  /.static int SQL
2fb20 49 54 45 5f 54 43 4c 41 50 49 20 6f 70 74 69 6d  ITE_TCLAPI optim
2fb30 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28  ization_control(
2fb40 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
2fb50 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
2fb60 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
2fb70 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
2fb80 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
2fb90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
2fba0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
2fbb0 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20  st char *zOpt;. 
2fbc0 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e   int onoff;.  in
2fbd0 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 73 74  t mask = 0;.  st
2fbe0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2fbf0 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
2fc00 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20  ar *zOptName;.  
2fc10 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20    int mask;.  } 
2fc20 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aOpt[] = {.    {
2fc30 20 22 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20   "all",         
2fc40 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41          SQLITE_A
2fc50 6c 6c 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c  llOpts        },
2fc60 0a 20 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20 20  .    { "none",  
2fc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
2fc80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fc90 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 75      },.    { "qu
2fca0 65 72 79 2d 66 6c 61 74 74 65 6e 65 72 22 2c 20  ery-flattener", 
2fcb0 20 20 20 20 53 51 4c 49 54 45 5f 51 75 65 72 79      SQLITE_Query
2fcc0 46 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20 20  Flattener },.   
2fcd0 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63 61 63 68 65   { "column-cache
2fce0 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
2fcf0 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 20 20 20  _ColumnCache    
2fd00 7d 2c 0a 20 20 20 20 7b 20 22 67 72 6f 75 70 62  },.    { "groupb
2fd10 79 2d 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20  y-order",       
2fd20 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
2fd30 64 65 72 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  der   },.    { "
2fd40 66 61 63 74 6f 72 2d 63 6f 6e 73 74 61 6e 74 73  factor-constants
2fd50 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 61 63  ",    SQLITE_Fac
2fd60 74 6f 72 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a 20  torOutConst },. 
2fd70 20 20 20 7b 20 22 64 69 73 74 69 6e 63 74 2d 6f     { "distinct-o
2fd80 70 74 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  pt",        SQLI
2fd90 54 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 20  TE_DistinctOpt  
2fda0 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 76 65    },.    { "cove
2fdb0 72 2d 69 64 78 2d 73 63 61 6e 22 2c 20 20 20 20  r-idx-scan",    
2fdc0 20 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64    SQLITE_CoverId
2fdd0 78 53 63 61 6e 20 20 20 7d 2c 0a 20 20 20 20 7b  xScan   },.    {
2fde0 20 22 6f 72 64 65 72 2d 62 79 2d 69 64 78 2d 6a   "order-by-idx-j
2fdf0 6f 69 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f 4f  oin",   SQLITE_O
2fe00 72 64 65 72 42 79 49 64 78 4a 6f 69 6e 20 7d 2c  rderByIdxJoin },
2fe10 0a 20 20 20 20 7b 20 22 74 72 61 6e 73 69 74 69  .    { "transiti
2fe20 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  ve",          SQ
2fe30 4c 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 20  LITE_Transitive 
2fe40 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6f 6d      },.    { "om
2fe50 69 74 2d 6e 6f 6f 70 2d 6a 6f 69 6e 22 2c 20 20  it-noop-join",  
2fe60 20 20 20 20 53 51 4c 49 54 45 5f 4f 6d 69 74 4e      SQLITE_OmitN
2fe70 6f 6f 70 4a 6f 69 6e 20 20 20 7d 2c 0a 20 20 20  oopJoin   },.   
2fe80 20 7b 20 22 73 74 61 74 33 22 2c 20 20 20 20 20   { "stat3",     
2fe90 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2fea0 5f 53 74 61 74 33 34 20 20 20 20 20 20 20 20 20  _Stat34         
2feb0 7d 2c 0a 20 20 20 20 7b 20 22 73 74 61 74 34 22  },.    { "stat4"
2fec0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2fed0 53 51 4c 49 54 45 5f 53 74 61 74 33 34 20 20 20  SQLITE_Stat34   
2fee0 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 0a 20        },.  };.. 
2fef0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
2ff00 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
2ff10 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
2ff20 6f 62 6a 76 2c 20 22 44 42 20 4f 50 54 20 42 4f  objv, "DB OPT BO
2ff30 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20 72 65 74  OLEAN");.    ret
2ff40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2ff50 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2ff60 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2ff70 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2ff80 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
2ff90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2ffa0 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c   if( Tcl_GetBool
2ffb0 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  eanFromObj(inter
2ffc0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6f 6e 6f  p, objv[3], &ono
2ffd0 66 66 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ff) ) return TCL
2ffe0 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 74 20 3d  _ERROR;.  zOpt =
2fff0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
30000 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[2]);.  for(i
30010 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70  =0; i<sizeof(aOp
30020 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30  t)/sizeof(aOpt[0
30030 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  ]); i++){.    if
30040 28 20 73 74 72 63 6d 70 28 7a 4f 70 74 2c 20 61  ( strcmp(zOpt, a
30050 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 29  Opt[i].zOptName)
30060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 61 73  ==0 ){.      mas
30070 6b 20 3d 20 61 4f 70 74 5b 69 5d 2e 6d 61 73 6b  k = aOpt[i].mask
30080 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
30090 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6f     }.  }.  if( o
300a0 6e 6f 66 66 20 29 20 6d 61 73 6b 20 3d 20 7e 6d  noff ) mask = ~m
300b0 61 73 6b 3b 0a 20 20 69 66 28 20 69 3e 3d 73 69  ask;.  if( i>=si
300c0 7a 65 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f  zeof(aOpt)/sizeo
300d0 66 28 61 4f 70 74 5b 30 5d 29 20 29 7b 0a 20 20  f(aOpt[0]) ){.  
300e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
300f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 75 6e 6b 6e  lt(interp, "unkn
30100 6f 77 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  own optimization
30110 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65   - should be one
30120 20 6f 66 3a 22 2c 0a 20 20 20 20 20 20 20 20 20   of:",.         
30130 20 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61              (cha
30140 72 2a 29 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  r*)0);.    for(i
30150 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 4f 70  =0; i<sizeof(aOp
30160 74 29 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30  t)/sizeof(aOpt[0
30170 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ]); i++){.      
30180 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
30190 28 69 6e 74 65 72 70 2c 20 22 20 22 2c 20 61 4f  (interp, " ", aO
301a0 70 74 5b 69 5d 2e 7a 4f 70 74 4e 61 6d 65 2c 20  pt[i].zOptName, 
301b0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 7d  (char*)0);.    }
301c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
301d0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
301e0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
301f0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
30200 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c  L_OPTIMIZATIONS,
30210 20 64 62 2c 20 6d 61 73 6b 29 3b 0a 20 20 72 65   db, mask);.  re
30220 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
30230 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73  /*.**     load_s
30240 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20  tatic_extension 
30250 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a  DB NAME ....**.*
30260 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f  * Load one or mo
30270 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  re statically li
30280 6e 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e  nked extensions.
30290 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53  .*/.static int S
302a0 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74 63 6c  QLITE_TCLAPI tcl
302b0 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e 73  LoadStaticExtens
302c0 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20 2a  ionCmd(.  void *
302d0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
302e0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
302f0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
30300 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
30310 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65  objv[].){.  exte
30320 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 61  rn int sqlite3_a
30330 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c 69 74  match_init(sqlit
30340 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
30350 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
30360 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72  tines*);.  exter
30370 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 61  n int sqlite3_ca
30380 72 72 61 79 5f 69 6e 69 74 28 73 71 6c 69 74 65  rray_init(sqlite
30390 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
303a0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
303b0 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
303c0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f   int sqlite3_clo
303d0 73 75 72 65 5f 69 6e 69 74 28 73 71 6c 69 74 65  sure_init(sqlite
303e0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
303f0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
30400 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
30410 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 73 76   int sqlite3_csv
30420 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63  _init(sqlite3*,c
30430 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69  har**,const sqli
30440 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73  te3_api_routines
30450 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  *);.  extern int
30460 20 73 71 6c 69 74 65 33 5f 65 76 61 6c 5f 69 6e   sqlite3_eval_in
30470 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72  it(sqlite3*,char
30480 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  **,const sqlite3
30490 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b  _api_routines*);
304a0 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
304b0 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69  lite3_fileio_ini
304c0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
304d0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
304e0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
304f0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
30500 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74  ite3_fuzzer_init
30510 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
30520 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
30530 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
30540 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
30550 74 65 33 5f 69 65 65 65 5f 69 6e 69 74 28 73 71  te3_ieee_init(sq
30560 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f  lite3*,char**,co
30570 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  nst sqlite3_api_
30580 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78  routines*);.  ex
30590 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
305a0 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 28 73  _nextchar_init(s
305b0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
305c0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
305d0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65  _routines*);.  e
305e0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
305f0 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69  3_percentile_ini
30600 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
30610 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
30620 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
30630 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
30640 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69 74  ite3_regexp_init
30650 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
30660 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
30670 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
30680 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
30690 74 65 33 5f 72 65 6d 65 6d 62 65 72 5f 69 6e 69  te3_remember_ini
306a0 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
306b0 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
306c0 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
306d0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
306e0 69 74 65 33 5f 73 65 72 69 65 73 5f 69 6e 69 74  ite3_series_init
306f0 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
30700 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
30710 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
30720 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
30730 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e 69  te3_spellfix_ini
30740 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a  t(sqlite3*,char*
30750 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  *,const sqlite3_
30760 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a  api_routines*);.
30770 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
30780 69 74 65 33 5f 74 6f 74 79 70 65 5f 69 6e 69 74  ite3_totype_init
30790 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
307a0 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
307b0 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
307c0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
307d0 74 65 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f  te3_wholenumber_
307e0 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
307f0 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
30800 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
30810 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
30820 73 71 6c 69 74 65 33 5f 75 6e 69 6f 6e 76 74 61  sqlite3_unionvta
30830 62 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  b_init(sqlite3*,
30840 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
30850 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
30860 73 2a 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  s*);.#ifdef SQLI
30870 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 65  TE_HAVE_ZLIB.  e
30880 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
30890 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28 73  3_zipfile_init(s
308a0 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63  qlite3*,char**,c
308b0 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69  onst sqlite3_api
308c0 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 23 65 6e  _routines*);.#en
308d0 64 69 66 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  dif.  static con
308e0 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
308f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 74  const char *zExt
30900 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 28 2a  Name;.    int (*
30910 70 49 6e 69 74 29 28 73 71 6c 69 74 65 33 2a 2c  pInit)(sqlite3*,
30920 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
30930 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
30940 73 2a 29 3b 0a 20 20 7d 20 61 45 78 74 65 6e 73  s*);.  } aExtens
30950 69 6f 6e 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  ion[] = {.    { 
30960 22 61 6d 61 74 63 68 22 2c 20 20 20 20 20 20 20  "amatch",       
30970 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30980 5f 61 6d 61 74 63 68 5f 69 6e 69 74 20 20 20 20  _amatch_init    
30990 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
309a0 20 20 7b 20 22 63 61 72 72 61 79 22 2c 20 20 20    { "carray",   
309b0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
309c0 69 74 65 33 5f 63 61 72 72 61 79 5f 69 6e 69 74  ite3_carray_init
309d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
309e0 2c 0a 20 20 20 20 7b 20 22 63 6c 6f 73 75 72 65  ,.    { "closure
309f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30a00 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72 65   sqlite3_closure
30a10 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
30a20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63 73 76     },.    { "csv
30a30 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30a40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 73 76       sqlite3_csv
30a50 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20  _init           
30a60 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30a70 22 65 76 61 6c 22 2c 20 20 20 20 20 20 20 20 20  "eval",         
30a80 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30a90 5f 65 76 61 6c 5f 69 6e 69 74 20 20 20 20 20 20  _eval_init      
30aa0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
30ab0 20 20 7b 20 22 66 69 6c 65 69 6f 22 2c 20 20 20    { "fileio",   
30ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30ad0 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
30ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
30af0 2c 0a 20 20 20 20 7b 20 22 66 75 7a 7a 65 72 22  ,.    { "fuzzer"
30b00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30b10 20 73 71 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f   sqlite3_fuzzer_
30b20 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
30b30 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 69 65 65     },.    { "iee
30b40 65 37 35 34 22 2c 20 20 20 20 20 20 20 20 20 20  e754",          
30b50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 65 65       sqlite3_iee
30b60 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  e_init          
30b70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30b80 22 6e 65 78 74 63 68 61 72 22 2c 20 20 20 20 20  "nextchar",     
30b90 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30ba0 5f 6e 65 78 74 63 68 61 72 5f 69 6e 69 74 20 20  _nextchar_init  
30bb0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
30bc0 20 20 7b 20 22 70 65 72 63 65 6e 74 69 6c 65 22    { "percentile"
30bd0 2c 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  ,            sql
30be0 69 74 65 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f  ite3_percentile_
30bf0 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 7d  init           }
30c00 2c 0a 20 20 20 20 7b 20 22 72 65 67 65 78 70 22  ,.    { "regexp"
30c10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30c20 20 73 71 6c 69 74 65 33 5f 72 65 67 65 78 70 5f   sqlite3_regexp_
30c30 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
30c40 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 72 65 6d     },.    { "rem
30c50 65 6d 62 65 72 22 2c 20 20 20 20 20 20 20 20 20  ember",         
30c60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 6d       sqlite3_rem
30c70 65 6d 62 65 72 5f 69 6e 69 74 20 20 20 20 20 20  ember_init      
30c80 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30c90 22 73 65 72 69 65 73 22 2c 20 20 20 20 20 20 20  "series",       
30ca0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30cb0 5f 73 65 72 69 65 73 5f 69 6e 69 74 20 20 20 20  _series_init    
30cc0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
30cd0 20 20 7b 20 22 73 70 65 6c 6c 66 69 78 22 2c 20    { "spellfix", 
30ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
30cf0 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f 69 6e  ite3_spellfix_in
30d00 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  it             }
30d10 2c 0a 20 20 20 20 7b 20 22 74 6f 74 79 70 65 22  ,.    { "totype"
30d20 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
30d30 20 73 71 6c 69 74 65 33 5f 74 6f 74 79 70 65 5f   sqlite3_totype_
30d40 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
30d50 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 75 6e 69     },.    { "uni
30d60 6f 6e 76 74 61 62 22 2c 20 20 20 20 20 20 20 20  onvtab",        
30d70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 6e 69       sqlite3_uni
30d80 6f 6e 76 74 61 62 5f 69 6e 69 74 20 20 20 20 20  onvtab_init     
30d90 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
30da0 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20 20  "wholenumber",  
30db0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
30dc0 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69  _wholenumber_ini
30dd0 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69  t          },.#i
30de0 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45  fdef SQLITE_HAVE
30df0 5f 5a 4c 49 42 0a 20 20 20 20 7b 20 22 7a 69 70  _ZLIB.    { "zip
30e00 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  file",          
30e10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70       sqlite3_zip
30e20 66 69 6c 65 5f 69 6e 69 74 20 20 20 20 20 20 20  file_init       
30e30 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66         },.#endif
30e40 0a 20 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20  .  };.  sqlite3 
30e50 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
30e60 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  r *zName;.  int 
30e70 69 2c 20 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72  i, j, rc;.  char
30e80 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
30e90 20 69 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20   if( objc<3 ){. 
30ea0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
30eb0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
30ec0 62 6a 76 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e  bjv, "DB NAME ..
30ed0 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  .");.    return 
30ee0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
30ef0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
30f00 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
30f10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
30f20 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
30f30 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72  TCL_ERROR;.  for
30f40 28 6a 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b  (j=2; j<objc; j+
30f50 2b 29 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  +){.    zName = 
30f60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
30f70 6a 76 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28  jv[j]);.    for(
30f80 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
30f90 28 61 45 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b  (aExtension); i+
30fa0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
30fb0 72 63 6d 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74  rcmp(zName, aExt
30fc0 65 6e 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61  ension[i].zExtNa
30fd0 6d 65 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  me)==0 ) break;.
30fe0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
30ff0 3d 41 72 72 61 79 53 69 7a 65 28 61 45 78 74 65  =ArraySize(aExte
31000 6e 73 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20  nsion) ){.      
31010 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
31020 28 69 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63  (interp, "no suc
31030 68 20 65 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20  h extension: ", 
31040 7a 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  zName, (char*)0)
31050 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
31060 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
31070 20 20 20 20 69 66 28 20 61 45 78 74 65 6e 73 69      if( aExtensi
31080 6f 6e 5b 69 5d 2e 70 49 6e 69 74 20 29 7b 0a 20  on[i].pInit ){. 
31090 20 20 20 20 20 72 63 20 3d 20 61 45 78 74 65 6e       rc = aExten
310a0 73 69 6f 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62  sion[i].pInit(db
310b0 2c 20 26 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a  , &zErrMsg, 0);.
310c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
310d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
310e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
310f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
31100 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
31110 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
31120 74 28 69 6e 74 65 72 70 2c 20 22 69 6e 69 74 69  t(interp, "initi
31130 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 22 2c 20  alization of ", 
31140 7a 4e 61 6d 65 2c 20 22 20 66 61 69 6c 65 64 3a  zName, " failed:
31150 20 22 2c 20 7a 45 72 72 4d 73 67 2c 0a 20 20 20   ", zErrMsg,.   
31160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31170 20 20 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20      (char*)0);. 
31180 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
31190 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
311a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
311b0 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OR;.    }.  }.  
311c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
311d0 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74  ../*.**     sort
311e0 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70  er_test_fakeheap
311f0 20 42 4f 4f 4c 0a 2a 2a 0a 2a 2f 0a 73 74 61 74   BOOL.**.*/.stat
31200 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
31210 4c 41 50 49 20 73 6f 72 74 65 72 5f 74 65 73 74  LAPI sorter_test
31220 5f 66 61 6b 65 68 65 61 70 28 0a 20 20 76 6f 69  _fakeheap(.  voi
31230 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
31240 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
31250 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
31260 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
31270 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
31280 6e 74 20 62 41 72 67 3b 0a 20 20 69 66 28 20 6f  nt bArg;.  if( o
31290 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
312a0 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
312b0 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
312c0 22 42 4f 4f 4c 22 29 3b 0a 20 20 20 20 72 65 74  "BOOL");.    ret
312d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
312e0 20 7d 0a 0a 20 20 69 66 28 20 54 63 6c 5f 47 65   }..  if( Tcl_Ge
312f0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
31300 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
31310 20 26 62 41 72 67 29 20 29 7b 0a 20 20 20 20 72   &bArg) ){.    r
31320 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
31330 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 41 72 67  .  }..  if( bArg
31340 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   ){.    if( sqli
31350 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
31360 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
31370 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
31380 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 53 51  onfig.pHeap = SQ
31390 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
313a0 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  -1);.    }.  }el
313b0 73 65 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  se{.    if( sqli
313c0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
313d0 70 48 65 61 70 3d 3d 53 51 4c 49 54 45 5f 49 4e  pHeap==SQLITE_IN
313e0 54 5f 54 4f 5f 50 54 52 28 2d 31 29 20 29 7b 0a  T_TO_PTR(-1) ){.
313f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
31400 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
31410 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  = 0;.    }.  }..
31420 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73 75 6c    Tcl_ResetResul
31430 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 72 65 74  t(interp);.  ret
31440 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
31450 2a 0a 2a 2a 20 20 20 20 20 73 6f 72 74 65 72 5f  *.**     sorter_
31460 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65  test_sort4_helpe
31470 72 20 44 42 20 53 51 4c 31 20 4e 53 54 45 50 20  r DB SQL1 NSTEP 
31480 53 51 4c 32 0a 2a 2a 0a 2a 2a 20 43 6f 6d 70 69  SQL2.**.** Compi
31490 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  le SQL statement
314a0 20 24 53 51 4c 31 20 61 6e 64 20 73 74 65 70 20   $SQL1 and step 
314b0 69 74 20 24 4e 53 54 45 50 20 74 69 6d 65 73 2e  it $NSTEP times.
314c0 20 46 6f 72 20 65 61 63 68 20 72 6f 77 2c 20 0a   For each row, .
314d0 2a 2a 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ** check that th
314e0 65 20 6c 65 66 74 6d 6f 73 74 20 61 6e 64 20 72  e leftmost and r
314f0 69 67 68 74 6d 6f 73 74 20 63 6f 6c 75 6d 6e 73  ightmost columns
31500 20 72 65 74 75 72 6e 65 64 20 61 72 65 20 62 6f   returned are bo
31510 74 68 20 69 6e 74 65 67 65 72 73 2c 0a 2a 2a 20  th integers,.** 
31520 61 6e 64 20 74 68 61 74 20 62 6f 74 68 20 63 6f  and that both co
31530 6e 74 61 69 6e 20 74 68 65 20 73 61 6d 65 20 76  ntain the same v
31540 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 6e  alue..**.** Then
31550 20 65 78 65 63 75 74 65 20 73 74 61 74 65 6d 65   execute stateme
31560 6e 74 20 24 53 51 4c 32 2e 20 43 68 65 63 6b 20  nt $SQL2. Check 
31570 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d 65  that the stateme
31580 6e 74 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  nt returns the s
31590 61 6d 65 0a 2a 2a 20 73 65 74 20 6f 66 20 69 6e  ame.** set of in
315a0 74 65 67 65 72 73 20 69 6e 20 74 68 65 20 73 61  tegers in the sa
315b0 6d 65 20 6f 72 64 65 72 20 61 73 20 69 6e 20 74  me order as in t
315c0 68 65 20 70 72 65 76 69 6f 75 73 20 73 74 65 70  he previous step
315d0 20 28 75 73 69 6e 67 20 24 53 51 4c 31 29 2e 0a   (using $SQL1)..
315e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51  */.static int SQ
315f0 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 6f 72 74  LITE_TCLAPI sort
31600 65 72 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65  er_test_sort4_he
31610 6c 70 65 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  lper(.  void * c
31620 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
31630 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
31640 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
31650 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
31660 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  jv[].){.  const 
31670 63 68 61 72 20 2a 7a 53 71 6c 31 3b 0a 20 20 63  char *zSql1;.  c
31680 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 32  onst char *zSql2
31690 3b 0a 20 20 69 6e 74 20 6e 53 74 65 70 3b 20 0a  ;.  int nStep; .
316a0 20 20 69 6e 74 20 69 53 74 65 70 3b 20 0a 20 20    int iStep; .  
316b0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 43 6b  unsigned int iCk
316c0 73 75 6d 31 20 3d 20 30 3b 20 0a 20 20 75 6e 73  sum1 = 0; .  uns
316d0 69 67 6e 65 64 20 69 6e 74 20 69 43 6b 73 75 6d  igned int iCksum
316e0 32 20 3d 20 30 3b 20 0a 20 20 69 6e 74 20 72 63  2 = 0; .  int rc
316f0 3b 0a 20 20 69 6e 74 20 69 42 3b 0a 20 20 73 71  ;.  int iB;.  sq
31700 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 73 71 6c  lite3 *db;.  sql
31710 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
31720 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21  ;.  .  if( objc!
31730 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =5 ){.    Tcl_Wr
31740 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
31750 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
31760 53 51 4c 31 20 4e 53 54 45 50 20 53 51 4c 32 22  SQL1 NSTEP SQL2"
31770 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
31780 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
31790 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
317a0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
317b0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
317c0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
317d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c  CL_ERROR;.  zSql
317e0 31 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  1 = Tcl_GetStrin
317f0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
31800 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
31810 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
31820 5b 33 5d 2c 20 26 6e 53 74 65 70 29 20 29 20 72  [3], &nStep) ) r
31830 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
31840 0a 20 20 7a 53 71 6c 32 20 3d 20 54 63 6c 5f 47  .  zSql2 = Tcl_G
31850 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
31860 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  );..  rc = sqlit
31870 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
31880 2c 20 7a 53 71 6c 31 2c 20 2d 31 2c 20 26 70 53  , zSql1, -1, &pS
31890 74 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  tmt, 0);.  if( r
318a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
318b0 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a  oto sql_error;..
318c0 20 20 69 42 20 3d 20 73 71 6c 69 74 65 33 5f 63    iB = sqlite3_c
318d0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
318e0 74 29 2d 31 3b 0a 20 20 66 6f 72 28 69 53 74 65  t)-1;.  for(iSte
318f0 70 3d 30 3b 20 69 53 74 65 70 3c 6e 53 74 65 70  p=0; iStep<nStep
31900 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
31910 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
31920 6d 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20  mt); iStep++){. 
31930 20 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74     int a = sqlit
31940 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
31950 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
31960 20 61 21 3d 73 71 6c 69 74 65 33 5f 63 6f 6c 75   a!=sqlite3_colu
31970 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 69 42  mn_int(pStmt, iB
31980 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ) ){.      Tcl_A
31990 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
319a0 72 70 2c 20 22 64 61 74 61 20 65 72 72 6f 72 3a  rp, "data error:
319b0 20 28 61 21 3d 62 29 22 2c 20 30 29 3b 0a 20 20   (a!=b)", 0);.  
319c0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
319d0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
319e0 20 69 43 6b 73 75 6d 31 20 2b 3d 20 28 69 43 6b   iCksum1 += (iCk
319f0 73 75 6d 31 20 3c 3c 20 33 29 20 2b 20 28 75 6e  sum1 << 3) + (un
31a00 73 69 67 6e 65 64 20 69 6e 74 29 61 3b 0a 20 20  signed int)a;.  
31a10 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
31a20 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
31a30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
31a40 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c  TE_OK ) goto sql
31a50 5f 65 72 72 6f 72 3b 0a 0a 20 20 72 63 20 3d 20  _error;..  rc = 
31a60 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
31a70 76 32 28 64 62 2c 20 7a 53 71 6c 32 2c 20 2d 31  v2(db, zSql2, -1
31a80 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
31a90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31aa0 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72  K ) goto sql_err
31ab0 6f 72 3b 0a 20 20 66 6f 72 28 69 53 74 65 70 3d  or;.  for(iStep=
31ac0 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  0; SQLITE_ROW==s
31ad0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
31ae0 74 29 3b 20 69 53 74 65 70 2b 2b 29 7b 0a 20 20  t); iStep++){.  
31af0 20 20 69 6e 74 20 61 20 3d 20 73 71 6c 69 74 65    int a = sqlite
31b00 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
31b10 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 43 6b 73  mt, 0);.    iCks
31b20 75 6d 32 20 2b 3d 20 28 69 43 6b 73 75 6d 32 20  um2 += (iCksum2 
31b30 3c 3c 20 33 29 20 2b 20 28 75 6e 73 69 67 6e 65  << 3) + (unsigne
31b40 64 20 69 6e 74 29 61 3b 0a 20 20 7d 0a 20 20 72  d int)a;.  }.  r
31b50 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
31b60 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
31b70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
31b80 20 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f   ) goto sql_erro
31b90 72 3b 0a 0a 20 20 69 66 28 20 69 43 6b 73 75 6d  r;..  if( iCksum
31ba0 31 21 3d 69 43 6b 73 75 6d 32 20 29 7b 0a 20 20  1!=iCksum2 ){.  
31bb0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
31bc0 6c 74 28 69 6e 74 65 72 70 2c 20 22 63 68 65 63  lt(interp, "chec
31bd0 6b 73 75 6d 20 6d 69 73 6d 61 74 63 68 22 2c 20  ksum mismatch", 
31be0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
31bf0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
31c00 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
31c10 20 73 71 6c 5f 65 72 72 6f 72 3a 0a 20 20 54 63   sql_error:.  Tc
31c20 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
31c30 6e 74 65 72 70 2c 20 22 73 71 6c 20 65 72 72 6f  nterp, "sql erro
31c40 72 3a 20 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  r: ", sqlite3_er
31c50 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
31c60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
31c70 3b 0a 7d 0a 0a 0a 23 69 66 64 65 66 20 53 51 4c  ;.}...#ifdef SQL
31c80 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
31c90 49 43 41 54 49 4f 4e 0a 23 69 6e 63 6c 75 64 65  ICATION.#include
31ca0 20 22 73 71 6c 69 74 65 33 75 73 65 72 61 75 74   "sqlite3useraut
31cb0 68 2e 68 22 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  h.h"./*.** tclcm
31cc0 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  d:  sqlite3_user
31cd0 5f 61 75 74 68 65 6e 74 69 63 61 74 65 20 44 42  _authenticate DB
31ce0 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
31cf0 52 44 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  RD.*/.static int
31d00 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
31d10 65 73 74 5f 75 73 65 72 5f 61 75 74 68 65 6e 74  est_user_authent
31d20 69 63 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  icate(.  ClientD
31d30 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
31d40 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54  /* Unused */.  T
31d50 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
31d60 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
31d70 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
31d80 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
31d90 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
31da0 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
31db0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31dc0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
31dd0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
31de0 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
31df0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
31e00 0a 20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d  .  char *zUser =
31e10 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73   0;.  char *zPas
31e20 73 77 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  swd = 0;.  int n
31e30 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20 73 71  Passwd = 0;.  sq
31e40 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
31e50 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
31e60 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=4 ){.    Tcl_W
31e70 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
31e80 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
31e90 20 55 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f   USERNAME PASSWO
31ea0 52 44 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  RD");.    return
31eb0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
31ec0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
31ed0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
31ee0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
31ef0 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
31f00 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
31f10 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54  .  }.  zUser = T
31f20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
31f30 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64  v[2]);.  zPasswd
31f40 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
31f50 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
31f60 20 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 72 63   &nPasswd);.  rc
31f70 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   = sqlite3_user_
31f80 61 75 74 68 65 6e 74 69 63 61 74 65 28 64 62 2c  authenticate(db,
31f90 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c   zUser, zPasswd,
31fa0 20 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63 6c   nPasswd);.  Tcl
31fb0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
31fc0 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
31fd0 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
31fe0 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
31ff0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
32000 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45  if /* SQLITE_USE
32010 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e  R_AUTHENTICATION
32020 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
32030 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
32040 43 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c  CATION./*.** tcl
32050 63 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73  cmd:  sqlite3_us
32060 65 72 5f 61 64 64 20 44 42 20 55 53 45 52 4e 41  er_add DB USERNA
32070 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53 41 44  ME PASSWORD ISAD
32080 4d 49 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  MIN.*/.static in
32090 74 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20  t SQLITE_TCLAPI 
320a0 74 65 73 74 5f 75 73 65 72 5f 61 64 64 28 0a 20  test_user_add(. 
320b0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
320c0 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65  ntData, /* Unuse
320d0 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
320e0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
320f0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
32100 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
32110 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
32120 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
32130 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
32140 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
32150 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
32160 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
32170 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
32180 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ts */.){.  char 
32190 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63 68  *zUser = 0;.  ch
321a0 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b  ar *zPasswd = 0;
321b0 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20 3d  .  int nPasswd =
321c0 20 30 3b 0a 20 20 69 6e 74 20 69 73 41 64 6d 69   0;.  int isAdmi
321d0 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  n = 0;.  sqlite3
321e0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
321f0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
32200 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
32210 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
32220 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52  , objv, "DB USER
32230 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53  NAME PASSWORD IS
32240 41 44 4d 49 4e 22 29 3b 0a 20 20 20 20 72 65 74  ADMIN");.    ret
32250 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
32260 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
32270 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
32280 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
32290 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
322a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
322b0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20  OR;.  }.  zUser 
322c0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
322d0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73  objv[2]);.  zPas
322e0 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  swd = Tcl_GetStr
322f0 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
32300 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20  3], &nPasswd);. 
32310 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
32320 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
32330 62 6a 76 5b 34 5d 2c 20 26 69 73 41 64 6d 69 6e  bjv[4], &isAdmin
32340 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
32350 33 5f 75 73 65 72 5f 61 64 64 28 64 62 2c 20 7a  3_user_add(db, z
32360 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e  User, zPasswd, n
32370 50 61 73 73 77 64 2c 20 69 73 41 64 6d 69 6e 29  Passwd, isAdmin)
32380 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
32390 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
323a0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
323b0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
323c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
323d0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
323e0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
323f0 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64  ICATION */..#ifd
32400 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  ef SQLITE_USER_A
32410 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
32420 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
32430 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65  ite3_user_change
32440 20 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53   DB USERNAME PAS
32450 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f  SWORD ISADMIN.*/
32460 0a 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49  .static int SQLI
32470 54 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75  TE_TCLAPI test_u
32480 73 65 72 5f 63 68 61 6e 67 65 28 0a 20 20 43 6c  ser_change(.  Cl
32490 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
324a0 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a  ata, /* Unused *
324b0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
324c0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
324d0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
324e0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
324f0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
32500 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
32510 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
32520 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
32530 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
32540 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
32550 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
32560 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55  */.){.  char *zU
32570 73 65 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ser = 0;.  char 
32580 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a 20 20  *zPasswd = 0;.  
32590 69 6e 74 20 6e 50 61 73 73 77 64 20 3d 20 30 3b  int nPasswd = 0;
325a0 0a 20 20 69 6e 74 20 69 73 41 64 6d 69 6e 20 3d  .  int isAdmin =
325b0 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   0;.  sqlite3 *d
325c0 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  b;.  int rc;..  
325d0 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20  if( objc!=5 ){. 
325e0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
325f0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
32600 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e 41 4d  bjv, "DB USERNAM
32610 45 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d  E PASSWORD ISADM
32620 49 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  IN");.    return
32630 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
32640 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
32650 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
32660 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
32670 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
32680 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
32690 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54  .  }.  zUser = T
326a0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
326b0 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64  v[2]);.  zPasswd
326c0 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
326d0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
326e0 20 26 6e 50 61 73 73 77 64 29 3b 0a 20 20 54 63   &nPasswd);.  Tc
326f0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
32700 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
32710 5b 34 5d 2c 20 26 69 73 41 64 6d 69 6e 29 3b 0a  [4], &isAdmin);.
32720 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75    rc = sqlite3_u
32730 73 65 72 5f 63 68 61 6e 67 65 28 64 62 2c 20 7a  ser_change(db, z
32740 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e  User, zPasswd, n
32750 50 61 73 73 77 64 2c 20 69 73 41 64 6d 69 6e 29  Passwd, isAdmin)
32760 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
32770 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
32780 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
32790 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
327a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
327b0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
327c0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
327d0 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64  ICATION */..#ifd
327e0 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  ef SQLITE_USER_A
327f0 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
32800 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
32810 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65  ite3_user_delete
32820 20 44 42 20 55 53 45 52 4e 41 4d 45 0a 2a 2f 0a   DB USERNAME.*/.
32830 73 74 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54  static int SQLIT
32840 45 5f 54 43 4c 41 50 49 20 74 65 73 74 5f 75 73  E_TCLAPI test_us
32850 65 72 5f 64 65 6c 65 74 65 28 0a 20 20 43 6c 69  er_delete(.  Cli
32860 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
32870 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
32880 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
32890 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
328a0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
328b0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
328c0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
328d0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
328e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
328f0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
32900 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
32910 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
32920 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
32930 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 55 73  /.){.  char *zUs
32940 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  er = 0;.  sqlite
32950 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
32960 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
32970 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
32980 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
32990 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45  1, objv, "DB USE
329a0 52 4e 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74  RNAME");.    ret
329b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
329c0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
329d0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
329e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
329f0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
32a00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
32a10 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20  OR;.  }.  zUser 
32a20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
32a30 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 72 63 20 3d  objv[2]);.  rc =
32a40 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65   sqlite3_user_de
32a50 6c 65 74 65 28 64 62 2c 20 7a 55 73 65 72 29 3b  lete(db, zUser);
32a60 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
32a70 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
32a80 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
32a90 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 20  , TCL_STATIC);. 
32aa0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
32ab0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
32ac0 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
32ad0 43 41 54 49 4f 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  CATION */../*.**
32ae0 20 74 63 6c 63 6d 64 3a 20 62 61 64 5f 62 65 68   tclcmd: bad_beh
32af0 61 76 69 6f 72 20 54 59 50 45 0a 2a 2a 0a 2a 2a  avior TYPE.**.**
32b00 20 44 6f 20 73 6f 6d 65 20 74 68 69 6e 67 73 20   Do some things 
32b10 74 68 61 74 20 73 68 6f 75 6c 64 20 74 72 69 67  that should trig
32b20 67 65 72 20 61 20 76 61 6c 67 72 69 6e 64 20 6f  ger a valgrind o
32b30 72 20 2d 66 73 61 6e 69 74 69 7a 65 3d 75 6e 64  r -fsanitize=und
32b40 65 66 69 6e 65 64 0a 2a 2a 20 77 61 72 6e 69 6e  efined.** warnin
32b50 67 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  g.  This is used
32b60 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20   to verify that 
32b70 65 72 72 6f 72 73 20 61 6e 64 20 77 61 72 6e 69  errors and warni
32b80 6e 67 73 20 6f 75 74 70 75 74 20 62 79 20 74 68  ngs output by th
32b90 6f 73 65 0a 2a 2a 20 74 6f 6f 6c 73 20 61 72 65  ose.** tools are
32ba0 20 64 65 74 65 63 74 65 64 20 62 79 20 74 68 65   detected by the
32bb0 20 74 65 73 74 20 73 63 72 69 70 74 73 2e 0a 2a   test scripts..*
32bc0 2a 0a 2a 2a 20 20 20 20 20 20 20 54 59 50 45 20  *.**       TYPE 
32bd0 20 20 20 20 20 20 42 45 48 41 56 49 4f 52 0a 2a        BEHAVIOR.*
32be0 2a 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20  *       1       
32bf0 20 20 20 4f 76 65 72 66 6c 6f 77 20 61 20 73 69     Overflow a si
32c00 67 6e 65 64 20 69 6e 74 65 67 65 72 0a 2a 2a 20  gned integer.** 
32c10 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20        2         
32c20 20 4a 75 6d 70 20 62 61 73 65 64 20 6f 6e 20 61   Jump based on a
32c30 6e 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  n uninitialized 
32c40 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20 20 20  variable.**     
32c50 20 20 33 20 20 20 20 20 20 20 20 20 20 52 65 61    3          Rea
32c60 64 20 61 66 74 65 72 20 66 72 65 65 0a 2a 2a 20  d after free.** 
32c70 20 20 20 20 20 20 34 20 20 20 20 20 20 20 20 20        4         
32c80 20 50 61 6e 69 63 0a 2a 2f 0a 73 74 61 74 69 63   Panic.*/.static
32c90 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43 4c 41   int SQLITE_TCLA
32ca0 50 49 20 74 65 73 74 5f 62 61 64 5f 62 65 68 61  PI test_bad_beha
32cb0 76 69 6f 72 28 0a 20 20 43 6c 69 65 6e 74 44 61  vior(.  ClientDa
32cc0 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
32cd0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  * Pointer to an 
32ce0 69 6e 74 65 67 65 72 20 63 6f 6e 74 61 69 6e 69  integer containi
32cf0 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 54 63 6c  ng zero */.  Tcl
32d00 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
32d10 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
32d20 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
32d30 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
32d40 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
32d50 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
32d60 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
32d70 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
32d80 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
32d90 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
32da0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
32db0 20 69 6e 74 20 69 54 79 70 65 3b 0a 20 20 69 6e   int iType;.  in
32dc0 74 20 78 79 7a 3b 0a 20 20 69 6e 74 20 69 20 3d  t xyz;.  int i =
32dd0 20 2a 28 69 6e 74 2a 29 63 6c 69 65 6e 74 44 61   *(int*)clientDa
32de0 74 61 3b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 69  ta;.  int j;.  i
32df0 6e 74 20 77 5b 31 30 5d 3b 0a 20 20 69 6e 74 20  nt w[10];.  int 
32e00 2a 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  *a;.  if( objc!=
32e10 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
32e20 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
32e30 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 54 59 50 45  , 1, objv, "TYPE
32e40 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
32e50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
32e60 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
32e70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
32e80 6a 76 5b 31 5d 2c 20 26 69 54 79 70 65 29 20 29  jv[1], &iType) )
32e90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
32ea0 52 3b 0a 20 20 73 77 69 74 63 68 28 20 69 54 79  R;.  switch( iTy
32eb0 70 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 31  pe ){.    case 1
32ec0 3a 20 7b 0a 20 20 20 20 20 20 78 79 7a 20 3d 20  : {.      xyz = 
32ed0 30 78 37 66 66 66 66 66 30 30 20 2d 20 69 3b 0a  0x7fffff00 - i;.
32ee0 20 20 20 20 20 20 78 79 7a 20 2b 3d 20 30 78 31        xyz += 0x1
32ef0 30 30 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  00;.      Tcl_Se
32f00 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
32f10 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
32f20 28 78 79 7a 29 29 3b 0a 20 20 20 20 20 20 62 72  (xyz));.      br
32f30 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
32f40 61 73 65 20 32 3a 20 7b 0a 20 20 20 20 20 20 77  ase 2: {.      w
32f50 5b 31 5d 20 3d 20 35 3b 0a 20 20 20 20 20 20 69  [1] = 5;.      i
32f60 66 28 20 77 5b 69 5d 3e 30 20 29 20 77 5b 31 5d  f( w[i]>0 ) w[1]
32f70 2b 2b 3b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  ++;.      Tcl_Se
32f80 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
32f90 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
32fa0 28 77 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 62  (w[1]));.      b
32fb0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
32fc0 63 61 73 65 20 33 3a 20 7b 0a 20 20 20 20 20 20  case 3: {.      
32fd0 61 20 3d 20 6d 61 6c 6c 6f 63 28 20 73 69 7a 65  a = malloc( size
32fe0 6f 66 28 69 6e 74 29 2a 31 30 20 29 3b 0a 20 20  of(int)*10 );.  
32ff0 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 31      for(j=0; j<1
33000 30 3b 20 6a 2b 2b 29 20 61 5b 6a 5d 20 3d 20 6a  0; j++) a[j] = j
33010 3b 0a 20 20 20 20 20 20 66 72 65 65 28 61 29 3b  ;.      free(a);
33020 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
33030 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
33040 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 5b  Tcl_NewIntObj(a[
33050 69 5d 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  i]));.      brea
33060 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
33070 65 20 34 3a 20 7b 0a 20 20 20 20 20 20 54 63 6c  e 4: {.      Tcl
33080 5f 50 61 6e 69 63 28 22 44 65 6c 69 62 65 72 61  _Panic("Delibera
33090 74 65 20 70 61 6e 69 63 22 29 3b 0a 20 20 20 20  te panic");.    
330a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
330b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
330c0 4f 4b 3b 0a 7d 20 20 0a 0a 2f 2a 0a 2a 2a 20 74  OK;.}  ../*.** t
330d0 63 6c 63 6d 64 3a 20 20 20 72 65 67 69 73 74 65  clcmd:   registe
330e0 72 5f 64 62 73 74 61 74 5f 76 74 61 62 20 44 42  r_dbstat_vtab DB
330f0 0a 2a 2a 0a 2a 2a 20 43 61 75 73 65 20 74 68 65  .**.** Cause the
33100 20 64 62 73 74 61 74 20 76 69 72 74 75 61 6c 20   dbstat virtual 
33110 74 61 62 6c 65 20 74 6f 20 62 65 20 61 76 61 69  table to be avai
33120 6c 61 62 6c 65 20 6f 6e 20 74 68 65 20 63 6f 6e  lable on the con
33130 6e 65 63 74 69 6f 6e 20 44 42 0a 2a 2f 0a 73 74  nection DB.*/.st
33140 61 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f  atic int SQLITE_
33150 54 43 4c 41 50 49 20 74 65 73 74 5f 72 65 67 69  TCLAPI test_regi
33160 73 74 65 72 5f 64 62 73 74 61 74 5f 76 74 61 62  ster_dbstat_vtab
33170 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
33180 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
33190 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
331a0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
331b0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
331c0 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
331d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
331e0 4c 45 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  LE.  Tcl_AppendR
331f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64  esult(interp, "d
33200 62 73 74 61 74 20 6e 6f 74 20 61 76 61 69 6c 61  bstat not availa
33210 62 6c 65 20 62 65 63 61 75 73 65 20 6f 66 20 22  ble because of "
33220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33230 20 20 20 20 20 20 20 20 20 20 20 20 22 53 51 4c              "SQL
33240 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
33250 54 41 42 4c 45 22 2c 20 28 76 6f 69 64 2a 29 30  TABLE", (void*)0
33260 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
33270 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20 73  ERROR;.#else.  s
33280 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 7b  truct SqliteDb {
33290 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 7d 3b   sqlite3 *db; };
332a0 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20  .  char *zDb;.  
332b0 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
332c0 6e 66 6f 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  nfo;..  if( objc
332d0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=2 ){.    Tcl_W
332e0 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
332f0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
33300 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
33310 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
33320 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
33330 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
33340 20 69 66 28 20 54 63 6c 5f 47 65 74 43 6f 6d 6d   if( Tcl_GetComm
33350 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
33360 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
33370 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 2a 20 64  {.    sqlite3* d
33380 62 20 3d 20 28 28 73 74 72 75 63 74 20 53 71 6c  b = ((struct Sql
33390 69 74 65 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f  iteDb*)cmdInfo.o
333a0 62 6a 43 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64  bjClientData)->d
333b0 62 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  b;.    sqlite3Db
333c0 73 74 61 74 52 65 67 69 73 74 65 72 28 64 62 29  statRegister(db)
333d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
333e0 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69 66 20 2f 2a  CL_OK;.#endif /*
333f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
33400 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a 7d 0a 0a  TUALTABLE */.}..
33410 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
33420 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
33430 67 20 44 42 20 53 45 54 54 49 4e 47 20 56 41 4c  g DB SETTING VAL
33440 55 45 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  UE.**.** Invoke 
33450 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
33460 67 28 29 20 66 6f 72 20 6f 6e 65 20 6f 66 20 74  g() for one of t
33470 68 65 20 73 65 74 74 69 6e 67 20 76 61 6c 75 65  he setting value
33480 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
33490 20 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 74   SQLITE_TCLAPI t
334a0 65 73 74 5f 73 71 6c 69 74 65 33 5f 64 62 5f 63  est_sqlite3_db_c
334b0 6f 6e 66 69 67 28 0a 20 20 76 6f 69 64 20 2a 63  onfig(.  void *c
334c0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
334d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
334e0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
334f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
33500 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74 61 74 69 63  jv[].){.  static
33510 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
33520 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
33530 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 65  zName;.    int e
33540 56 61 6c 3b 0a 20 20 7d 20 61 53 65 74 74 69 6e  Val;.  } aSettin
33550 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 46  g[] = {.    { "F
33560 4b 45 59 22 2c 20 20 20 20 20 20 20 20 20 20 20  KEY",           
33570 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
33580 5f 45 4e 41 42 4c 45 5f 46 4b 45 59 20 7d 2c 0a  _ENABLE_FKEY },.
33590 20 20 20 20 7b 20 22 54 52 49 47 47 45 52 22 2c      { "TRIGGER",
335a0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
335b0 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
335c0 54 52 49 47 47 45 52 20 7d 2c 0a 20 20 20 20 7b  TRIGGER },.    {
335d0 20 22 46 54 53 33 5f 54 4f 4b 45 4e 49 5a 45 52   "FTS3_TOKENIZER
335e0 22 2c 20 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ",  SQLITE_DBCON
335f0 46 49 47 5f 45 4e 41 42 4c 45 5f 46 54 53 33 5f  FIG_ENABLE_FTS3_
33600 54 4f 4b 45 4e 49 5a 45 52 20 7d 2c 0a 20 20 20  TOKENIZER },.   
33610 20 7b 20 22 4c 4f 41 44 5f 45 58 54 45 4e 53 49   { "LOAD_EXTENSI
33620 4f 4e 22 2c 20 20 53 51 4c 49 54 45 5f 44 42 43  ON",  SQLITE_DBC
33630 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f 41  ONFIG_ENABLE_LOA
33640 44 5f 45 58 54 45 4e 53 49 4f 4e 20 7d 2c 0a 20  D_EXTENSION },. 
33650 20 20 20 7b 20 22 4e 4f 5f 43 4b 50 54 5f 4f 4e     { "NO_CKPT_ON
33660 5f 43 4c 4f 53 45 22 2c 53 51 4c 49 54 45 5f 44  _CLOSE",SQLITE_D
33670 42 43 4f 4e 46 49 47 5f 4e 4f 5f 43 4b 50 54 5f  BCONFIG_NO_CKPT_
33680 4f 4e 5f 43 4c 4f 53 45 20 7d 2c 0a 20 20 20 20  ON_CLOSE },.    
33690 7b 20 22 51 50 53 47 22 2c 20 20 20 20 20 20 20  { "QPSG",       
336a0 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42 43 4f       SQLITE_DBCO
336b0 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 51 50 53 47  NFIG_ENABLE_QPSG
336c0 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69   },.  };.  int i
336d0 3b 0a 20 20 69 6e 74 20 76 3b 0a 20 20 63 6f 6e  ;.  int v;.  con
336e0 73 74 20 63 68 61 72 20 2a 7a 53 65 74 74 69 6e  st char *zSettin
336f0 67 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  g;.  sqlite3 *db
33700 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
33710 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
33720 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
33730 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 53 45   1, objv, "DB SE
33740 54 54 49 4e 47 20 56 41 4c 55 45 22 29 3b 0a 20  TTING VALUE");. 
33750 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
33760 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
33770 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
33780 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
33790 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
337a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
337b0 52 4f 52 3b 0a 20 20 7a 53 65 74 74 69 6e 67 20  ROR;.  zSetting 
337c0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
337d0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20  objv[2]);.  if( 
337e0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
337f0 22 53 51 4c 49 54 45 5f 2a 22 2c 20 7a 53 65 74  "SQLITE_*", zSet
33800 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65 74 74  ting)==0 ) zSett
33810 69 6e 67 20 2b 3d 20 37 3b 0a 20 20 69 66 28 20  ing += 7;.  if( 
33820 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
33830 22 44 42 43 4f 4e 46 49 47 5f 2a 22 2c 20 7a 53  "DBCONFIG_*", zS
33840 65 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65  etting)==0 ) zSe
33850 74 74 69 6e 67 20 2b 3d 20 39 3b 0a 20 20 69 66  tting += 9;.  if
33860 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
33870 62 28 22 45 4e 41 42 4c 45 5f 2a 22 2c 20 7a 53  b("ENABLE_*", zS
33880 65 74 74 69 6e 67 29 3d 3d 30 20 29 20 7a 53 65  etting)==0 ) zSe
33890 74 74 69 6e 67 20 2b 3d 20 37 3b 0a 20 20 66 6f  tting += 7;.  fo
338a0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
338b0 7a 65 28 61 53 65 74 74 69 6e 67 29 3b 20 69 2b  ze(aSetting); i+
338c0 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63  +){.    if( strc
338d0 6d 70 28 7a 53 65 74 74 69 6e 67 2c 20 61 53 65  mp(zSetting, aSe
338e0 74 74 69 6e 67 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  tting[i].zName)=
338f0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  =0 ) break;.  }.
33900 20 20 69 66 28 20 69 3e 3d 41 72 72 61 79 53 69    if( i>=ArraySi
33910 7a 65 28 61 53 65 74 74 69 6e 67 29 20 29 7b 0a  ze(aSetting) ){.
33920 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
33930 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a 20 20 20  sult(interp,.   
33940 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
33950 4f 62 6a 28 22 75 6e 6b 6e 6f 77 6e 20 73 71 6c  Obj("unknown sql
33960 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 20 73  ite3_db_config s
33970 65 74 74 69 6e 67 22 2c 20 2d 31 29 29 3b 0a 20  etting", -1));. 
33980 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
33990 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54  ROR;.  }.  if( T
339a0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
339b0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
339c0 2c 20 26 76 29 20 29 20 72 65 74 75 72 6e 20 54  , &v) ) return T
339d0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
339e0 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62  te3_db_config(db
339f0 2c 20 61 53 65 74 74 69 6e 67 5b 69 5d 2e 65 56  , aSetting[i].eV
33a00 61 6c 2c 20 76 2c 20 26 76 29 3b 0a 20 20 54 63  al, v, &v);.  Tc
33a10 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
33a20 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
33a30 74 4f 62 6a 28 76 29 29 3b 0a 20 20 72 65 74 75  tObj(v));.  retu
33a40 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
33a50 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6e  .** Change the n
33a60 61 6d 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  ame of the main 
33a70 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
33a80 66 72 6f 6d 20 22 6d 61 69 6e 22 20 74 6f 20 22  from "main" to "
33a90 69 63 65 63 75 62 65 22 2e 0a 2a 2f 0a 73 74 61  icecube"..*/.sta
33aa0 74 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54  tic int SQLITE_T
33ab0 43 4c 41 50 49 20 74 65 73 74 5f 64 62 63 6f 6e  CLAPI test_dbcon
33ac0 66 69 67 5f 6d 61 69 6e 64 62 6e 61 6d 65 5f 69  fig_maindbname_i
33ad0 63 65 63 75 62 65 28 0a 20 20 76 6f 69 64 20 2a  cecube(.  void *
33ae0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
33af0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
33b00 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
33b10 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
33b20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20  objv[].){.  int 
33b30 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
33b40 62 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  b;.  extern int 
33b50 67 65 74 44 62 50 6f 69 6e 74 65 72 28 54 63 6c  getDbPointer(Tcl
33b60 5f 49 6e 74 65 72 70 2a 2c 20 63 6f 6e 73 74 20  _Interp*, const 
33b70 63 68 61 72 2a 2c 20 73 71 6c 69 74 65 33 2a 2a  char*, sqlite3**
33b80 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  );.  if( objc!=2
33b90 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
33ba0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
33bb0 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b   1, objv, "DB");
33bc0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
33bd0 45 52 52 4f 52 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ERROR;.  }else{.
33be0 20 20 20 20 69 66 28 20 67 65 74 44 62 50 6f 69      if( getDbPoi
33bf0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
33c00 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
33c10 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
33c20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
33c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 64    rc = sqlite3_d
33c40 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c  b_config(db, SQL
33c50 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4d 41 49  ITE_DBCONFIG_MAI
33c60 4e 44 42 4e 41 4d 45 2c 20 22 69 63 65 63 75 62  NDBNAME, "icecub
33c70 65 22 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  e");.    Tcl_Set
33c80 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
33c90 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
33ca0 72 63 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  rc));.    return
33cb0 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a   TCL_OK;.  }.}..
33cc0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
33cd0 69 74 65 33 5f 6d 6d 61 70 5f 77 61 72 6d 20 44  ite3_mmap_warm D
33ce0 42 20 44 42 4e 41 4d 45 0a 2a 2f 0a 73 74 61 74  B DBNAME.*/.stat
33cf0 69 63 20 69 6e 74 20 53 51 4c 49 54 45 5f 54 43  ic int SQLITE_TC
33d00 4c 41 50 49 20 74 65 73 74 5f 6d 6d 61 70 5f 77  LAPI test_mmap_w
33d10 61 72 6d 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  arm(.  void * cl
33d20 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
33d30 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
33d40 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
33d50 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
33d60 76 5b 5d 0a 29 7b 0a 20 20 65 78 74 65 72 6e 20  v[].){.  extern 
33d70 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
33d80 28 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 20 63 6f  (Tcl_Interp*, co
33d90 6e 73 74 20 63 68 61 72 2a 2c 20 73 71 6c 69 74  nst char*, sqlit
33da0 65 33 2a 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  e3**);.  extern 
33db0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 6d 61 70  int sqlite3_mmap
33dc0 5f 77 61 72 6d 28 73 71 6c 69 74 65 33 20 2a 64  _warm(sqlite3 *d
33dd0 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  b, const char *)
33de0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
33df0 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
33e00 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
33e10 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
33e20 62 6a 76 2c 20 22 44 42 20 3f 44 42 4e 41 4d 45  bjv, "DB ?DBNAME
33e30 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
33e40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  TCL_ERROR;.  }el
33e50 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a  se{.    int rc;.
33e60 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b      sqlite3 *db;
33e70 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
33e80 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 69 66  *zDb = 0;.    if
33e90 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
33ea0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
33eb0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
33ec0 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
33ed0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 69 66 28 20  _ERROR;.    if( 
33ee0 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 20  objc==3 ){.     
33ef0 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74   zDb = Tcl_GetSt
33f00 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
33f10 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
33f20 6c 69 74 65 33 5f 6d 6d 61 70 5f 77 61 72 6d 28  lite3_mmap_warm(
33f30 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 54 63  db, zDb);.    Tc
33f40 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
33f50 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74  nterp, Tcl_NewSt
33f60 72 69 6e 67 4f 62 6a 28 73 71 6c 69 74 65 33 45  ringObj(sqlite3E
33f70 72 72 4e 61 6d 65 28 72 63 29 2c 20 2d 31 29 29  rrName(rc), -1))
33f80 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
33f90 5f 4f 4b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  _OK;.  }.}../*.*
33fa0 2a 20 52 65 67 69 73 74 65 72 20 63 6f 6d 6d 61  * Register comma
33fb0 6e 64 73 20 77 69 74 68 20 74 68 65 20 54 43 4c  nds with the TCL
33fc0 20 69 6e 74 65 72 70 72 65 74 65 72 2e 0a 2a 2f   interpreter..*/
33fd0 0a 69 6e 74 20 53 71 6c 69 74 65 74 65 73 74 31  .int Sqlitetest1
33fe0 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74 65 72 70  _Init(Tcl_Interp
33ff0 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20 65 78 74   *interp){.  ext
34000 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
34010 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b 0a 20 20  search_count;.  
34020 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
34030 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 3b 0a  e3_found_count;.
34040 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
34050 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 5f 63  ite3_interrupt_c
34060 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
34070 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  nt sqlite3_open_
34080 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20 20 65 78  file_count;.  ex
34090 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
340a0 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a 20 20 65  _sort_count;.  e
340b0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
340c0 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 3b 0a  3_current_time;.
340d0 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e  #if SQLITE_OS_UN
340e0 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f  IX && defined(__
340f0 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49  APPLE__) && SQLI
34100 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e  TE_ENABLE_LOCKIN
34110 47 5f 53 54 59 4c 45 0a 20 20 65 78 74 65 72 6e  G_STYLE.  extern
34120 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 68 6f 73   int sqlite3_hos
34130 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e 64 69 66 0a  tid_num;.#endif.
34140 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
34150 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a  ite3_max_blobsiz
34160 65 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  e;.  extern int 
34170 53 51 4c 49 54 45 5f 54 43 4c 41 50 49 20 73 71  SQLITE_TCLAPI sq
34180 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64  lite3BtreeShared
34190 43 61 63 68 65 52 65 70 6f 72 74 28 76 6f 69 64  CacheReport(void
341a0 2a 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  *,.             
341b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341c0 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c               Tcl
341d0 5f 49 6e 74 65 72 70 2a 2c 69 6e 74 2c 54 63 6c  _Interp*,int,Tcl
341e0 5f 4f 62 6a 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20  _Obj*CONST*);.  
341f0 73 74 61 74 69 63 20 69 6e 74 20 69 5a 65 72 6f  static int iZero
34200 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 73   = 0;.  static s
34210 74 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61  truct {.     cha
34220 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54  r *zName;.     T
34230 63 6c 5f 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f  cl_CmdProc *xPro
34240 63 3b 0a 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20  c;.  } aCmd[] = 
34250 7b 0a 20 20 20 20 20 7b 20 22 64 62 5f 65 6e 74  {.     { "db_ent
34260 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  er",            
34270 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
34280 6d 64 50 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72  mdProc*)db_enter
34290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
342a0 2c 0a 20 20 20 20 20 7b 20 22 64 62 5f 6c 65 61  ,.     { "db_lea
342b0 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ve",            
342c0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
342d0 6d 64 50 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65  mdProc*)db_leave
342e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
342f0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34300 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20  3_mprintf_int", 
34310 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
34320 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
34330 6d 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d  mprintf_int    }
34340 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34350 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 22  3_mprintf_int64"
34360 2c 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ,         (Tcl_C
34370 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
34380 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d  mprintf_int64  }
34390 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
343a0 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c  3_mprintf_long",
343b0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
343c0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
343d0 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d  mprintf_long   }
343e0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
343f0 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 22 2c 20  3_mprintf_str", 
34400 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
34410 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
34420 6d 70 72 69 6e 74 66 5f 73 74 72 20 20 20 20 7d  mprintf_str    }
34430 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34440 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c  3_snprintf_str",
34450 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
34460 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
34470 73 6e 70 72 69 6e 74 66 5f 73 74 72 20 20 20 7d  snprintf_str   }
34480 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34490 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c  3_mprintf_stronl
344a0 79 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43  y",       (Tcl_C
344b0 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
344c0 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d  mprintf_stronly}
344d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
344e0 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65  3_mprintf_double
344f0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
34500 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
34510 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d  mprintf_double }
34520 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34530 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
34540 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
34550 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f  mdProc*)sqlite3_
34560 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d  mprintf_scaled }
34570 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34580 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
34590 62 6c 65 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64  ble",   (Tcl_Cmd
345a0 50 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70  Proc*)sqlite3_mp
345b0 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d  rintf_hexdouble}
345c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
345d0 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74  3_mprintf_z_test
345e0 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
345f0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72  mdProc*)test_mpr
34600 69 6e 74 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c  intf_z        },
34610 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
34620 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22  _mprintf_n_test"
34630 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ,        (Tcl_Cm
34640 64 50 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69  dProc*)test_mpri
34650 6e 74 66 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a  ntf_n        },.
34660 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34670 73 6e 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20  snprintf_int",  
34680 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
34690 50 72 6f 63 2a 29 74 65 73 74 5f 73 6e 70 72 69  Proc*)test_snpri
346a0 6e 74 66 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20  ntf_int     },. 
346b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c      { "sqlite3_l
346c0 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
346d0 22 2c 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ",     (Tcl_CmdP
346e0 72 6f 63 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72  roc*)test_last_r
346f0 6f 77 69 64 20 20 20 20 20 20 20 7d 2c 0a 20 20  owid       },.  
34700 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
34710 65 63 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20  ec_printf",     
34720 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
34730 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 70 72  oc*)test_exec_pr
34740 69 6e 74 66 20 20 20 20 20 20 7d 2c 0a 20 20 20  intf      },.   
34750 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65    { "sqlite3_exe
34760 63 5f 68 65 78 22 2c 20 20 20 20 20 20 20 20 20  c_hex",         
34770 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
34780 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 68 65 78  c*)test_exec_hex
34790 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
347a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63   { "sqlite3_exec
347b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
347c0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
347d0 2a 29 74 65 73 74 5f 65 78 65 63 20 20 20 20 20  *)test_exec     
347e0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
347f0 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  { "sqlite3_exec_
34800 6e 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  nr",            
34810 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
34820 29 74 65 73 74 5f 65 78 65 63 5f 6e 72 20 20 20  )test_exec_nr   
34830 20 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65         },.#ifnde
34840 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45  f SQLITE_OMIT_GE
34850 54 5f 54 41 42 4c 45 0a 20 20 20 20 20 7b 20 22  T_TABLE.     { "
34860 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c  sqlite3_get_tabl
34870 65 5f 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20  e_printf",      
34880 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
34890 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69  st_get_table_pri
348a0 6e 74 66 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  ntf },.#endif.  
348b0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c     { "sqlite3_cl
348c0 6f 73 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ose",           
348d0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
348e0 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f  oc*)sqlite_test_
348f0 63 6c 6f 73 65 20 20 20 20 20 7d 2c 0a 20 20 20  close     },.   
34900 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f    { "sqlite3_clo
34910 73 65 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  se_v2",         
34920 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
34930 63 2a 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  c*)sqlite_test_c
34940 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a 20 20 20 20  lose_v2  },.    
34950 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
34960 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20  te_function",   
34970 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
34980 2a 29 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  *)test_create_fu
34990 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20  nction  },.     
349a0 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74  { "sqlite3_creat
349b0 65 5f 61 67 67 72 65 67 61 74 65 22 2c 20 20 20  e_aggregate",   
349c0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
349d0 29 74 65 73 74 5f 63 72 65 61 74 65 5f 61 67 67  )test_create_agg
349e0 72 65 67 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b  regate },.     {
349f0 20 22 73 71 6c 69 74 65 5f 72 65 67 69 73 74 65   "sqlite_registe
34a00 72 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  r_test_function"
34a10 2c 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29  , (Tcl_CmdProc*)
34a20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f 66 75  test_register_fu
34a30 6e 63 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  nc    },.     { 
34a40 22 73 71 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20  "sqlite_abort", 
34a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34a60 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73   (Tcl_CmdProc*)s
34a70 71 6c 69 74 65 5f 61 62 6f 72 74 20 20 20 20 20  qlite_abort     
34a80 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
34a90 73 71 6c 69 74 65 5f 62 69 6e 64 22 2c 20 20 20  sqlite_bind",   
34aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ab0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
34ac0 73 74 5f 62 69 6e 64 20 20 20 20 20 20 20 20 20  st_bind         
34ad0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62      },.     { "b
34ae0 72 65 61 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20  reakpoint",     
34af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
34b00 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
34b10 74 5f 62 72 65 61 6b 70 6f 69 6e 74 20 20 20 20  t_breakpoint    
34b20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
34b30 6c 69 74 65 33 5f 6b 65 79 22 2c 20 20 20 20 20  lite3_key",     
34b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
34b50 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
34b60 5f 6b 65 79 20 20 20 20 20 20 20 20 20 20 20 20  _key            
34b70 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
34b80 69 74 65 33 5f 72 65 6b 65 79 22 2c 20 20 20 20  ite3_rekey",    
34b90 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
34ba0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
34bb0 72 65 6b 65 79 20 20 20 20 20 20 20 20 20 20 20  rekey           
34bc0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
34bd0 74 65 5f 73 65 74 5f 6d 61 67 69 63 22 2c 20 20  te_set_magic",  
34be0 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
34bf0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
34c00 5f 73 65 74 5f 6d 61 67 69 63 20 20 20 20 20 20  _set_magic      
34c10 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
34c20 65 33 5f 69 6e 74 65 72 72 75 70 74 22 2c 20 20  e3_interrupt",  
34c30 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
34c40 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e  CmdProc*)test_in
34c50 74 65 72 72 75 70 74 20 20 20 20 20 20 20 20 7d  terrupt        }
34c60 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
34c70 5f 64 65 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e  _delete_function
34c80 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43  ",        (Tcl_C
34c90 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66  mdProc*)delete_f
34ca0 75 6e 63 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c  unction       },
34cb0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
34cc0 64 65 6c 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  delete_collation
34cd0 22 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d  ",       (Tcl_Cm
34ce0 64 50 72 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f  dProc*)delete_co
34cf0 6c 6c 61 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a  llation      },.
34d00 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34d10 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c  get_autocommit",
34d20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
34d30 50 72 6f 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f  Proc*)get_autoco
34d40 6d 6d 69 74 20 20 20 20 20 20 20 20 7d 2c 0a 20  mmit        },. 
34d50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
34d60 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c 20 20 20  usy_timeout",   
34d70 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
34d80 72 6f 63 2a 29 74 65 73 74 5f 62 75 73 79 5f 74  roc*)test_busy_t
34d90 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c 0a 20 20  imeout     },.  
34da0 20 20 20 7b 20 22 70 72 69 6e 74 66 22 2c 20 20     { "printf",  
34db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34dc0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
34dd0 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e 74 66 20  oc*)test_printf 
34de0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
34df0 20 20 7b 20 22 73 71 6c 69 74 65 33 49 6f 54 72    { "sqlite3IoTr
34e00 61 63 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ace",           
34e10 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
34e20 29 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 20 20  )test_io_trace  
34e30 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
34e40 20 22 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65   "clang_sanitize
34e50 5f 61 64 64 72 65 73 73 22 2c 20 20 20 20 20 20  _address",      
34e60 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
34e70 63 6c 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61  clang_sanitize_a
34e80 64 64 72 65 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20  ddress },.  };. 
34e90 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 7b   static struct {
34ea0 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
34eb0 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 43  e;.     Tcl_ObjC
34ec0 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a 20  mdProc *xProc;. 
34ed0 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74      void *client
34ee0 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d  Data;.  } aObjCm
34ef0 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  d[] = {.     { "
34f00 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
34f10 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  g",             
34f20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 64 62 5f  test_sqlite3_db_
34f30 63 6f 6e 66 69 67 2c 20 30 20 7d 2c 0a 20 20 20  config, 0 },.   
34f40 20 20 7b 20 22 62 61 64 5f 62 65 68 61 76 69 6f    { "bad_behavio
34f50 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  r",             
34f60 20 20 20 20 20 74 65 73 74 5f 62 61 64 5f 62 65       test_bad_be
34f70 68 61 76 69 6f 72 2c 20 20 28 76 6f 69 64 2a 29  havior,  (void*)
34f80 26 69 5a 65 72 6f 20 7d 2c 0a 20 20 20 20 20 7b  &iZero },.     {
34f90 20 22 72 65 67 69 73 74 65 72 5f 64 62 73 74 61   "register_dbsta
34fa0 74 5f 76 74 61 62 22 2c 20 20 20 20 20 20 20 20  t_vtab",        
34fb0 20 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f    test_register_
34fc0 64 62 73 74 61 74 5f 76 74 61 62 20 20 7d 2c 0a  dbstat_vtab  },.
34fd0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
34fe0 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70 6f 69 6e 74  connection_point
34ff0 65 72 22 2c 20 20 20 20 67 65 74 5f 73 71 6c 69  er",    get_sqli
35000 74 65 5f 70 6f 69 6e 74 65 72 2c 20 30 20 7d 2c  te_pointer, 0 },
35010 0a 20 20 20 20 20 7b 20 22 69 6e 74 61 72 72 61  .     { "intarra
35020 79 5f 61 64 64 72 22 2c 20 20 20 20 20 20 20 20  y_addr",        
35030 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69 6e           test_in
35040 74 61 72 72 61 79 5f 61 64 64 72 2c 20 30 20 7d  tarray_addr, 0 }
35050 2c 0a 20 20 20 20 20 7b 20 22 69 6e 74 36 34 61  ,.     { "int64a
35060 72 72 61 79 5f 61 64 64 72 22 2c 20 20 20 20 20  rray_addr",     
35070 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 69            test_i
35080 6e 74 36 34 61 72 72 61 79 5f 61 64 64 72 2c 20  nt64array_addr, 
35090 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 6f 75  0 },.     { "dou
350a0 62 6c 65 61 72 72 61 79 5f 61 64 64 72 22 2c 20  blearray_addr", 
350b0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
350c0 74 5f 64 6f 75 62 6c 65 61 72 72 61 79 5f 61 64  t_doublearray_ad
350d0 64 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  dr, 0 },.     { 
350e0 22 74 65 78 74 61 72 72 61 79 5f 61 64 64 72 22  "textarray_addr"
350f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35100 20 74 65 73 74 5f 74 65 78 74 61 72 72 61 79 5f   test_textarray_
35110 61 64 64 72 2c 20 30 20 7d 2c 0a 20 20 20 20 20  addr, 0 },.     
35120 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
35130 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  int",           
35140 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e 74     test_bind_int
35150 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  ,      0 },.    
35160 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
35170 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20 20  _zeroblob",     
35180 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a 65      test_bind_ze
35190 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20 20  roblob, 0 },.   
351a0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
351b0 64 5f 7a 65 72 6f 62 6c 6f 62 36 34 22 2c 20 20  d_zeroblob64",  
351c0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
351d0 65 72 6f 62 6c 6f 62 36 34 2c 20 30 20 7d 2c 0a  eroblob64, 0 },.
351e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
351f0 62 69 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20  bind_int64",    
35200 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
35210 64 5f 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c  d_int64,    0 },
35220 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35230 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20  _bind_double",  
35240 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
35250 6e 64 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d  nd_double,   0 }
35260 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35270 33 5f 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20  3_bind_null",   
35280 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
35290 69 6e 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20  ind_null     ,0 
352a0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
352b0 65 33 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20  e3_bind_text",  
352c0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
352d0 62 69 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30  bind_text     ,0
352e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
352f0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22  te3_bind_text16"
35300 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
35310 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c  _bind_text16   ,
35320 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
35330 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c  ite3_bind_blob",
35340 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
35350 74 5f 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20  t_bind_blob     
35360 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
35370 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
35380 65 74 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65  eter_count",  te
35390 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65  st_bind_paramete
353a0 72 5f 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20  r_count, 0},.   
353b0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
353c0 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65  d_parameter_name
353d0 22 2c 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70  ",   test_bind_p
353e0 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20  arameter_name,  
353f0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
35400 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
35410 65 72 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74  er_index",  test
35420 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
35430 69 6e 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20  index, 0},.     
35440 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72  { "sqlite3_clear
35450 5f 62 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20  _bindings",     
35460 20 20 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69     test_clear_bi
35470 6e 64 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20  ndings, 0},.    
35480 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65   { "sqlite3_slee
35490 70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  p",             
354a0 20 20 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20      test_sleep, 
354b0 20 20 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20           0},.   
354c0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
354d0 63 6f 64 65 22 2c 20 20 20 20 20 20 20 20 20 20  code",          
354e0 20 20 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64       test_errcod
354f0 65 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  e       ,0 },.  
35500 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78     { "sqlite3_ex
35510 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c  tended_errcode",
35520 20 20 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72        test_ex_er
35530 72 63 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20  rcode    ,0 },. 
35540 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
35550 72 72 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20  rrmsg",         
35560 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d         test_errm
35570 73 67 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  sg        ,0 },.
35580 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35590 65 72 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20  errmsg16",      
355a0 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 72 72          test_err
355b0 6d 73 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c  msg16      ,0 },
355c0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
355d0 5f 6f 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20  _open",         
355e0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
355f0 65 6e 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  en          ,0 }
35600 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35610 33 5f 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20  3_open16",      
35620 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f            test_o
35630 70 65 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20  pen16        ,0 
35640 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
35650 65 33 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20  e3_open_v2",    
35660 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
35670 6f 70 65 6e 5f 76 32 20 20 20 20 20 20 20 2c 30  open_v2       ,0
35680 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
35690 74 65 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c  te3_complete16",
356a0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
356b0 5f 63 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c  _complete16    ,
356c0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
356d0 69 74 65 33 5f 6e 6f 72 6d 61 6c 69 7a 65 22 2c  ite3_normalize",
356e0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
356f0 74 5f 6e 6f 72 6d 61 6c 69 7a 65 20 20 20 20 20  t_normalize     
35700 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73  ,0 },..     { "s
35710 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 22 2c  qlite3_prepare",
35720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
35730 65 73 74 5f 70 72 65 70 61 72 65 20 20 20 20 20  est_prepare     
35740 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
35750 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
35760 36 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  6",             
35770 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 20 20  test_prepare16  
35780 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
35790 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
357a0 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20  _v2",           
357b0 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 76 32   test_prepare_v2
357c0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
357d0 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72   "sqlite3_prepar
357e0 65 5f 74 6b 74 33 31 33 34 22 2c 20 20 20 20 20  e_tkt3134",     
357f0 20 20 74 65 73 74 5f 70 72 65 70 61 72 65 5f 74    test_prepare_t
35800 6b 74 33 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20  kt3134, 0},.    
35810 20 7b 20 22 73 71 6c 69 74 65 33 5f 70 72 65 70   { "sqlite3_prep
35820 61 72 65 31 36 5f 76 32 22 2c 20 20 20 20 20 20  are16_v2",      
35830 20 20 20 20 74 65 73 74 5f 70 72 65 70 61 72 65      test_prepare
35840 31 36 5f 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20  16_v2  ,0 },.   
35850 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 66 69 6e    { "sqlite3_fin
35860 61 6c 69 7a 65 22 2c 20 20 20 20 20 20 20 20 20  alize",         
35870 20 20 20 20 20 74 65 73 74 5f 66 69 6e 61 6c 69       test_finali
35880 7a 65 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ze      ,0 },.  
35890 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74     { "sqlite3_st
358a0 6d 74 5f 73 74 61 74 75 73 22 2c 20 20 20 20 20  mt_status",     
358b0 20 20 20 20 20 20 74 65 73 74 5f 73 74 6d 74 5f        test_stmt_
358c0 73 74 61 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20  status   ,0 },. 
358d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 72      { "sqlite3_r
358e0 65 73 65 74 22 2c 20 20 20 20 20 20 20 20 20 20  eset",          
358f0 20 20 20 20 20 20 20 74 65 73 74 5f 72 65 73 65         test_rese
35900 74 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  t         ,0 },.
35910 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
35920 65 78 70 69 72 65 64 22 2c 20 20 20 20 20 20 20  expired",       
35930 20 20 20 20 20 20 20 20 74 65 73 74 5f 65 78 70          test_exp
35940 69 72 65 64 20 20 20 20 20 20 20 2c 30 20 7d 2c  ired       ,0 },
35950 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
35960 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e  _transfer_bindin
35970 67 73 22 2c 20 20 20 20 20 74 65 73 74 5f 74 72  gs",     test_tr
35980 61 6e 73 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d  ansfer_bind ,0 }
35990 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
359a0 33 5f 63 68 61 6e 67 65 73 22 2c 20 20 20 20 20  3_changes",     
359b0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
359c0 68 61 6e 67 65 73 20 20 20 20 20 20 20 2c 30 20  hanges       ,0 
359d0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
359e0 65 33 5f 73 74 65 70 22 2c 20 20 20 20 20 20 20  e3_step",       
359f0 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
35a00 73 74 65 70 20 20 20 20 20 20 20 20 20 20 2c 30  step          ,0
35a10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
35a20 74 65 33 5f 73 71 6c 22 2c 20 20 20 20 20 20 20  te3_sql",       
35a30 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
35a40 5f 73 71 6c 20 20 20 20 20 20 20 20 20 20 20 2c  _sql           ,
35a50 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
35a60 69 74 65 33 5f 65 78 70 61 6e 64 65 64 5f 73 71  ite3_expanded_sq
35a70 6c 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73  l",          tes
35a80 74 5f 65 78 5f 73 71 6c 20 20 20 20 20 20 20 20  t_ex_sql        
35a90 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
35aa0 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d 74 22  lite3_next_stmt"
35ab0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ,             te
35ac0 73 74 5f 6e 65 78 74 5f 73 74 6d 74 20 20 20 20  st_next_stmt    
35ad0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
35ae0 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64  qlite3_stmt_read
35af0 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 20 20 74  only",         t
35b00 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  est_stmt_readonl
35b10 79 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  y ,0 },.     { "
35b20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
35b30 79 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  y",             
35b40 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 20 20  test_stmt_busy  
35b50 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20     ,0 },.     { 
35b60 22 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e  "uses_stmt_journ
35b70 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  al",            
35b80 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e   uses_stmt_journ
35b90 61 6c 20 2c 30 20 7d 2c 0a 0a 20 20 20 20 20 7b  al ,0 },..     {
35ba0 20 22 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73   "sqlite3_releas
35bb0 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20 20 20 20  e_memory",      
35bc0 20 20 74 65 73 74 5f 72 65 6c 65 61 73 65 5f 6d    test_release_m
35bd0 65 6d 6f 72 79 2c 20 20 20 20 20 30 7d 2c 0a 20  emory,     0},. 
35be0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64      { "sqlite3_d
35bf0 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
35c00 22 2c 20 20 20 20 20 74 65 73 74 5f 64 62 5f 72  ",     test_db_r
35c10 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 2c 20 20  elease_memory,  
35c20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
35c30 74 65 33 5f 64 62 5f 63 61 63 68 65 66 6c 75 73  te3_db_cacheflus
35c40 68 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74  h",         test
35c50 5f 64 62 5f 63 61 63 68 65 66 6c 75 73 68 2c 20  _db_cacheflush, 
35c60 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
35c70 22 73 71 6c 69 74 65 33 5f 73 79 73 74 65 6d 5f  "sqlite3_system_
35c80 65 72 72 6e 6f 22 2c 20 20 20 20 20 20 20 20 20  errno",         
35c90 20 74 65 73 74 5f 73 79 73 74 65 6d 5f 65 72 72   test_system_err
35ca0 6e 6f 2c 20 20 20 20 20 20 20 30 7d 2c 0a 20 20  no,       0},.  
35cb0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 62     { "sqlite3_db
35cc0 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20 20  _filename",     
35cd0 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f 66 69        test_db_fi
35ce0 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 30  lename,        0
35cf0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
35d00 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 22 2c  e3_db_readonly",
35d10 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
35d20 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20 20 20  db_readonly,    
35d30 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22      0},.     { "
35d40 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
35d50 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20 20  p_limit",       
35d60 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f 6c  test_soft_heap_l
35d70 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20 20  imit,    0},.   
35d80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68 72    { "sqlite3_thr
35d90 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20 20  ead_cleanup",   
35da0 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61 64       test_thread
35db0 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30 7d  _cleanup,     0}
35dc0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35dd0 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74  3_pager_refcount
35de0 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 70  s",       test_p
35df0 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c 20  ager_refcounts, 
35e00 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22     0},..     { "
35e10 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74  sqlite3_load_ext
35e20 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20 20  ension",        
35e30 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  test_load_extens
35e40 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20  ion,     0},.   
35e50 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e 61    { "sqlite3_ena
35e60 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69  ble_load_extensi
35e70 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c 65  on", test_enable
35e80 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30 7d  _load,        0}
35e90 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
35ea0 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c  3_extended_resul
35eb0 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f 65  t_codes", test_e
35ec0 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
35ed0 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  odes, 0},.     {
35ee0 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 22   "sqlite3_limit"
35ef0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
35f00 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20 20    test_limit,   
35f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 7d                0}
35f20 2c 0a 20 20 20 20 20 7b 20 22 64 62 63 6f 6e 66  ,.     { "dbconf
35f30 69 67 5f 6d 61 69 6e 64 62 6e 61 6d 65 5f 69 63  ig_maindbname_ic
35f40 65 63 75 62 65 22 2c 20 20 20 74 65 73 74 5f 64  ecube",   test_d
35f50 62 63 6f 6e 66 69 67 5f 6d 61 69 6e 64 62 6e 61  bconfig_maindbna
35f60 6d 65 5f 69 63 65 63 75 62 65 20 7d 2c 0a 0a 20  me_icecube },.. 
35f70 20 20 20 20 7b 20 22 73 61 76 65 5f 70 72 6e 67      { "save_prng
35f80 5f 73 74 61 74 65 22 2c 20 20 20 20 20 20 20 20  _state",        
35f90 20 20 20 20 20 20 20 73 61 76 65 5f 70 72 6e 67         save_prng
35fa0 5f 73 74 61 74 65 2c 20 20 20 20 30 20 7d 2c 0a  _state,    0 },.
35fb0 20 20 20 20 20 7b 20 22 72 65 73 74 6f 72 65 5f       { "restore_
35fc0 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20  prng_state",    
35fd0 20 20 20 20 20 20 20 20 72 65 73 74 6f 72 65 5f          restore_
35fe0 70 72 6e 67 5f 73 74 61 74 65 2c 20 30 20 7d 2c  prng_state, 0 },
35ff0 0a 20 20 20 20 20 7b 20 22 72 65 73 65 74 5f 70  .     { "reset_p
36000 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20 20 20  rng_state",     
36010 20 20 20 20 20 20 20 20 20 72 65 73 65 74 5f 70           reset_p
36020 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 30 20 7d  rng_state,   0 }
36030 2c 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62 61  ,.     { "databa
36040 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74  se_never_corrupt
36050 22 2c 20 20 20 20 20 20 20 20 64 61 74 61 62 61  ",        databa
36060 73 65 5f 6e 65 76 65 72 5f 63 6f 72 72 75 70 74  se_never_corrupt
36070 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 64 61  , 0},.     { "da
36080 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f  tabase_may_be_co
36090 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 64 61  rrupt",       da
360a0 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f 63 6f  tabase_may_be_co
360b0 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20  rrupt, 0},.     
360c0 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f  { "optimization_
360d0 63 6f 6e 74 72 6f 6c 22 2c 20 20 20 20 20 20 20  control",       
360e0 20 20 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f     optimization_
360f0 63 6f 6e 74 72 6f 6c 2c 30 7d 2c 0a 23 69 66 20  control,0},.#if 
36100 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20  SQLITE_OS_WIN.  
36110 20 20 20 7b 20 22 6c 6f 63 6b 5f 77 69 6e 33 32     { "lock_win32
36120 5f 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20  _file",         
36130 20 20 20 20 20 20 77 69 6e 33 32 5f 66 69 6c 65        win32_file
36140 5f 6c 6f 63 6b 2c 20 20 20 20 30 20 7d 2c 0a 20  _lock,    0 },. 
36150 20 20 20 20 7b 20 22 65 78 69 73 74 73 5f 77 69      { "exists_wi
36160 6e 33 32 5f 70 61 74 68 22 2c 20 20 20 20 20 20  n32_path",      
36170 20 20 20 20 20 20 20 77 69 6e 33 32 5f 65 78 69         win32_exi
36180 73 74 73 5f 70 61 74 68 2c 20 20 30 20 7d 2c 0a  sts_path,  0 },.
36190 20 20 20 20 20 7b 20 22 66 69 6e 64 5f 77 69 6e       { "find_win
361a0 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20 20  32_file",       
361b0 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 66 69          win32_fi
361c0 6e 64 5f 66 69 6c 65 2c 20 20 20 20 30 20 7d 2c  nd_file,    0 },
361d0 0a 20 20 20 20 20 7b 20 22 64 65 6c 65 74 65 5f  .     { "delete_
361e0 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20  win32_file",    
361f0 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 64           win32_d
36200 65 6c 65 74 65 5f 66 69 6c 65 2c 20 20 30 20 7d  elete_file,  0 }
36210 2c 0a 20 20 20 20 20 7b 20 22 6d 61 6b 65 5f 77  ,.     { "make_w
36220 69 6e 33 32 5f 64 69 72 22 2c 20 20 20 20 20 20  in32_dir",      
36230 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f            win32_
36240 6d 6b 64 69 72 2c 20 20 20 20 20 20 20 20 30 20  mkdir,        0 
36250 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 6d 6f 76  },.     { "remov
36260 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20 20 20  e_win32_dir",   
36270 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
36280 5f 72 6d 64 69 72 2c 20 20 20 20 20 20 20 20 30  _rmdir,        0
36290 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
362a0 7b 20 22 74 63 6c 5f 6f 62 6a 70 72 6f 63 22 2c  { "tcl_objproc",
362b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
362c0 20 20 20 72 75 6e 41 73 4f 62 6a 50 72 6f 63 2c     runAsObjProc,
362d0 20 20 20 20 20 20 20 30 20 7d 2c 0a 0a 20 20 20         0 },..   
362e0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c    /* sqlite3_col
362f0 75 6d 6e 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20  umn_*() API */. 
36300 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
36310 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20  olumn_count",   
36320 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
36330 6d 6e 5f 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a  mn_count  ,0 },.
36340 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
36350 64 61 74 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20  data_count",    
36360 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 61 74          test_dat
36370 61 5f 63 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c  a_count    ,0 },
36380 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
36390 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20  _column_type",  
363a0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
363b0 6c 75 6d 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d  lumn_type   ,0 }
363c0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
363d0 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20  3_column_blob", 
363e0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
363f0 6f 6c 75 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20  olumn_blob   ,0 
36400 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
36410 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
36420 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
36430 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30  column_double ,0
36440 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
36450 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
36460 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
36470 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c  _column_int64  ,
36480 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
36490 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
364a0 22 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  ",   test_stmt_u
364b0 74 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c  tf8,  (void*)sql
364c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
364d0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
364e0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22  te3_column_name"
364f0 2c 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ,   test_stmt_ut
36500 66 38 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69  f8,  (void*)sqli
36510 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20  te3_column_name 
36520 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
36530 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20  e3_column_int", 
36540 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74     test_stmt_int
36550 2c 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  ,   (void*)sqlit
36560 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d  e3_column_int  }
36570 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
36580 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c  3_column_bytes",
36590 20 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c    test_stmt_int,
365a0 20 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65     (void*)sqlite
365b0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c  3_column_bytes},
365c0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
365d0 4f 4d 49 54 5f 44 45 43 4c 54 59 50 45 0a 20 20  OMIT_DECLTYPE.  
365e0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
365f0 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 22 2c 74  lumn_decltype",t
36600 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76  est_stmt_utf8,(v
36610 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
36620 75 6d 6e 5f 64 65 63 6c 74 79 70 65 7d 2c 0a 23  umn_decltype},.#
36630 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
36640 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d  ITE_ENABLE_COLUM
36650 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 20 22 73 71  N_METADATA.{ "sq
36660 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74  lite3_column_dat
36670 61 62 61 73 65 5f 6e 61 6d 65 22 2c 74 65 73 74  abase_name",test
36680 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
36690 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
366a0 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 7d 2c  _database_name},
366b0 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  .{ "sqlite3_colu
366c0 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 22 2c 74  mn_table_name",t
366d0 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76  est_stmt_utf8,(v
366e0 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
366f0 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c  umn_table_name},
36700 0a 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75  .{ "sqlite3_colu
36710 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c  mn_origin_name",
36720 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28  test_stmt_utf8,(
36730 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f  void*)sqlite3_co
36740 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65  lumn_origin_name
36750 7d 2c 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  },.#endif..#ifnd
36760 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
36770 54 46 31 36 0a 20 20 20 20 20 7b 20 22 73 71 6c  TF16.     { "sql
36780 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
36790 73 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  s16", test_stmt_
367a0 69 6e 74 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  int, (void*)sqli
367b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
367c0 31 36 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  16 },.     { "sq
367d0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
367e0 74 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74  t16",  test_stmt
367f0 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73  _utf16, (void*)s
36800 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
36810 78 74 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73  xt16},.     { "s
36820 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61  qlite3_column_na
36830 6d 65 31 36 22 2c 20 20 74 65 73 74 5f 73 74 6d  me16",  test_stm
36840 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29  t_utf16, (void*)
36850 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
36860 61 6d 65 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22  ame16},.     { "
36870 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65  add_alignment_te
36880 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20  st_collations", 
36890 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65  add_alignment_te
368a0 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30  st_collations, 0
368b0 20 20 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66        },.#ifndef
368c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43   SQLITE_OMIT_DEC
368d0 4c 54 59 50 45 0a 20 20 20 20 20 7b 20 22 73 71  LTYPE.     { "sq
368e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63  lite3_column_dec
368f0 6c 74 79 70 65 31 36 22 2c 74 65 73 74 5f 73 74  ltype16",test_st
36900 6d 74 5f 75 74 66 31 36 2c 28 76 6f 69 64 2a 29  mt_utf16,(void*)
36910 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
36920 65 63 6c 74 79 70 65 31 36 7d 2c 0a 23 65 6e 64  ecltype16},.#end
36930 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
36940 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
36950 45 54 41 44 41 54 41 0a 7b 22 73 71 6c 69 74 65  ETADATA.{"sqlite
36960 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
36970 65 5f 6e 61 6d 65 31 36 22 2c 0a 20 20 74 65 73  e_name16",.  tes
36980 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76  t_stmt_utf16, (v
36990 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
369a0 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d  umn_database_nam
369b0 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f  e16},.{"sqlite3_
369c0 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d  column_table_nam
369d0 65 31 36 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f  e16", test_stmt_
369e0 75 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71  utf16, (void*)sq
369f0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62  lite3_column_tab
36a00 6c 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71  le_name16},.{"sq
36a10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69  lite3_column_ori
36a20 67 69 6e 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73  gin_name16", tes
36a30 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76  t_stmt_utf16, (v
36a40 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
36a50 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31  umn_origin_name1
36a60 36 7d 2c 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  6},.#endif.#endi
36a70 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
36a80 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
36a90 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65  on_v2", test_cre
36aa0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32  ate_collation_v2
36ab0 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
36ac0 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65  qlite3_global_re
36ad0 63 6f 76 65 72 22 2c 20 20 20 20 20 74 65 73 74  cover",     test
36ae0 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c  _global_recover,
36af0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
36b00 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e  working_64bit_in
36b10 74 22 2c 20 20 20 20 20 20 20 20 20 20 77 6f 72  t",          wor
36b20 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20  king_64bit_int, 
36b30 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
36b40 22 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74  "vfs_unlink_test
36b50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 76 66  ",            vf
36b60 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20  s_unlink_test,  
36b70 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b     0   },.     {
36b80 20 22 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74   "vfs_initfail_t
36b90 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 76  est",          v
36ba0 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
36bb0 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  ,   0   },.     
36bc0 7b 20 22 76 66 73 5f 75 6e 72 65 67 69 73 74 65  { "vfs_unregiste
36bd0 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20  r_all",         
36be0 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
36bf0 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  ll,  0   },.    
36c00 20 7b 20 22 76 66 73 5f 72 65 72 65 67 69 73 74   { "vfs_reregist
36c10 65 72 5f 61 6c 6c 22 2c 20 20 20 20 20 20 20 20  er_all",        
36c20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f   vfs_reregister_
36c30 61 6c 6c 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  all,  0   },.   
36c40 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
36c50 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  l_test",        
36c60 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74    file_control_t
36c70 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20  est,   0   },.  
36c80 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
36c90 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73  ol_lasterrno_tes
36ca0 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  t", file_control
36cb0 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 2c  _lasterrno_test,
36cc0 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
36cd0 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f  "file_control_lo
36ce0 63 6b 70 72 6f 78 79 5f 74 65 73 74 22 2c 20 66  ckproxy_test", f
36cf0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b  ile_control_lock
36d00 70 72 6f 78 79 5f 74 65 73 74 2c 20 20 30 20 20  proxy_test,  0  
36d10 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
36d20 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69  _control_chunksi
36d30 7a 65 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63  ze_test", file_c
36d40 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
36d50 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20  _test,  0   },. 
36d60 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74      { "file_cont
36d70 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73  rol_sizehint_tes
36d80 74 22 2c 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  t",  file_contro
36d90 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 2c  l_sizehint_test,
36da0 20 20 20 30 20 20 20 7d 2c 0a 23 69 66 20 53 51     0   },.#if SQ
36db0 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20  LITE_OS_WIN.    
36dc0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
36dd0 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 22  _win32_av_retry"
36de0 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77  , file_control_w
36df0 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 2c 20 20  in32_av_retry,  
36e00 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
36e10 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
36e20 32 5f 67 65 74 5f 68 61 6e 64 6c 65 22 2c 20 66  2_get_handle", f
36e30 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
36e40 32 5f 67 65 74 5f 68 61 6e 64 6c 65 2c 20 30 20  2_get_handle, 0 
36e50 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
36e60 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73  _control_win32_s
36e70 65 74 5f 68 61 6e 64 6c 65 22 2c 20 66 69 6c 65  et_handle", file
36e80 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73  _control_win32_s
36e90 65 74 5f 68 61 6e 64 6c 65 2c 20 30 20 20 7d 2c  et_handle, 0  },
36ea0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
36eb0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72  file_control_per
36ec0 73 69 73 74 5f 77 61 6c 22 2c 20 20 20 20 66 69  sist_wal",    fi
36ed0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69  le_control_persi
36ee0 73 74 5f 77 61 6c 2c 20 20 20 20 20 30 20 20 20  st_wal,     0   
36ef0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
36f00 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66  control_powersaf
36f10 65 5f 6f 76 65 72 77 72 69 74 65 22 2c 66 69 6c  e_overwrite",fil
36f20 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73  e_control_powers
36f30 61 66 65 5f 6f 76 65 72 77 72 69 74 65 2c 30 7d  afe_overwrite,0}
36f40 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
36f50 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 22 2c  ontrol_vfsname",
36f60 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e          file_con
36f70 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c 20 20 20  trol_vfsname,   
36f80 20 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20        0   },.   
36f90 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
36fa0 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 22 2c  l_tempfilename",
36fb0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
36fc0 74 65 6d 70 66 69 6c 65 6e 61 6d 65 2c 20 20 20  tempfilename,   
36fd0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
36fe0 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73 74  sqlite3_vfs_list
36ff0 22 2c 20 20 20 20 20 20 20 20 20 20 20 76 66 73  ",           vfs
37000 5f 6c 69 73 74 2c 20 20 20 20 20 30 20 20 20 7d  _list,     0   }
37010 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
37020 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
37030 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61  n_v2", test_crea
37040 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 2c 20  te_function_v2, 
37050 30 20 7d 2c 0a 0a 20 20 20 20 20 2f 2a 20 46 75  0 },..     /* Fu
37060 6e 63 74 69 6f 6e 73 20 66 72 6f 6d 20 6f 73 2e  nctions from os.
37070 68 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  h */.#ifndef SQL
37080 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
37090 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
370a0 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 20 20 20  collate",       
370b0 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 2c 20 30   test_collate, 0
370c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
370d0 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
370e0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 22 2c  collate_needed",
370f0 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
37100 65 64 65 64 2c 20 30 20 20 20 20 20 7d 2c 0a 20  eded, 0     },. 
37110 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
37120 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
37130 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 2c 20   test_function, 
37140 30 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  0           },. 
37150 20 20 20 20 7b 20 22 61 64 64 5f 74 65 73 74 5f      { "add_test_
37160 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61 74 65  utf16bin_collate
37170 22 2c 20 20 20 20 74 65 73 74 5f 75 74 66 31 36  ",    test_utf16
37180 62 69 6e 5f 63 6f 6c 6c 61 74 65 2c 20 30 20 20  bin_collate, 0  
37190 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
371a0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
371b0 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20 20  test_errstr",   
371c0 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20 30    test_errstr, 0
371d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
371e0 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72 69       { "tcl_vari
371f0 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20 20  able_type",     
37200 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
37210 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a  ype, 0       },.
37220 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
37230 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
37240 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37250 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
37260 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61 62  ache", test_enab
37270 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d 2c  le_shared, 0  },
37280 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37290 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65  _shared_cache_re
372a0 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42 74  port", sqlite3Bt
372b0 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65  reeSharedCacheRe
372c0 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66  port, 0},.#endif
372d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
372e0 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
372f0 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65 72  er", test_libver
37300 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20  sion_number, 0  
37310 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
37320 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
37330 6d 65 74 61 64 61 74 61 22 2c 20 74 65 73 74 5f  metadata", test_
37340 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
37350 61 64 61 74 61 2c 20 30 20 20 7d 2c 0a 23 69 66  adata, 0  },.#if
37360 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
37370 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20 20 20 7b  _INCRBLOB.     {
37380 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72   "sqlite3_blob_r
37390 65 6f 70 65 6e 22 2c 20 74 65 73 74 5f 62 6c 6f  eopen", test_blo
373a0 62 5f 72 65 6f 70 65 6e 2c 20 30 20 20 7d 2c 0a  b_reopen, 0  },.
373b0 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 70  #endif.     { "p
373c0 63 61 63 68 65 5f 73 74 61 74 73 22 2c 20 20 20  cache_stats",   
373d0 20 20 20 20 74 65 73 74 5f 70 63 61 63 68 65 5f      test_pcache_
373e0 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69 66  stats, 0  },.#if
373f0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
37400 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a  E_UNLOCK_NOTIFY.
37410 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37420 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20  unlock_notify", 
37430 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69  test_unlock_noti
37440 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66  fy, 0  },.#endif
37450 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
37460 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22  _wal_checkpoint"
37470 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f 63 68 65  ,   test_wal_che
37480 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20  ckpoint, 0  },. 
37490 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77      { "sqlite3_w
374a0 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32  al_checkpoint_v2
374b0 22 2c 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b  ",test_wal_check
374c0 70 6f 69 6e 74 5f 76 32 2c 20 30 20 20 7d 2c 0a  point_v2, 0  },.
374d0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
374e0 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
374f0 6e 74 22 2c 74 65 73 74 5f 77 61 6c 5f 61 75 74  nt",test_wal_aut
37500 6f 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20  ocheckpoint, 0  
37510 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 73 74 5f  },.     { "test_
37520 73 71 6c 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20  sqlite3_log",   
37530 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74        test_sqlit
37540 65 33 5f 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23 69  e3_log, 0  },.#i
37550 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
37560 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20 7b  T_EXPLAIN.     {
37570 20 22 70 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f   "print_explain_
37580 71 75 65 72 79 5f 70 6c 61 6e 22 2c 20 74 65 73  query_plan", tes
37590 74 5f 70 72 69 6e 74 5f 65 71 70 2c 20 30 20 20  t_print_eqp, 0  
375a0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
375b0 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63   "sqlite3_test_c
375c0 6f 6e 74 72 6f 6c 22 2c 20 74 65 73 74 5f 74 65  ontrol", test_te
375d0 73 74 5f 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 23 69  st_control },.#i
375e0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
375f0 0a 20 20 20 20 20 7b 20 22 67 65 74 72 75 73 61  .     { "getrusa
37600 67 65 22 2c 20 74 65 73 74 5f 67 65 74 72 75 73  ge", test_getrus
37610 61 67 65 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  age },.#endif.  
37620 20 20 20 7b 20 22 6c 6f 61 64 5f 73 74 61 74 69     { "load_stati
37630 63 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74 63  c_extension", tc
37640 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e  lLoadStaticExten
37650 73 69 6f 6e 43 6d 64 20 7d 2c 0a 20 20 20 20 20  sionCmd },.     
37660 7b 20 22 73 6f 72 74 65 72 5f 74 65 73 74 5f 66  { "sorter_test_f
37670 61 6b 65 68 65 61 70 22 2c 20 73 6f 72 74 65 72  akeheap", sorter
37680 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20 7d  _test_fakeheap }
37690 2c 0a 20 20 20 20 20 7b 20 22 73 6f 72 74 65 72  ,.     { "sorter
376a0 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70  _test_sort4_help
376b0 65 72 22 2c 20 73 6f 72 74 65 72 5f 74 65 73 74  er", sorter_test
376c0 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20 7d 2c  _sort4_helper },
376d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
376e0 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
376f0 4f 4e 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ON.     { "sqlit
37700 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69  e3_user_authenti
37710 63 61 74 65 22 2c 20 74 65 73 74 5f 75 73 65 72  cate", test_user
37720 5f 61 75 74 68 65 6e 74 69 63 61 74 65 2c 20 30  _authenticate, 0
37730 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
37740 74 65 33 5f 75 73 65 72 5f 61 64 64 22 2c 20 20  te3_user_add",  
37750 20 20 20 20 20 20 20 20 74 65 73 74 5f 75 73 65          test_use
37760 72 5f 61 64 64 2c 20 20 20 20 20 20 20 20 20 20  r_add,          
37770 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37780 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65  ite3_user_change
37790 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 75 73  ",       test_us
377a0 65 72 5f 63 68 61 6e 67 65 2c 20 20 20 20 20 20  er_change,      
377b0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
377c0 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74  lite3_user_delet
377d0 65 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 75  e",       test_u
377e0 73 65 72 5f 64 65 6c 65 74 65 2c 20 20 20 20 20  ser_delete,     
377f0 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69    0 },.#endif.#i
37800 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
37810 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
37820 55 53 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  US.     { "sqlit
37830 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
37840 75 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  us",       test_
37850 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 2c  stmt_scanstatus,
37860 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
37870 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
37880 6e 73 74 61 74 75 73 5f 72 65 73 65 74 22 2c 20  nstatus_reset", 
37890 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74  test_stmt_scanst
378a0 61 74 75 73 5f 72 65 73 65 74 2c 20 20 20 30 20  atus_reset,   0 
378b0 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  },.#endif.#ifdef
378c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
378d0 51 4c 4c 4f 47 0a 20 20 20 20 20 7b 20 22 73 71  QLLOG.     { "sq
378e0 6c 69 74 65 33 5f 63 6f 6e 66 69 67 5f 73 71 6c  lite3_config_sql
378f0 6c 6f 67 22 2c 20 20 20 20 20 20 20 20 20 74 65  log",         te
37900 73 74 5f 63 6f 6e 66 69 67 5f 73 71 6c 6c 6f 67  st_config_sqllog
37910 2c 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a  ,   0 },.#endif.
37920 20 20 20 20 20 7b 20 22 76 66 73 5f 63 75 72 72       { "vfs_curr
37930 65 6e 74 5f 74 69 6d 65 5f 69 6e 74 36 34 22 2c  ent_time_int64",
37940 20 20 20 20 20 20 20 20 20 20 20 76 66 73 43 75             vfsCu
37950 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 2c 20  rrentTimeInt64, 
37960 20 20 30 20 7d 2c 0a 23 69 66 64 65 66 20 53 51    0 },.#ifdef SQ
37970 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 4e 41 50  LITE_ENABLE_SNAP
37980 53 48 4f 54 0a 20 20 20 20 20 7b 20 22 73 71 6c  SHOT.     { "sql
37990 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65  ite3_snapshot_ge
379a0 74 22 2c 20 74 65 73 74 5f 73 6e 61 70 73 68 6f  t", test_snapsho
379b0 74 5f 67 65 74 2c 20 30 20 7d 2c 0a 20 20 20 20  t_get, 0 },.    
379c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 61 70   { "sqlite3_snap
379d0 73 68 6f 74 5f 6f 70 65 6e 22 2c 20 74 65 73 74  shot_open", test
379e0 5f 73 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 2c 20  _snapshot_open, 
379f0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37a00 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 66 72  ite3_snapshot_fr
37a10 65 65 22 2c 20 74 65 73 74 5f 73 6e 61 70 73 68  ee", test_snapsh
37a20 6f 74 5f 66 72 65 65 2c 20 30 20 7d 2c 0a 20 20  ot_free, 0 },.  
37a30 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e     { "sqlite3_sn
37a40 61 70 73 68 6f 74 5f 63 6d 70 22 2c 20 74 65 73  apshot_cmp", tes
37a50 74 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 2c 20  t_snapshot_cmp, 
37a60 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37a70 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 72 65  ite3_snapshot_re
37a80 63 6f 76 65 72 22 2c 20 74 65 73 74 5f 73 6e 61  cover", test_sna
37a90 70 73 68 6f 74 5f 72 65 63 6f 76 65 72 2c 20 30  pshot_recover, 0
37aa0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
37ab0 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 67 65 74  te3_snapshot_get
37ac0 5f 62 6c 6f 62 22 2c 20 74 65 73 74 5f 73 6e 61  _blob", test_sna
37ad0 70 73 68 6f 74 5f 67 65 74 5f 62 6c 6f 62 2c 20  pshot_get_blob, 
37ae0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
37af0 69 74 65 33 5f 73 6e 61 70 73 68 6f 74 5f 6f 70  ite3_snapshot_op
37b00 65 6e 5f 62 6c 6f 62 22 2c 20 74 65 73 74 5f 73  en_blob", test_s
37b10 6e 61 70 73 68 6f 74 5f 6f 70 65 6e 5f 62 6c 6f  napshot_open_blo
37b20 62 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22  b, 0 },.     { "
37b30 73 71 6c 69 74 65 33 5f 73 6e 61 70 73 68 6f 74  sqlite3_snapshot
37b40 5f 63 6d 70 5f 62 6c 6f 62 22 2c 20 74 65 73 74  _cmp_blob", test
37b50 5f 73 6e 61 70 73 68 6f 74 5f 63 6d 70 5f 62 6c  _snapshot_cmp_bl
37b60 6f 62 2c 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a  ob, 0 },.#endif.
37b70 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37b80 64 65 6c 65 74 65 5f 64 61 74 61 62 61 73 65 22  delete_database"
37b90 2c 20 74 65 73 74 5f 64 65 6c 65 74 65 5f 64 61  , test_delete_da
37ba0 74 61 62 61 73 65 2c 20 20 20 20 30 20 7d 2c 0a  tabase,    0 },.
37bb0 20 20 20 20 20 7b 20 22 61 74 6f 6d 69 63 5f 62       { "atomic_b
37bc0 61 74 63 68 5f 77 72 69 74 65 22 2c 20 20 20 20  atch_write",    
37bd0 20 20 74 65 73 74 5f 61 74 6f 6d 69 63 5f 62 61    test_atomic_ba
37be0 74 63 68 5f 77 72 69 74 65 2c 20 30 20 7d 2c 0a  tch_write, 0 },.
37bf0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
37c00 6d 6d 61 70 5f 77 61 72 6d 22 2c 20 20 20 20 20  mmap_warm",     
37c10 20 20 74 65 73 74 5f 6d 6d 61 70 5f 77 61 72 6d    test_mmap_warm
37c20 2c 20 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ,          0 },.
37c30 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e    };.  static in
37c40 74 20 62 69 74 6d 61 73 6b 5f 73 69 7a 65 20 3d  t bitmask_size =
37c50 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29   sizeof(Bitmask)
37c60 2a 38 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  *8;.  static int
37c70 20 6c 6f 6e 67 64 6f 75 62 6c 65 5f 73 69 7a 65   longdouble_size
37c80 20 3d 20 73 69 7a 65 6f 66 28 4c 4f 4e 47 44 4f   = sizeof(LONGDO
37c90 55 42 4c 45 5f 54 59 50 45 29 3b 0a 20 20 69 6e  UBLE_TYPE);.  in
37ca0 74 20 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  t i;.  extern in
37cb0 74 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63  t sqlite3_sync_c
37cc0 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66 75  ount, sqlite3_fu
37cd0 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20  llsync_count;.  
37ce0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
37cf0 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
37d00 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
37d10 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75  sqlite3_like_cou
37d20 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
37d30 20 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74   sqlite3_xferopt
37d40 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
37d50 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67   int sqlite3_pag
37d60 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b  er_readdb_count;
37d70 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
37d80 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
37d90 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  edb_count;.  ext
37da0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
37db0 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
37dc0 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  nt;.#if SQLITE_O
37dd0 53 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e 20 4c  S_WIN.  extern L
37de0 4f 4e 47 20 76 6f 6c 61 74 69 6c 65 20 73 71 6c  ONG volatile sql
37df0 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b 0a 23 65  ite3_os_type;.#e
37e00 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49  ndif.#ifdef SQLI
37e10 54 45 5f 44 45 42 55 47 0a 20 20 65 78 74 65 72  TE_DEBUG.  exter
37e20 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  n int sqlite3Whe
37e30 72 65 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72  reTrace;.  exter
37e40 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 4f 53 54  n int sqlite3OST
37e50 72 61 63 65 3b 0a 20 20 65 78 74 65 72 6e 20 69  race;.  extern i
37e60 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 54 72 61  nt sqlite3WalTra
37e70 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ce;.#endif.#ifde
37e80 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 23 69  f SQLITE_TEST.#i
37e90 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
37ea0 4c 45 5f 46 54 53 33 0a 20 20 65 78 74 65 72 6e  LE_FTS3.  extern
37eb0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 74 73   int sqlite3_fts
37ec0 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65 6e 74 68  3_enable_parenth
37ed0 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a 23 65 6e  eses;.#endif.#en
37ee0 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  dif..  for(i=0; 
37ef0 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64 29 2f 73  i<sizeof(aCmd)/s
37f00 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d 29 3b 20  izeof(aCmd[0]); 
37f10 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72  i++){.    Tcl_Cr
37f20 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69 6e 74 65  eateCommand(inte
37f30 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a 4e 61 6d  rp, aCmd[i].zNam
37f40 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  e, aCmd[i].xProc
37f50 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 66  , 0, 0);.  }.  f
37f60 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66  or(i=0; i<sizeof
37f70 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a 65 6f 66  (aObjCmd)/sizeof
37f80 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b 20 69 2b  (aObjCmd[0]); i+
37f90 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43 72 65 61  +){.    Tcl_Crea
37fa0 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28 69 6e 74  teObjCommand(int
37fb0 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  erp, aObjCmd[i].
37fc0 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  zName, .        
37fd0 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50 72 6f 63  aObjCmd[i].xProc
37fe0 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 63 6c 69  , aObjCmd[i].cli
37ff0 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a 20 20 7d  entData, 0);.  }
38000 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
38010 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
38020 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c 20 0a 20  earch_count", . 
38030 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
38040 69 74 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e  ite3_search_coun
38050 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
38060 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
38070 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
38080 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c 20 0a 20  found_count", . 
38090 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
380a0 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  ite3_found_count
380b0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
380c0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
380d0 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73  nterp, "sqlite_s
380e0 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20  ort_count", .   
380f0 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
38100 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 2c 20 54  e3_sort_count, T
38110 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
38120 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
38130 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 6d 61 78  rp, "sqlite3_max
38140 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a 20 20 20  _blobsize", .   
38150 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
38160 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 2c  e3_max_blobsize,
38170 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
38180 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
38190 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6c 69  terp, "sqlite_li
381a0 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20  ke_count", .    
381b0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
381c0 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c 20 54