/ Hex Artifact Content
Login

Artifact d9d4d9174e9e320e079e437ddbfd1c7e6cb9e8c0:


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 6e 63 6c  vdbeInt.h".#incl
0280: 75 64 65 20 22 74 63 6c 2e 68 22 0a 23 69 6e 63  ude "tcl.h".#inc
0290: 6c 75 64 65 20 3c 73 74 64 6c 69 62 2e 68 3e 0a  lude <stdlib.h>.
02a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67  #include <string
02b0: 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .h>../*.** This 
02c0: 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  is a copy of the
02d0: 20 66 69 72 73 74 20 70 61 72 74 20 6f 66 20 74   first part of t
02e0: 68 65 20 53 71 6c 69 74 65 44 62 20 73 74 72 75  he SqliteDb stru
02f0: 63 74 75 72 65 20 69 6e 20 0a 2a 2a 20 74 63 6c  cture in .** tcl
0300: 73 71 6c 69 74 65 2e 63 2e 20 20 57 65 20 6e 65  sqlite.c.  We ne
0310: 65 64 20 69 74 20 68 65 72 65 20 73 6f 20 74 68  ed it here so th
0320: 61 74 20 74 68 65 20 67 65 74 5f 73 71 6c 69 74  at the get_sqlit
0330: 65 5f 70 6f 69 6e 74 65 72 20 72 6f 75 74 69 6e  e_pointer routin
0340: 65 0a 2a 2a 20 63 61 6e 20 65 78 74 72 61 63 74  e.** can extract
0350: 20 74 68 65 20 73 71 6c 69 74 65 33 2a 20 70 6f   the sqlite3* po
0360: 69 6e 74 65 72 20 66 72 6f 6d 20 61 6e 20 65 78  inter from an ex
0370: 69 73 74 69 6e 67 20 54 63 6c 20 53 51 4c 69 74  isting Tcl SQLit
0380: 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
0390: 0a 2a 2f 0a 73 74 72 75 63 74 20 53 71 6c 69 74  .*/.struct Sqlit
03a0: 65 44 62 20 7b 0a 20 20 73 71 6c 69 74 65 33 20  eDb {.  sqlite3 
03b0: 2a 64 62 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  *db;.};../*.** C
03c0: 6f 6e 76 65 72 74 20 74 65 78 74 20 67 65 6e 65  onvert text gene
03d0: 72 61 74 65 64 20 62 79 20 74 68 65 20 22 25 70  rated by the "%p
03e0: 22 20 63 6f 6e 76 65 72 73 69 6f 6e 20 66 6f 72  " conversion for
03f0: 6d 61 74 20 62 61 63 6b 20 69 6e 74 6f 0a 2a 2a  mat back into.**
0400: 20 61 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 73   a pointer..*/.s
0410: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 48 65  tatic int testHe
0420: 78 54 6f 49 6e 74 28 69 6e 74 20 68 29 7b 0a 20  xToInt(int h){. 
0430: 20 69 66 28 20 68 3e 3d 27 30 27 20 26 26 20 68   if( h>='0' && h
0440: 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 72 65 74  <='9' ){.    ret
0450: 75 72 6e 20 68 20 2d 20 27 30 27 3b 0a 20 20 7d  urn h - '0';.  }
0460: 65 6c 73 65 20 69 66 28 20 68 3e 3d 27 61 27 20  else if( h>='a' 
0470: 26 26 20 68 3c 3d 27 66 27 20 29 7b 0a 20 20 20  && h<='f' ){.   
0480: 20 72 65 74 75 72 6e 20 68 20 2d 20 27 61 27 20   return h - 'a' 
0490: 2b 20 31 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  + 10;.  }else{. 
04a0: 20 20 20 61 73 73 65 72 74 28 20 68 3e 3d 27 41     assert( h>='A
04b0: 27 20 26 26 20 68 3c 3d 27 46 27 20 29 3b 0a 20  ' && h<='F' );. 
04c0: 20 20 20 72 65 74 75 72 6e 20 68 20 2d 20 27 41     return h - 'A
04d0: 27 20 2b 20 31 30 3b 0a 20 20 7d 0a 7d 0a 76 6f  ' + 10;.  }.}.vo
04e0: 69 64 20 2a 73 71 6c 69 74 65 33 54 65 73 74 54  id *sqlite3TestT
04f0: 65 78 74 54 6f 50 74 72 28 63 6f 6e 73 74 20 63  extToPtr(const c
0500: 68 61 72 20 2a 7a 29 7b 0a 20 20 76 6f 69 64 20  har *z){.  void 
0510: 2a 70 3b 0a 20 20 75 36 34 20 76 3b 0a 20 20 75  *p;.  u64 v;.  u
0520: 33 32 20 76 32 3b 0a 20 20 69 66 28 20 7a 5b 30  32 v2;.  if( z[0
0530: 5d 3d 3d 27 30 27 20 26 26 20 7a 5b 31 5d 3d 3d  ]=='0' && z[1]==
0540: 27 78 27 20 29 7b 0a 20 20 20 20 7a 20 2b 3d 20  'x' ){.    z += 
0550: 32 3b 0a 20 20 7d 0a 20 20 76 20 3d 20 30 3b 0a  2;.  }.  v = 0;.
0560: 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20    while( *z ){. 
0570: 20 20 20 76 20 3d 20 28 76 3c 3c 34 29 20 2b 20     v = (v<<4) + 
0580: 74 65 73 74 48 65 78 54 6f 49 6e 74 28 2a 7a 29  testHexToInt(*z)
0590: 3b 0a 20 20 20 20 7a 2b 2b 3b 0a 20 20 7d 0a 20  ;.    z++;.  }. 
05a0: 20 69 66 28 20 73 69 7a 65 6f 66 28 70 29 3d 3d   if( sizeof(p)==
05b0: 73 69 7a 65 6f 66 28 76 29 20 29 7b 0a 20 20 20  sizeof(v) ){.   
05c0: 20 6d 65 6d 63 70 79 28 26 70 2c 20 26 76 2c 20   memcpy(&p, &v, 
05d0: 73 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 65  sizeof(p));.  }e
05e0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
05f0: 20 73 69 7a 65 6f 66 28 70 29 3d 3d 73 69 7a 65   sizeof(p)==size
0600: 6f 66 28 76 32 29 20 29 3b 0a 20 20 20 20 76 32  of(v2) );.    v2
0610: 20 3d 20 28 75 33 32 29 76 3b 0a 20 20 20 20 6d   = (u32)v;.    m
0620: 65 6d 63 70 79 28 26 70 2c 20 26 76 32 2c 20 73  emcpy(&p, &v2, s
0630: 69 7a 65 6f 66 28 70 29 29 3b 0a 20 20 7d 0a 20  izeof(p));.  }. 
0640: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 0a 2f   return p;.}.../
0650: 2a 0a 2a 2a 20 41 20 54 43 4c 20 63 6f 6d 6d 61  *.** A TCL comma
0660: 6e 64 20 74 68 61 74 20 72 65 74 75 72 6e 73 20  nd that returns 
0670: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74  the address of t
0680: 68 65 20 73 71 6c 69 74 65 2a 20 70 6f 69 6e 74  he sqlite* point
0690: 65 72 0a 2a 2a 20 66 6f 72 20 61 6e 20 73 71 6c  er.** for an sql
06a0: 69 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ite connection i
06b0: 6e 73 74 61 6e 63 65 2e 20 20 42 61 64 20 74 68  nstance.  Bad th
06c0: 69 6e 67 73 20 68 61 70 70 65 6e 20 69 66 20 74  ings happen if t
06d0: 68 65 0a 2a 2a 20 69 6e 70 75 74 20 69 73 20 6e  he.** input is n
06e0: 6f 74 20 61 6e 20 73 71 6c 69 74 65 20 63 6f 6e  ot an sqlite con
06f0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  nection..*/.stat
0700: 69 63 20 69 6e 74 20 67 65 74 5f 73 71 6c 69 74  ic int get_sqlit
0710: 65 5f 70 6f 69 6e 74 65 72 28 0a 20 20 76 6f 69  e_pointer(.  voi
0720: 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
0730: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0740: 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
0750: 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
0760: 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
0770: 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 20 2a  truct SqliteDb *
0780: 70 3b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66 6f  p;.  Tcl_CmdInfo
0790: 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 63 68 61 72   cmdInfo;.  char
07a0: 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 69 66   zBuf[100];.  if
07b0: 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
07c0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
07d0: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
07e0: 76 2c 20 22 53 51 4c 49 54 45 2d 43 4f 4e 4e 45  v, "SQLITE-CONNE
07f0: 43 54 49 4f 4e 22 29 3b 0a 20 20 20 20 72 65 74  CTION");.    ret
0800: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
0810: 20 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65   }.  if( !Tcl_Ge
0820: 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74  tCommandInfo(int
0830: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
0840: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d  ng(objv[1]), &cm
0850: 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63  dInfo) ){.    Tc
0860: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
0870: 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20  nterp, "command 
0880: 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20  not found: ",.  
0890: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74           Tcl_Get
08a0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
08b0: 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
08c0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
08d0: 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 28 73 74 72  ;.  }.  p = (str
08e0: 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63 6d  uct SqliteDb*)cm
08f0: 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44  dInfo.objClientD
0900: 61 74 61 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ata;.  sprintf(z
0910: 42 75 66 2c 20 22 25 70 22 2c 20 70 2d 3e 64 62  Buf, "%p", p->db
0920: 29 3b 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70  );.  if( strncmp
0930: 28 7a 42 75 66 2c 22 30 78 22 2c 32 29 20 29 7b  (zBuf,"0x",2) ){
0940: 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
0950: 66 2c 20 22 30 78 25 70 22 2c 20 70 2d 3e 64 62  f, "0x%p", p->db
0960: 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 41 70 70  );.  }.  Tcl_App
0970: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
0980: 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72 65  , zBuf, 0);.  re
0990: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
09a0: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
09b0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
09c0: 69 74 65 33 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  ite3 object..*/.
09d0: 69 6e 74 20 67 65 74 44 62 50 6f 69 6e 74 65 72  int getDbPointer
09e0: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
09f0: 65 72 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  erp, const char 
0a00: 2a 7a 41 2c 20 73 71 6c 69 74 65 33 20 2a 2a 70  *zA, sqlite3 **p
0a10: 70 44 62 29 7b 0a 20 20 73 74 72 75 63 74 20 53  pDb){.  struct S
0a20: 71 6c 69 74 65 44 62 20 2a 70 3b 0a 20 20 54 63  qliteDb *p;.  Tc
0a30: 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66  l_CmdInfo cmdInf
0a40: 6f 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  o;.  if( Tcl_Get
0a50: 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
0a60: 72 70 2c 20 7a 41 2c 20 26 63 6d 64 49 6e 66 6f  rp, zA, &cmdInfo
0a70: 29 20 29 7b 0a 20 20 20 20 70 20 3d 20 28 73 74  ) ){.    p = (st
0a80: 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a 29 63  ruct SqliteDb*)c
0a90: 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74  mdInfo.objClient
0aa0: 44 61 74 61 3b 0a 20 20 20 20 2a 70 70 44 62 20  Data;.    *ppDb 
0ab0: 3d 20 70 2d 3e 64 62 3b 0a 20 20 7d 65 6c 73 65  = p->db;.  }else
0ac0: 7b 0a 20 20 20 20 2a 70 70 44 62 20 3d 20 28 73  {.    *ppDb = (s
0ad0: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 54  qlite3*)sqlite3T
0ae0: 65 73 74 54 65 78 74 54 6f 50 74 72 28 7a 41 29  estTextToPtr(zA)
0af0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
0b00: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51  CL_OK;.}..#if SQ
0b10: 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
0b20: 2a 20 44 65 63 6f 64 65 20 61 20 57 69 6e 33 32  * Decode a Win32
0b30: 20 48 41 4e 44 4c 45 20 6f 62 6a 65 63 74 2e 0a   HANDLE object..
0b40: 2a 2f 0a 69 6e 74 20 67 65 74 57 69 6e 33 32 48  */.int getWin32H
0b50: 61 6e 64 6c 65 28 54 63 6c 5f 49 6e 74 65 72 70  andle(Tcl_Interp
0b60: 20 2a 69 6e 74 65 72 70 2c 20 63 6f 6e 73 74 20   *interp, const 
0b70: 63 68 61 72 20 2a 7a 41 2c 20 4c 50 48 41 4e 44  char *zA, LPHAND
0b80: 4c 45 20 70 68 46 69 6c 65 29 7b 0a 20 20 2a 70  LE phFile){.  *p
0b90: 68 46 69 6c 65 20 3d 20 28 48 41 4e 44 4c 45 29  hFile = (HANDLE)
0ba0: 73 71 6c 69 74 65 33 54 65 73 74 54 65 78 74 54  sqlite3TestTextT
0bb0: 6f 50 74 72 28 7a 41 29 3b 0a 20 20 72 65 74 75  oPtr(zA);.  retu
0bc0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e  rn TCL_OK;.}.#en
0bd0: 64 69 66 0a 0a 65 78 74 65 72 6e 20 63 6f 6e 73  dif..extern cons
0be0: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
0bf0: 72 72 4e 61 6d 65 28 69 6e 74 29 3b 0a 23 64 65  rrName(int);.#de
0c00: 66 69 6e 65 20 74 31 45 72 72 6f 72 4e 61 6d 65  fine t1ErrorName
0c10: 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 0a   sqlite3ErrName.
0c20: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
0c30: 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 20  n sqlite3_stmt* 
0c40: 69 6e 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 2a  into an sqlite3*
0c50: 2e 20 20 54 68 69 73 20 64 65 70 65 6e 64 73 20  .  This depends 
0c60: 6f 6e 20 74 68 65 0a 2a 2a 20 66 61 63 74 20 74  on the.** fact t
0c70: 68 61 74 20 74 68 65 20 73 71 6c 69 74 65 33 2a  hat the sqlite3*
0c80: 20 69 73 20 74 68 65 20 66 69 72 73 74 20 66 69   is the first fi
0c90: 65 6c 64 20 69 6e 20 74 68 65 20 56 64 62 65 20  eld in the Vdbe 
0ca0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 23 64  structure..*/.#d
0cb0: 65 66 69 6e 65 20 53 74 6d 74 54 6f 44 62 28 58  efine StmtToDb(X
0cc0: 29 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 68  )   sqlite3_db_h
0cd0: 61 6e 64 6c 65 28 58 29 0a 0a 2f 2a 0a 2a 2a 20  andle(X)../*.** 
0ce0: 43 68 65 63 6b 20 61 20 72 65 74 75 72 6e 20 76  Check a return v
0cf0: 61 6c 75 65 20 74 6f 20 6d 61 6b 65 20 73 75 72  alue to make sur
0d00: 65 20 69 74 20 61 67 72 65 65 73 20 77 69 74 68  e it agrees with
0d10: 20 74 68 65 20 72 65 73 75 6c 74 73 0a 2a 2a 20   the results.** 
0d20: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 72 72  from sqlite3_err
0d30: 63 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  code..*/.int sql
0d40: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
0d50: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
0d60: 72 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  rp, sqlite3 *db,
0d70: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 66 28 20   int rc){.  if( 
0d80: 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64 73 61  sqlite3_threadsa
0d90: 66 65 28 29 3d 3d 30 20 26 26 20 72 63 21 3d 53  fe()==0 && rc!=S
0da0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 26 26 20  QLITE_MISUSE && 
0db0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  rc!=SQLITE_OK.  
0dc0: 20 26 26 20 73 71 6c 69 74 65 33 5f 65 72 72 63   && sqlite3_errc
0dd0: 6f 64 65 28 64 62 29 21 3d 72 63 20 29 7b 0a 20  ode(db)!=rc ){. 
0de0: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30     char zBuf[200
0df0: 5d 3b 0a 20 20 20 20 69 6e 74 20 72 32 20 3d 20  ];.    int r2 = 
0e00: 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
0e10: 64 62 29 3b 0a 20 20 20 20 73 70 72 69 6e 74 66  db);.    sprintf
0e20: 28 7a 42 75 66 2c 20 22 65 72 72 6f 72 20 63 6f  (zBuf, "error co
0e30: 64 65 20 25 73 20 28 25 64 29 20 64 6f 65 73 20  de %s (%d) does 
0e40: 6e 6f 74 20 6d 61 74 63 68 20 73 71 6c 69 74 65  not match sqlite
0e50: 33 5f 65 72 72 63 6f 64 65 20 25 73 20 28 25 64  3_errcode %s (%d
0e60: 29 22 2c 0a 20 20 20 20 20 20 20 74 31 45 72 72  )",.       t1Err
0e70: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 72 63 2c 20  orName(rc), rc, 
0e80: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 32 29 2c  t1ErrorName(r2),
0e90: 20 72 32 29 3b 0a 20 20 20 20 54 63 6c 5f 52 65   r2);.    Tcl_Re
0ea0: 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
0eb0: 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
0ec0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
0ed0: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 20 20 72 65  zBuf, 0);.    re
0ee0: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
0ef0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
0f00: 20 44 65 63 6f 64 65 20 61 20 70 6f 69 6e 74 65   Decode a pointe
0f10: 72 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f  r to an sqlite3_
0f20: 73 74 6d 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f 0a  stmt object..*/.
0f30: 73 74 61 74 69 63 20 69 6e 74 20 67 65 74 53 74  static int getSt
0f40: 6d 74 50 6f 69 6e 74 65 72 28 0a 20 20 54 63 6c  mtPointer(.  Tcl
0f50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
0f60: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
0f70: 7a 41 72 67 2c 20 20 0a 20 20 73 71 6c 69 74 65  zArg,  .  sqlite
0f80: 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a  3_stmt **ppStmt.
0f90: 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 28  ){.  *ppStmt = (
0fa0: 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 73 71  sqlite3_stmt*)sq
0fb0: 6c 69 74 65 33 54 65 73 74 54 65 78 74 54 6f 50  lite3TestTextToP
0fc0: 74 72 28 7a 41 72 67 29 3b 0a 20 20 72 65 74 75  tr(zArg);.  retu
0fd0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
0fe0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 20 74  .** Generate a t
0ff0: 65 78 74 20 72 65 70 72 65 73 65 6e 74 61 74 69  ext representati
1000: 6f 6e 20 6f 66 20 61 20 70 6f 69 6e 74 65 72 20  on of a pointer 
1010: 74 68 61 74 20 63 61 6e 20 62 65 20 75 6e 64 65  that can be unde
1020: 72 73 74 6f 6f 64 0a 2a 2a 20 62 79 20 74 68 65  rstood.** by the
1030: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 20 61 6e   getDbPointer an
1040: 64 20 67 65 74 56 6d 50 6f 69 6e 74 65 72 20 72  d getVmPointer r
1050: 6f 75 74 69 6e 65 73 20 61 62 6f 76 65 2e 0a 2a  outines above..*
1060: 2a 0a 2a 2a 20 54 68 65 20 70 72 6f 62 6c 65 6d  *.** The problem
1070: 20 69 73 2c 20 6f 6e 20 73 6f 6d 65 20 6d 61 63   is, on some mac
1080: 68 69 6e 65 73 20 28 53 6f 6c 61 72 69 73 29 20  hines (Solaris) 
1090: 69 66 20 79 6f 75 20 64 6f 20 61 20 70 72 69 6e  if you do a prin
10a0: 74 66 20 77 69 74 68 0a 2a 2a 20 22 25 70 22 20  tf with.** "%p" 
10b0: 79 6f 75 20 63 61 6e 6e 6f 74 20 74 75 72 6e 20  you cannot turn 
10c0: 61 72 6f 75 6e 64 20 61 6e 64 20 64 6f 20 61 20  around and do a 
10d0: 73 63 61 6e 66 20 77 69 74 68 20 74 68 65 20 73  scanf with the s
10e0: 61 6d 65 20 22 25 70 22 20 61 6e 64 0a 2a 2a 20  ame "%p" and.** 
10f0: 67 65 74 20 79 6f 75 72 20 70 6f 69 6e 74 65 72  get your pointer
1100: 20 62 61 63 6b 2e 20 20 59 6f 75 20 68 61 76 65   back.  You have
1110: 20 74 6f 20 70 72 65 70 65 6e 64 20 61 20 22 30   to prepend a "0
1120: 78 22 20 62 65 66 6f 72 65 20 69 74 20 77 69 6c  x" before it wil
1130: 6c 0a 2a 2a 20 77 6f 72 6b 2e 20 20 4f 72 20 61  l.** work.  Or a
1140: 74 20 6c 65 61 73 74 20 74 68 61 74 20 69 73 20  t least that is 
1150: 77 68 61 74 20 69 73 20 72 65 70 6f 72 74 65 64  what is reported
1160: 20 74 6f 20 6d 65 20 28 64 72 68 29 2e 20 20 42   to me (drh).  B
1170: 75 74 20 74 68 69 73 0a 2a 2a 20 62 65 68 61 76  ut this.** behav
1180: 69 6f 72 20 76 61 72 69 65 73 20 66 72 6f 6d 20  ior varies from 
1190: 6d 61 63 68 69 6e 65 20 74 6f 20 6d 61 63 68 69  machine to machi
11a0: 6e 65 2e 20 20 54 68 65 20 73 6f 6c 75 74 69 6f  ne.  The solutio
11b0: 6e 20 75 73 65 64 20 68 65 72 20 69 73 0a 2a 2a  n used her is.**
11c0: 20 74 6f 20 74 65 73 74 20 74 68 65 20 73 74 72   to test the str
11d0: 69 6e 67 20 72 69 67 68 74 20 61 66 74 65 72 20  ing right after 
11e0: 69 74 20 69 73 20 67 65 6e 65 72 61 74 65 64 20  it is generated 
11f0: 74 6f 20 73 65 65 20 69 66 20 69 74 20 63 61 6e  to see if it can
1200: 20 62 65 0a 2a 2a 20 75 6e 64 65 72 73 74 6f 6f   be.** understoo
1210: 64 20 62 79 20 73 63 61 6e 66 2c 20 61 6e 64 20  d by scanf, and 
1220: 69 66 20 6e 6f 74 2c 20 74 72 79 20 70 72 65 70  if not, try prep
1230: 65 6e 64 69 6e 67 20 61 6e 20 22 30 78 22 20 74  ending an "0x" t
1240: 6f 20 73 65 65 20 69 66 0a 2a 2a 20 74 68 61 74  o see if.** that
1250: 20 68 65 6c 70 73 2e 20 20 49 66 20 6e 6f 74 68   helps.  If noth
1260: 69 6e 67 20 77 6f 72 6b 73 2c 20 61 20 66 61 74  ing works, a fat
1270: 61 6c 20 65 72 72 6f 72 20 69 73 20 67 65 6e 65  al error is gene
1280: 72 61 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rated..*/.int sq
1290: 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
12a0: 6e 74 65 72 53 74 72 28 54 63 6c 5f 49 6e 74 65  nterStr(Tcl_Inte
12b0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 63 68 61 72  rp *interp, char
12c0: 20 2a 7a 50 74 72 2c 20 76 6f 69 64 20 2a 70 29   *zPtr, void *p)
12d0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  {.  sqlite3_snpr
12e0: 69 6e 74 66 28 31 30 30 2c 20 7a 50 74 72 2c 20  intf(100, zPtr, 
12f0: 22 25 70 22 2c 20 70 29 3b 0a 20 20 72 65 74 75  "%p", p);.  retu
1300: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1310: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
1320: 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 73 71 6c   routine for sql
1330: 69 74 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66  ite3_exec_printf
1340: 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ()..*/.static in
1350: 74 20 65 78 65 63 5f 70 72 69 6e 74 66 5f 63 62  t exec_printf_cb
1360: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
1370: 20 61 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72   argc, char **ar
1380: 67 76 2c 20 63 68 61 72 20 2a 2a 6e 61 6d 65 29  gv, char **name)
1390: 7b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20  {.  Tcl_DString 
13a0: 2a 73 74 72 20 3d 20 28 54 63 6c 5f 44 53 74 72  *str = (Tcl_DStr
13b0: 69 6e 67 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74  ing*)pArg;.  int
13c0: 20 69 3b 0a 0a 20 20 69 66 28 20 54 63 6c 5f 44   i;..  if( Tcl_D
13d0: 53 74 72 69 6e 67 4c 65 6e 67 74 68 28 73 74 72  StringLength(str
13e0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28  )==0 ){.    for(
13f0: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
1400: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 44 53 74  ){.      Tcl_DSt
1410: 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d 65 6e  ringAppendElemen
1420: 74 28 73 74 72 2c 20 6e 61 6d 65 5b 69 5d 20 3f  t(str, name[i] ?
1430: 20 6e 61 6d 65 5b 69 5d 20 3a 20 22 4e 55 4c 4c   name[i] : "NULL
1440: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ");.    }.  }.  
1450: 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b  for(i=0; i<argc;
1460: 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 44   i++){.    Tcl_D
1470: 53 74 72 69 6e 67 41 70 70 65 6e 64 45 6c 65 6d  StringAppendElem
1480: 65 6e 74 28 73 74 72 2c 20 61 72 67 76 5b 69 5d  ent(str, argv[i]
1490: 20 3f 20 61 72 67 76 5b 69 5d 20 3a 20 22 4e 55   ? argv[i] : "NU
14a0: 4c 4c 22 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  LL");.  }.  retu
14b0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
14c0: 68 65 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 63  he I/O tracing c
14d0: 61 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 23 69 66 20  allback..*/.#if 
14e0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
14f0: 4f 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64  OMIT_TRACE) && d
1500: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
1510: 41 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 73 74  ABLE_IOTRACE).st
1520: 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61  atic FILE *iotra
1530: 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 73 74 61  ce_file = 0;.sta
1540: 74 69 63 20 76 6f 69 64 20 69 6f 5f 74 72 61 63  tic void io_trac
1550: 65 5f 63 61 6c 6c 62 61 63 6b 28 63 6f 6e 73 74  e_callback(const
1560: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
1570: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
1580: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
1590: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 76  p, zFormat);.  v
15a0: 66 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 5f  fprintf(iotrace_
15b0: 66 69 6c 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  file, zFormat, a
15c0: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29  p);.  va_end(ap)
15d0: 3b 0a 20 20 66 66 6c 75 73 68 28 69 6f 74 72 61  ;.  fflush(iotra
15e0: 63 65 5f 66 69 6c 65 29 3b 0a 7d 0a 23 65 6e 64  ce_file);.}.#end
15f0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  if../*.** Usage:
1600: 20 20 69 6f 5f 74 72 61 63 65 20 46 49 4c 45 4e    io_trace FILEN
1610: 41 4d 45 0a 2a 2a 0a 2a 2a 20 54 75 72 6e 20 49  AME.**.** Turn I
1620: 2f 4f 20 74 72 61 63 69 6e 67 20 6f 6e 20 6f 72  /O tracing on or
1630: 20 6f 66 66 2e 20 20 49 66 20 46 49 4c 45 4e 41   off.  If FILENA
1640: 4d 45 20 69 73 20 6e 6f 74 20 61 6e 20 65 6d 70  ME is not an emp
1650: 74 79 20 73 74 72 69 6e 67 2c 0a 2a 2a 20 49 2f  ty string,.** I/
1660: 4f 20 74 72 61 63 69 6e 67 20 62 65 67 69 6e 73  O tracing begins
1670: 20 67 6f 69 6e 67 20 69 6e 74 6f 20 46 49 4c 45   going into FILE
1680: 4e 41 4d 45 2e 20 49 66 20 46 49 4c 45 4e 41 4d  NAME. If FILENAM
1690: 45 20 69 73 20 61 6e 20 65 6d 70 74 79 0a 2a 2a  E is an empty.**
16a0: 20 73 74 72 69 6e 67 2c 20 49 2f 4f 20 74 72 61   string, I/O tra
16b0: 63 69 6e 67 20 69 73 20 74 75 72 6e 65 64 20 6f  cing is turned o
16c0: 66 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ff..*/.static in
16d0: 74 20 74 65 73 74 5f 69 6f 5f 74 72 61 63 65 28  t test_io_trace(
16e0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
16f0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1700: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
1710: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
1720: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
1730: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
1740: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
1750: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
1760: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
1770: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
1780: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
1790: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
17a0: 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 20 21 64  ent */.){.#if !d
17b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
17c0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
17d0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
17e0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 20 20 69 66  LE_IOTRACE).  if
17f0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
1800: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1810: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1820: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1830: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
1840: 0a 20 20 20 20 20 20 20 20 20 20 22 20 46 49 4c  .          " FIL
1850: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
1860: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1870: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 69 6f  OR;.  }.  if( io
1880: 74 72 61 63 65 5f 66 69 6c 65 20 29 7b 0a 20 20  trace_file ){.  
1890: 20 20 69 66 28 20 69 6f 74 72 61 63 65 5f 66 69    if( iotrace_fi
18a0: 6c 65 21 3d 73 74 64 6f 75 74 20 26 26 20 69 6f  le!=stdout && io
18b0: 74 72 61 63 65 5f 66 69 6c 65 21 3d 73 74 64 65  trace_file!=stde
18c0: 72 72 20 29 7b 0a 20 20 20 20 20 20 66 63 6c 6f  rr ){.      fclo
18d0: 73 65 28 69 6f 74 72 61 63 65 5f 66 69 6c 65 29  se(iotrace_file)
18e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6f 74 72  ;.    }.    iotr
18f0: 61 63 65 5f 66 69 6c 65 20 3d 20 30 3b 0a 20 20  ace_file = 0;.  
1900: 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
1910: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
1920: 61 72 67 76 5b 31 5d 5b 30 5d 20 29 7b 0a 20 20  argv[1][0] ){.  
1930: 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67    if( strcmp(arg
1940: 76 5b 31 5d 2c 22 73 74 64 6f 75 74 22 29 3d 3d  v[1],"stdout")==
1950: 30 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  0 ){.      iotra
1960: 63 65 5f 66 69 6c 65 20 3d 20 73 74 64 6f 75 74  ce_file = stdout
1970: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
1980: 73 74 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22  strcmp(argv[1],"
1990: 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20  stderr")==0 ){. 
19a0: 20 20 20 20 20 69 6f 74 72 61 63 65 5f 66 69 6c       iotrace_fil
19b0: 65 20 3d 20 73 74 64 65 72 72 3b 0a 20 20 20 20  e = stderr;.    
19c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74  }else{.      iot
19d0: 72 61 63 65 5f 66 69 6c 65 20 3d 20 66 6f 70 65  race_file = fope
19e0: 6e 28 61 72 67 76 5b 31 5d 2c 20 22 77 22 29 3b  n(argv[1], "w");
19f0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
1a00: 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 5f 74  e3IoTrace = io_t
1a10: 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 3b 0a 20  race_callback;. 
1a20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75   }.#endif.  retu
1a30: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1a40: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 63 6c 61 6e  .** Usage:  clan
1a50: 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
1a60: 73 73 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ss .**.** Return
1a70: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 70 72  s true if the pr
1a80: 6f 67 72 61 6d 20 77 61 73 20 63 6f 6d 70 69 6c  ogram was compil
1a90: 65 64 20 75 73 69 6e 67 20 63 6c 61 6e 67 20 77  ed using clang w
1aa0: 69 74 68 20 74 68 65 20 0a 2a 2a 20 2d 66 73 61  ith the .** -fsa
1ab0: 6e 69 74 69 7a 65 3d 61 64 64 72 65 73 73 20 73  nitize=address s
1ac0: 77 69 74 63 68 20 6f 6e 20 74 68 65 20 63 6f 6d  witch on the com
1ad0: 6d 61 6e 64 20 6c 69 6e 65 2e 20 46 61 6c 73 65  mand line. False
1ae0: 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73   otherwise..*/.s
1af0: 74 61 74 69 63 20 69 6e 74 20 63 6c 61 6e 67 5f  tatic int clang_
1b00: 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65 73 73  sanitize_address
1b10: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
1b20: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
1b30: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
1b40: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
1b50: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
1b60: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
1b70: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
1b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
1b90: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
1ba0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
1bb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
1bc0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
1bd0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
1be0: 20 72 65 73 20 3d 20 30 3b 0a 23 69 66 20 64 65   res = 0;.#if de
1bf0: 66 69 6e 65 64 28 5f 5f 68 61 73 5f 66 65 61 74  fined(__has_feat
1c00: 75 72 65 29 0a 23 20 69 66 20 5f 5f 68 61 73 5f  ure).# if __has_
1c10: 66 65 61 74 75 72 65 28 61 64 64 72 65 73 73 5f  feature(address_
1c20: 73 61 6e 69 74 69 7a 65 72 29 0a 20 20 72 65 73  sanitizer).  res
1c30: 20 3d 20 31 3b 0a 23 20 65 6e 64 69 66 0a 23 65   = 1;.# endif.#e
1c40: 6e 64 69 66 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ndif.  Tcl_SetOb
1c50: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
1c60: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 65  Tcl_NewIntObj(re
1c70: 73 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  s));.  return TC
1c80: 4c 5f 4f 4b 3b 0a 7d 0a 20 20 0a 2f 2a 0a 2a 2a  L_OK;.}.  ./*.**
1c90: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
1ca0: 5f 65 78 65 63 5f 70 72 69 6e 74 66 20 20 44 42  _exec_printf  DB
1cb0: 20 20 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47    FORMAT  STRING
1cc0: 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  .**.** Invoke th
1cd0: 65 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  e sqlite3_exec_p
1ce0: 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66 61 63  rintf() interfac
1cf0: 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70 65 6e  e using the open
1d00: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44 42 2e   database.** DB.
1d10: 20 20 54 68 65 20 53 51 4c 20 69 73 20 74 68 65    The SQL is the
1d20: 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54 2e 20   string FORMAT. 
1d30: 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69   The format stri
1d40: 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  ng should contai
1d50: 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72 20 25  n.** one %s or %
1d60: 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20 74 68  q.  STRING is th
1d70: 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74 65 64  e value inserted
1d80: 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71 2e 0a   into %s or %q..
1d90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1da0: 73 74 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  st_exec_printf(.
1db0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
1dc0: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1dd0: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
1de0: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
1df0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
1e00: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
1e10: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
1e20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
1e30: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
1e40: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
1e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
1e60: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
1e70: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
1e80: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
1e90: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
1ea0: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
1eb0: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
1ec0: 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  Sql;.  char zBuf
1ed0: 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61 72 67 63  [30];.  if( argc
1ee0: 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=4 ){.    Tcl_A
1ef0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1f00: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1f10: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1f20: 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1f30: 20 20 20 22 20 44 42 20 46 4f 52 4d 41 54 20 53     " DB FORMAT S
1f40: 54 52 49 4e 47 22 2c 20 30 29 3b 0a 20 20 20 20  TRING", 0);.    
1f50: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1f60: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1f70: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1f80: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1f90: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1fa0: 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  R;.  Tcl_DString
1fb0: 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20 7a 53  Init(&str);.  zS
1fc0: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
1fd0: 69 6e 74 66 28 61 72 67 76 5b 32 5d 2c 20 61 72  intf(argv[2], ar
1fe0: 67 76 5b 33 5d 29 3b 0a 20 20 72 63 20 3d 20 73  gv[3]);.  rc = s
1ff0: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2000: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2010: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2020: 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
2030: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72 69  ee(zSql);.  spri
2040: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
2050: 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rc);.  Tcl_Appen
2060: 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
2070: 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41 70   zBuf);.  Tcl_Ap
2080: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
2090: 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rp, rc==SQLITE_O
20a0: 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67 56  K ? Tcl_DStringV
20b0: 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45 72  alue(&str) : zEr
20c0: 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e  r);.  Tcl_DStrin
20d0: 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20 69  gFree(&str);.  i
20e0: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
20f0: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
2100: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
2110: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
2120: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
2130: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
2140: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
2150: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
2160: 69 74 65 33 5f 65 78 65 63 5f 68 65 78 20 20 44  ite3_exec_hex  D
2170: 42 20 20 48 45 58 0a 2a 2a 0a 2a 2a 20 49 6e 76  B  HEX.**.** Inv
2180: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
2190: 65 78 65 63 28 29 20 6f 6e 20 61 20 73 74 72 69  exec() on a stri
21a0: 6e 67 20 74 68 61 74 20 69 73 20 6f 62 74 61 69  ng that is obtai
21b0: 6e 65 64 20 62 79 20 74 72 61 6e 73 6c 61 74 69  ned by translati
21c0: 6e 67 0a 2a 2a 20 48 45 58 20 69 6e 74 6f 20 41  ng.** HEX into A
21d0: 53 43 49 49 2e 20 20 4d 6f 73 74 20 63 68 61 72  SCII.  Most char
21e0: 61 63 74 65 72 73 20 61 72 65 20 74 72 61 6e 73  acters are trans
21f0: 6c 61 74 65 64 20 61 73 20 69 73 2e 20 20 25 48  lated as is.  %H
2200: 48 20 62 65 63 6f 6d 65 73 0a 2a 2a 20 61 20 68  H becomes.** a h
2210: 65 78 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  ex character..*/
2220: 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2230: 5f 65 78 65 63 5f 68 65 78 28 0a 20 20 76 6f 69  _exec_hex(.  voi
2240: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2250: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2260: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2270: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2280: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2290: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
22a0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
22b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
22c0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
22d0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
22e0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
22f0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
2300: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
2310: 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67  b;.  Tcl_DString
2320: 20 73 74 72 3b 0a 20 20 69 6e 74 20 72 63 2c 20   str;.  int rc, 
2330: 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 2a 7a 45  i, j;.  char *zE
2340: 72 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rr = 0;.  char *
2350: 7a 48 65 78 3b 0a 20 20 63 68 61 72 20 7a 53 71  zHex;.  char zSq
2360: 6c 5b 35 30 30 5d 3b 0a 20 20 63 68 61 72 20 7a  l[500];.  char z
2370: 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28 20 61  Buf[30];.  if( a
2380: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
2390: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
23a0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
23b0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
23c0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
23d0: 20 20 20 20 20 20 22 20 44 42 20 48 45 58 22 2c        " DB HEX",
23e0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
23f0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
2400: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
2410: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
2420: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
2430: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 48   TCL_ERROR;.  zH
2440: 65 78 20 3d 20 61 72 67 76 5b 32 5d 3b 0a 20 20  ex = argv[2];.  
2450: 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 73 69 7a  for(i=j=0; i<siz
2460: 65 6f 66 28 7a 53 71 6c 29 20 26 26 20 7a 48 65  eof(zSql) && zHe
2470: 78 5b 6a 5d 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b  x[j]; i++, j++){
2480: 0a 20 20 20 20 69 66 28 20 7a 48 65 78 5b 6a 5d  .    if( zHex[j]
2490: 3d 3d 27 25 27 20 26 26 20 7a 48 65 78 5b 6a 2b  =='%' && zHex[j+
24a0: 32 5d 20 26 26 20 7a 48 65 78 5b 6a 2b 32 5d 20  2] && zHex[j+2] 
24b0: 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69 5d  ){.      zSql[i]
24c0: 20 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74   = (testHexToInt
24d0: 28 7a 48 65 78 5b 6a 2b 31 5d 29 3c 3c 34 29 20  (zHex[j+1])<<4) 
24e0: 2b 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a  + testHexToInt(z
24f0: 48 65 78 5b 6a 2b 32 5d 29 3b 0a 20 20 20 20 20  Hex[j+2]);.     
2500: 20 6a 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 65 6c   j += 2;.    }el
2510: 73 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 69  se{.      zSql[i
2520: 5d 20 3d 20 7a 48 65 78 5b 6a 5d 3b 0a 20 20 20  ] = zHex[j];.   
2530: 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c 5b 69 5d   }.  }.  zSql[i]
2540: 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 44 53 74 72   = 0;.  Tcl_DStr
2550: 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20  ingInit(&str);. 
2560: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2570: 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78 65  ec(db, zSql, exe
2580: 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73 74  c_printf_cb, &st
2590: 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 70 72  r, &zErr);.  spr
25a0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
25b0: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
25c0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
25d0: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
25e0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
25f0: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2600: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2610: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2620: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2630: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2640: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
2650: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2660: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
2670: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
2680: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
2690: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
26a0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
26b0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 64 62  /*.** Usage:  db
26c0: 5f 65 6e 74 65 72 20 44 42 0a 2a 2a 20 20 20 20  _enter DB.**    
26d0: 20 20 20 20 20 64 62 5f 6c 65 61 76 65 20 44 42       db_leave DB
26e0: 0a 2a 2a 0a 2a 2a 20 45 6e 74 65 72 20 6f 72 20  .**.** Enter or 
26f0: 6c 65 61 76 65 20 74 68 65 20 6d 75 74 65 78 20  leave the mutex 
2700: 6f 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  on a database co
2710: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  nnection..*/.sta
2720: 74 69 63 20 69 6e 74 20 64 62 5f 65 6e 74 65 72  tic int db_enter
2730: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
2740: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
2750: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
2760: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
2770: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
2780: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
2790: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
27a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
27b0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
27c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
27d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
27e0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
27f0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
2800: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
2810: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
2820: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
2830: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
2840: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
2850: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
2860: 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30 29         " DB", 0)
2870: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
2880: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
2890: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
28a0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
28b0: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
28c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
28d0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
28e0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
28f0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 73 74  urn TCL_OK;.}.st
2900: 61 74 69 63 20 69 6e 74 20 64 62 5f 6c 65 61 76  atic int db_leav
2910: 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  e(.  void *NotUs
2920: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
2930: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2940: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2950: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2960: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2970: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
2980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2990: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
29a0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
29b0: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
29c0: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
29d0: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71  ument */.){.  sq
29e0: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28  lite3 *db;.  if(
29f0: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
2a00: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
2a10: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
2a20: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
2a30: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
2a40: 0a 20 20 20 20 20 20 20 22 20 44 42 22 2c 20 30  .       " DB", 0
2a50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2a60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2a70: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2a80: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
2a90: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
2aa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69  CL_ERROR;.  sqli
2ab0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2ac0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
2ad0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2ae0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2af0: 6c 69 74 65 33 5f 65 78 65 63 20 20 44 42 20 20  lite3_exec  DB  
2b00: 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  SQL.**.** Invoke
2b10: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 65 78 65   the sqlite3_exe
2b20: 63 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e  c interface usin
2b30: 67 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62  g the open datab
2b40: 61 73 65 20 44 42 0a 2a 2f 0a 73 74 61 74 69 63  ase DB.*/.static
2b50: 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 28 0a   int test_exec(.
2b60: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
2b70: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
2b80: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
2b90: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
2ba0: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
2bb0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
2bc0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
2bd0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2be0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
2bf0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
2c00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
2c10: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
2c20: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
2c30: 65 33 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53  e3 *db;.  Tcl_DS
2c40: 74 72 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74  tring str;.  int
2c50: 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
2c60: 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  r = 0;.  char *z
2c70: 53 71 6c 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  Sql;.  int i, j;
2c80: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
2c90: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
2ca0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2cb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2cc0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
2cd0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
2ce0: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
2cf0: 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20 20   DB SQL", 0);.  
2d00: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2d10: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2d20: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2d30: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2d40: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2d50: 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  ROR;.  Tcl_DStri
2d60: 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a 20 20  ngInit(&str);.  
2d70: 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2d80: 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 72 67  printf("%s", arg
2d90: 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 6a  v[2]);.  for(i=j
2da0: 3d 30 3b 20 7a 53 71 6c 5b 69 5d 3b 29 7b 0a 20  =0; zSql[i];){. 
2db0: 20 20 20 69 66 28 20 7a 53 71 6c 5b 69 5d 3d 3d     if( zSql[i]==
2dc0: 27 25 27 20 29 7b 0a 20 20 20 20 20 20 7a 53 71  '%' ){.      zSq
2dd0: 6c 5b 6a 2b 2b 5d 20 3d 20 28 74 65 73 74 48 65  l[j++] = (testHe
2de0: 78 54 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 31 5d  xToInt(zSql[i+1]
2df0: 29 3c 3c 34 29 20 2b 20 74 65 73 74 48 65 78 54  )<<4) + testHexT
2e00: 6f 49 6e 74 28 7a 53 71 6c 5b 69 2b 32 5d 29 3b  oInt(zSql[i+2]);
2e10: 0a 20 20 20 20 20 20 69 20 2b 3d 20 33 3b 0a 20  .      i += 3;. 
2e20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2e30: 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 7a 53 71 6c  zSql[j++] = zSql
2e40: 5b 69 2b 2b 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d  [i++];.    }.  }
2e50: 0a 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a  .  zSql[j] = 0;.
2e60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
2e70: 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65 78  xec(db, zSql, ex
2e80: 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26 73  ec_printf_cb, &s
2e90: 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73 71  tr, &zErr);.  sq
2ea0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2eb0: 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66  ;.  sprintf(zBuf
2ec0: 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20 54  , "%d", rc);.  T
2ed0: 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  cl_AppendElement
2ee0: 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a  (interp, zBuf);.
2ef0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
2f00: 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d 3d  ent(interp, rc==
2f10: 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c 5f  SQLITE_OK ? Tcl_
2f20: 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73 74  DStringValue(&st
2f30: 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54 63  r) : zErr);.  Tc
2f40: 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26 73  l_DStringFree(&s
2f50: 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 20  tr);.  if( zErr 
2f60: 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a  ) sqlite3_free(z
2f70: 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  Err);.  if( sqli
2f80: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
2f90: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
2fa0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2fb0: 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
2fc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
2fd0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  ge:  sqlite3_exe
2fe0: 63 5f 6e 72 20 20 44 42 20 20 53 51 4c 0a 2a 2a  c_nr  DB  SQL.**
2ff0: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3000: 71 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65  qlite3_exec inte
3010: 72 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20  rface using the 
3020: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42  open database DB
3030: 2e 20 20 44 69 73 63 61 72 64 0a 2a 2a 20 61 6c  .  Discard.** al
3040: 6c 20 72 65 73 75 6c 74 73 0a 2a 2f 0a 73 74 61  l results.*/.sta
3050: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65  tic int test_exe
3060: 63 5f 6e 72 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  c_nr(.  void *No
3070: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
3080: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
3090: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
30a0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
30b0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
30c0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
30e0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
30f0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
3100: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
3110: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
3120: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
3130: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
3140: 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
3150: 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  zErr = 0;.  if( 
3160: 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  argc!=3 ){.    T
3170: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
3180: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
3190: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
31a0: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a   \"", argv[0], .
31b0: 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c 22         " DB SQL"
31c0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
31d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
31e0: 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
31f0: 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  er(interp, argv[
3200: 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  1], &db) ) retur
3210: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
3220: 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
3230: 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c 20 30 2c  (db, argv[2], 0,
3240: 20 30 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66   0, &zErr);.  if
3250: 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
3260: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c  Code(interp, db,
3270: 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43   rc) ) return TC
3280: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72  L_ERROR;.  retur
3290: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
32a0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
32b0: 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f 74 65 73  e3_mprintf_z_tes
32c0: 74 20 20 53 45 50 41 52 41 54 4f 52 20 20 41 52  t  SEPARATOR  AR
32d0: 47 30 20 20 41 52 47 31 20 2e 2e 2e 0a 2a 2a 0a  G0  ARG1 ....**.
32e0: 2a 2a 20 54 65 73 74 20 74 68 65 20 25 7a 20 66  ** Test the %z f
32f0: 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f  ormat of sqlite_
3300: 6d 70 72 69 6e 74 66 28 29 2e 20 20 55 73 65 20  mprintf().  Use 
3310: 6d 75 6c 74 69 70 6c 65 20 6d 70 72 69 6e 74 66  multiple mprintf
3320: 28 29 20 63 61 6c 6c 73 20 74 6f 20 0a 2a 2a 20  () calls to .** 
3330: 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 72 67 30  concatenate arg0
3340: 20 74 68 72 6f 75 67 68 20 61 72 67 6e 20 75 73   through argn us
3350: 69 6e 67 20 73 65 70 61 72 61 74 6f 72 20 61 73  ing separator as
3360: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2e 0a   the separator..
3370: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 72 65  ** Return the re
3380: 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sult..*/.static 
3390: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
33a0: 5f 7a 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _z(.  void *NotU
33b0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
33c0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
33d0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
33e0: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
33f0: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3400: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3410: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3420: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3430: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3440: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3450: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
3460: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
3470: 68 61 72 20 2a 7a 52 65 73 75 6c 74 20 3d 20 30  har *zResult = 0
3480: 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 66 6f  ;.  int i;..  fo
3490: 72 28 69 3d 32 3b 20 69 3c 61 72 67 63 20 26 26  r(i=2; i<argc &&
34a0: 20 28 69 3d 3d 32 20 7c 7c 20 7a 52 65 73 75 6c   (i==2 || zResul
34b0: 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 52  t); i++){.    zR
34c0: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f  esult = sqlite3_
34d0: 6d 70 72 69 6e 74 66 28 22 25 7a 25 73 25 73 22  mprintf("%z%s%s"
34e0: 2c 20 7a 52 65 73 75 6c 74 2c 20 61 72 67 76 5b  , zResult, argv[
34f0: 31 5d 2c 20 61 72 67 76 5b 69 5d 29 3b 0a 20 20  1], argv[i]);.  
3500: 7d 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  }.  Tcl_AppendRe
3510: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 52 65  sult(interp, zRe
3520: 73 75 6c 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  sult, 0);.  sqli
3530: 74 65 33 5f 66 72 65 65 28 7a 52 65 73 75 6c 74  te3_free(zResult
3540: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
3550: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
3560: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
3570: 69 6e 74 66 5f 6e 5f 74 65 73 74 20 20 53 54 52  intf_n_test  STR
3580: 49 4e 47 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  ING.**.** Test t
3590: 68 65 20 25 6e 20 66 6f 72 6d 61 74 20 6f 66 20  he %n format of 
35a0: 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74 66 28 29  sqlite_mprintf()
35b0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  .  Return the le
35c0: 6e 67 74 68 20 6f 66 20 74 68 65 0a 2a 2a 20 69  ngth of the.** i
35d0: 6e 70 75 74 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a  nput string..*/.
35e0: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
35f0: 6d 70 72 69 6e 74 66 5f 6e 28 0a 20 20 76 6f 69  mprintf_n(.  voi
3600: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3610: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3620: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3630: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3640: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3650: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3660: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
3670: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
3680: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
3690: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
36a0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
36b0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
36c0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 53 74 72  .){.  char *zStr
36d0: 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  ;.  int n = 0;. 
36e0: 20 7a 53 74 72 20 3d 20 73 71 6c 69 74 65 33 5f   zStr = sqlite3_
36f0: 6d 70 72 69 6e 74 66 28 22 25 73 25 6e 22 2c 20  mprintf("%s%n", 
3700: 61 72 67 76 5b 31 5d 2c 20 26 6e 29 3b 0a 20 20  argv[1], &n);.  
3710: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 74  sqlite3_free(zSt
3720: 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  r);.  Tcl_SetObj
3730: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
3740: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 29 29  cl_NewIntObj(n))
3750: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
3760: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
3770: 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  e:  sqlite3_snpr
3780: 69 6e 74 66 5f 69 6e 74 20 20 53 49 5a 45 20 46  intf_int  SIZE F
3790: 4f 52 4d 41 54 20 20 49 4e 54 0a 2a 2a 0a 2a 2a  ORMAT  INT.**.**
37a0: 20 54 65 73 74 20 74 68 65 20 6f 66 20 73 71 6c   Test the of sql
37b0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 29 20  ite3_snprintf() 
37c0: 72 6f 75 74 69 6e 65 2e 20 20 53 49 5a 45 20 69  routine.  SIZE i
37d0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
37e0: 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62 75 66 66  e.** output buff
37f0: 65 72 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68  er in bytes.  Th
3800: 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69  e maximum size i
3810: 73 20 31 30 30 2e 20 20 46 4f 52 4d 41 54 20 69  s 100.  FORMAT i
3820: 73 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 61 74 20  s the.** format 
3830: 73 74 72 69 6e 67 2e 20 20 49 4e 54 20 69 73 20  string.  INT is 
3840: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
3850: 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 65 20   argument.  The 
3860: 46 4f 52 4d 41 54 0a 2a 2a 20 73 74 72 69 6e 67  FORMAT.** string
3870: 20 6d 75 73 74 20 72 65 71 75 69 72 65 20 6e 6f   must require no
3880: 20 6d 6f 72 65 20 74 68 61 6e 20 74 68 69 73 20   more than this 
3890: 6f 6e 65 20 69 6e 74 65 67 65 72 20 61 72 67 75  one integer argu
38a0: 6d 65 6e 74 2e 20 20 49 66 0a 2a 2a 20 59 6f 75  ment.  If.** You
38b0: 20 70 61 73 73 20 69 6e 20 61 20 66 6f 72 6d 61   pass in a forma
38c0: 74 20 73 74 72 69 6e 67 20 74 68 61 74 20 72 65  t string that re
38d0: 71 75 69 72 65 73 20 6d 6f 72 65 20 74 68 61 6e  quires more than
38e0: 20 6f 6e 65 20 61 72 67 75 6d 65 6e 74 2c 0a 2a   one argument,.*
38f0: 2a 20 62 61 64 20 74 68 69 6e 67 73 20 77 69 6c  * bad things wil
3900: 6c 20 68 61 70 70 65 6e 2e 0a 2a 2f 0a 73 74 61  l happen..*/.sta
3910: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6e 70  tic int test_snp
3920: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
3930: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
3940: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
3950: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
3960: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
3970: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
3980: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
3990: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
39a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
39b0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
39c0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
39d0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
39e0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
39f0: 0a 29 7b 0a 20 20 63 68 61 72 20 7a 53 74 72 5b  .){.  char zStr[
3a00: 31 30 30 5d 3b 0a 20 20 69 6e 74 20 6e 20 3d 20  100];.  int n = 
3a10: 61 74 6f 69 28 61 72 67 76 5b 31 5d 29 3b 0a 20  atoi(argv[1]);. 
3a20: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f   const char *zFo
3a30: 72 6d 61 74 20 3d 20 61 72 67 76 5b 32 5d 3b 0a  rmat = argv[2];.
3a40: 20 20 69 6e 74 20 61 31 20 3d 20 61 74 6f 69 28    int a1 = atoi(
3a50: 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28 20  argv[3]);.  if( 
3a60: 6e 3e 73 69 7a 65 6f 66 28 7a 53 74 72 29 20 29  n>sizeof(zStr) )
3a70: 20 6e 20 3d 20 73 69 7a 65 6f 66 28 7a 53 74 72   n = sizeof(zStr
3a80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  );.  sqlite3_snp
3a90: 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 74  rintf(sizeof(zSt
3aa0: 72 29 2c 20 7a 53 74 72 2c 20 22 61 62 63 64 65  r), zStr, "abcde
3ab0: 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75  fghijklmnopqrstu
3ac0: 76 77 78 79 7a 22 29 3b 0a 20 20 73 71 6c 69 74  vwxyz");.  sqlit
3ad0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e 2c 20 7a  e3_snprintf(n, z
3ae0: 53 74 72 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 31  Str, zFormat, a1
3af0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
3b00: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 53  esult(interp, zS
3b10: 74 72 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  tr, 0);.  return
3b20: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e   TCL_OK;.}..#ifn
3b30: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
3b40: 47 45 54 5f 54 41 42 4c 45 0a 0a 2f 2a 0a 2a 2a  GET_TABLE../*.**
3b50: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
3b60: 5f 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74  _get_table_print
3b70: 66 20 20 44 42 20 20 46 4f 52 4d 41 54 20 20 53  f  DB  FORMAT  S
3b80: 54 52 49 4e 47 20 20 3f 2d 2d 6e 6f 2d 63 6f 75  TRING  ?--no-cou
3b90: 6e 74 73 3f 0a 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b  nts?.**.** Invok
3ba0: 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f 67 65  e the sqlite3_ge
3bb0: 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 29  t_table_printf()
3bc0: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
3bd0: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
3be0: 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53  se.** DB.  The S
3bf0: 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  QL is the string
3c00: 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f   FORMAT.  The fo
3c10: 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75  rmat string shou
3c20: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e  ld contain.** on
3c30: 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52  e %s or %q.  STR
3c40: 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65  ING is the value
3c50: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
3c60: 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74  s or %q..*/.stat
3c70: 69 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74 5f  ic int test_get_
3c80: 74 61 62 6c 65 5f 70 72 69 6e 74 66 28 0a 20 20  table_printf(.  
3c90: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
3ca0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
3cb0: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
3cc0: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
3cd0: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
3ce0: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
3cf0: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
3d00: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3d10: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
3d20: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
3d30: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
3d40: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
3d50: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
3d60: 20 2a 64 62 3b 0a 20 20 54 63 6c 5f 44 53 74 72   *db;.  Tcl_DStr
3d70: 69 6e 67 20 73 74 72 3b 0a 20 20 69 6e 74 20 72  ing str;.  int r
3d80: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  c;.  char *zErr 
3d90: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 52 6f 77 2c  = 0;.  int nRow,
3da0: 20 6e 43 6f 6c 3b 0a 20 20 63 68 61 72 20 2a 2a   nCol;.  char **
3db0: 61 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  aResult;.  int i
3dc0: 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30  ;.  char zBuf[30
3dd0: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b  ];.  char *zSql;
3de0: 0a 20 20 69 6e 74 20 72 65 73 43 6f 75 6e 74 20  .  int resCount 
3df0: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 61 72 67 63  = -1;.  if( argc
3e00: 3d 3d 35 20 29 7b 0a 20 20 20 20 69 66 28 20 54  ==5 ){.    if( T
3e10: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
3e20: 2c 20 61 72 67 76 5b 34 5d 2c 20 26 72 65 73 43  , argv[4], &resC
3e30: 6f 75 6e 74 29 20 29 20 72 65 74 75 72 6e 20 54  ount) ) return T
3e40: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
3e50: 69 66 28 20 61 72 67 63 21 3d 34 20 26 26 20 61  if( argc!=4 && a
3e60: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
3e70: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
3e80: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
3e90: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
3ea0: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
3eb0: 20 20 20 20 20 20 22 20 44 42 20 46 4f 52 4d 41        " DB FORMA
3ec0: 54 20 53 54 52 49 4e 47 20 3f 43 4f 55 4e 54 3f  T STRING ?COUNT?
3ed0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
3ee0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
3ef0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
3f00: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
3f10: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
3f20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
3f30: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
3f40: 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  &str);.  zSql = 
3f50: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
3f60: 61 72 67 76 5b 32 5d 2c 61 72 67 76 5b 33 5d 29  argv[2],argv[3])
3f70: 3b 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 35 20  ;.  if( argc==5 
3f80: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
3f90: 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62  te3_get_table(db
3fa0: 2c 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74  , zSql, &aResult
3fb0: 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 29 3b 0a  , 0, 0, &zErr);.
3fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
3fd0: 3d 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61  = sqlite3_get_ta
3fe0: 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c 20 26 61  ble(db, zSql, &a
3ff0: 52 65 73 75 6c 74 2c 20 26 6e 52 6f 77 2c 20 26  Result, &nRow, &
4000: 6e 43 6f 6c 2c 20 26 7a 45 72 72 29 3b 0a 20 20  nCol, &zErr);.  
4010: 20 20 72 65 73 43 6f 75 6e 74 20 3d 20 28 6e 52    resCount = (nR
4020: 6f 77 2b 31 29 2a 6e 43 6f 6c 3b 0a 20 20 7d 0a  ow+1)*nCol;.  }.
4030: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
4040: 53 71 6c 29 3b 0a 20 20 73 70 72 69 6e 74 66 28  Sql);.  sprintf(
4050: 7a 42 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b  zBuf, "%d", rc);
4060: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
4070: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  ment(interp, zBu
4080: 66 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  f);.  if( rc==SQ
4090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
40a0: 66 28 20 61 72 67 63 3d 3d 34 20 29 7b 0a 20 20  f( argc==4 ){.  
40b0: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66      sprintf(zBuf
40c0: 2c 20 22 25 64 22 2c 20 6e 52 6f 77 29 3b 0a 20  , "%d", nRow);. 
40d0: 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 45       Tcl_AppendE
40e0: 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a  lement(interp, z
40f0: 42 75 66 29 3b 0a 20 20 20 20 20 20 73 70 72 69  Buf);.      spri
4100: 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c 20  ntf(zBuf, "%d", 
4110: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 54 63 6c  nCol);.      Tcl
4120: 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  _AppendElement(i
4130: 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20  nterp, zBuf);.  
4140: 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b    }.    for(i=0;
4150: 20 69 3c 72 65 73 43 6f 75 6e 74 3b 20 69 2b 2b   i<resCount; i++
4160: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70  ){.      Tcl_App
4170: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
4180: 70 2c 20 61 52 65 73 75 6c 74 5b 69 5d 20 3f 20  p, aResult[i] ? 
4190: 61 52 65 73 75 6c 74 5b 69 5d 20 3a 20 22 4e 55  aResult[i] : "NU
41a0: 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  LL");.    }.  }e
41b0: 6c 73 65 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lse{.    Tcl_App
41c0: 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
41d0: 70 2c 20 7a 45 72 72 29 3b 0a 20 20 7d 0a 20 20  p, zErr);.  }.  
41e0: 73 71 6c 69 74 65 33 5f 66 72 65 65 5f 74 61 62  sqlite3_free_tab
41f0: 6c 65 28 61 52 65 73 75 6c 74 29 3b 0a 20 20 69  le(aResult);.  i
4200: 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74 65  f( zErr ) sqlite
4210: 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
4220: 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
4230: 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
4240: 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
4250: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74  TCL_ERROR;.  ret
4260: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
4270: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
4280: 4f 4d 49 54 5f 47 45 54 5f 54 41 42 4c 45 20 2a  OMIT_GET_TABLE *
4290: 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  /.../*.** Usage:
42a0: 20 20 73 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69    sqlite3_last_i
42b0: 6e 73 65 72 74 5f 72 6f 77 69 64 20 44 42 0a 2a  nsert_rowid DB.*
42c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
42d0: 20 69 6e 74 65 67 65 72 20 52 4f 57 49 44 20 6f   integer ROWID o
42e0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
42f0: 74 20 69 6e 73 65 72 74 2e 0a 2a 2f 0a 73 74 61  t insert..*/.sta
4300: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 61 73  tic int test_las
4310: 74 5f 72 6f 77 69 64 28 0a 20 20 76 6f 69 64 20  t_rowid(.  void 
4320: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
4330: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
4340: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
4350: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
4360: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
4370: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
4380: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
4390: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
43a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
43b0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
43c0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
43d0: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
43e0: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
43f0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
4400: 3b 0a 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  ;..  if( argc!=2
4410: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4420: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4430: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4440: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4450: 72 67 76 5b 30 5d 2c 20 22 20 44 42 5c 22 22 2c  rgv[0], " DB\"",
4460: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
4470: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
4480: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
4490: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
44a0: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
44b0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 70   TCL_ERROR;.  sp
44c0: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 6c 6c  rintf(zBuf, "%ll
44d0: 64 22 2c 20 73 71 6c 69 74 65 33 5f 6c 61 73 74  d", sqlite3_last
44e0: 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 64 62  _insert_rowid(db
44f0: 29 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ));.  Tcl_Append
4500: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
4510: 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
4520: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
4530: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
4540: 6c 69 74 65 33 5f 6b 65 79 20 44 42 20 4b 45 59  lite3_key DB KEY
4550: 0a 2a 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  .**.** Set the c
4560: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
4570: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6b 65 79  tic int test_key
4580: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4590: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
45a0: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
45b0: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
45c0: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
45d0: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
45e0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4600: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4610: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
4620: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4630: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
4640: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66 64 65  ment */.){.#ifde
4650: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
4660: 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  EC.  sqlite3 *db
4670: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
4680: 7a 4b 65 79 3b 0a 20 20 69 6e 74 20 6e 4b 65 79  zKey;.  int nKey
4690: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
46a0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
46b0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
46c0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
46d0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
46e0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
46f0: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
4700: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4710: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
4720: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
4730: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
4740: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
4750: 5f 45 52 52 4f 52 3b 0a 20 20 7a 4b 65 79 20 3d  _ERROR;.  zKey =
4760: 20 61 72 67 76 5b 32 5d 3b 0a 20 20 6e 4b 65 79   argv[2];.  nKey
4770: 20 3d 20 73 74 72 6c 65 6e 28 7a 4b 65 79 29 3b   = strlen(zKey);
4780: 0a 20 20 73 71 6c 69 74 65 33 5f 6b 65 79 28 64  .  sqlite3_key(d
4790: 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a  b, zKey, nKey);.
47a0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
47b0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
47c0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
47d0: 5f 72 65 6b 65 79 20 44 42 20 4b 45 59 0a 2a 2a  _rekey DB KEY.**
47e0: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 63  .** Change the c
47f0: 6f 64 65 63 20 6b 65 79 2e 0a 2a 2f 0a 73 74 61  odec key..*/.sta
4800: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 6b  tic int test_rek
4810: 65 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ey(.  void *NotU
4820: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
4830: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
4840: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
4850: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
4860: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
4870: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
4880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4890: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
48a0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
48b0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
48c0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
48d0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23 69 66  gument */.){.#if
48e0: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43  def SQLITE_HAS_C
48f0: 4f 44 45 43 0a 20 20 73 71 6c 69 74 65 33 20 2a  ODEC.  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 72 65 6b  );.  sqlite3_rek
4a20: 65 79 28 64 62 2c 20 7a 4b 65 79 2c 20 6e 4b 65  ey(db, zKey, nKe
4a30: 79 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  y);.#endif.  ret
4a40: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
4a50: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
4a60: 69 74 65 33 5f 63 6c 6f 73 65 20 44 42 0a 2a 2a  ite3_close DB.**
4a70: 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65 20 64  .** Closes the d
4a80: 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64 20 62  atabase opened b
4a90: 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 2e 0a  y sqlite3_open..
4aa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
4ab0: 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73 65 28  lite_test_close(
4ac0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
4ad0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
4ae0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
4af0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
4b00: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
4b10: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
4b20: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
4b30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4b40: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
4b50: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
4b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
4b70: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
4b80: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ent */.){.  sqli
4b90: 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
4ba0: 63 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  c;.  if( argc!=2
4bb0: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
4bc0: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
4bd0: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
4be0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
4bf0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
4c00: 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29   FILENAME\"", 0)
4c10: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
4c20: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
4c30: 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
4c40: 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
4c50: 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
4c60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
4c70: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
4c80: 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  );.  Tcl_SetResu
4c90: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
4ca0: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
4cb0: 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  c), TCL_STATIC);
4cc0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
4cd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
4ce0: 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  :  sqlite3_close
4cf0: 5f 76 32 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f  _v2 DB.**.** Clo
4d00: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
4d10: 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
4d20: 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  e3_open..*/.stat
4d30: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65  ic int sqlite_te
4d40: 73 74 5f 63 6c 6f 73 65 5f 76 32 28 0a 20 20 76  st_close_v2(.  v
4d50: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
4d60: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4d70: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
4d80: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
4d90: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
4da0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
4db0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
4dc0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4dd0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
4de0: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
4df0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
4e00: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
4e10: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
4e20: 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
4e30: 20 69 66 28 20 61 72 67 63 21 3d 32 20 29 7b 0a   if( argc!=2 ){.
4e40: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
4e50: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
4e60: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
4e70: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
4e80: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c  0],.       " FIL
4e90: 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20  ENAME\"", 0);.  
4ea0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4eb0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
4ec0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
4ed0: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
4ee0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
4ef0: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
4f00: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29  te3_close_v2(db)
4f10: 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
4f20: 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
4f30: 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
4f40: 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
4f50: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
4f60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
4f70: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
4f80: 78 5f 63 6f 61 6c 65 73 63 65 28 29 20 66 75 6e  x_coalesce() fun
4f90: 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e  ction..** Return
4fa0: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
4fb0: 65 6e 74 20 6e 6f 6e 2d 4e 55 4c 4c 20 61 72 67  ent non-NULL arg
4fc0: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
4fd0: 20 76 6f 69 64 20 74 31 5f 69 66 6e 75 6c 6c 46   void t1_ifnullF
4fe0: 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  unc(.  sqlite3_c
4ff0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
5000: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
5010: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5020: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  rgv.){.  int i;.
5030: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67    for(i=0; i<arg
5040: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  c; i++){.    if(
5050: 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71   SQLITE_NULL!=sq
5060: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
5070: 28 61 72 67 76 5b 69 5d 29 20 29 7b 0a 20 20 20  (argv[i]) ){.   
5080: 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74     int n = sqlit
5090: 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 61  e3_value_bytes(a
50a0: 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20 20 20 73  rgv[i]);.      s
50b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
50c0: 78 74 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61  xt(context, (cha
50d0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
50e0: 5f 74 65 78 74 28 61 72 67 76 5b 69 5d 29 2c 0a  _text(argv[i]),.
50f0: 20 20 20 20 20 20 20 20 20 20 6e 2c 20 53 51 4c            n, SQL
5100: 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
5110: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5120: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
5130: 54 68 65 73 65 20 61 72 65 20 74 65 73 74 20 66  These are test f
5140: 75 6e 63 74 69 6f 6e 73 2e 20 20 20 20 68 65 78  unctions.    hex
5150: 38 28 29 20 69 6e 74 65 72 70 72 65 74 73 20 69  8() interprets i
5160: 74 73 20 61 72 67 75 6d 65 6e 74 20 61 73 0a 2a  ts argument as.*
5170: 2a 20 55 54 46 38 20 61 6e 64 20 72 65 74 75 72  * UTF8 and retur
5180: 6e 73 20 61 20 68 65 78 20 65 6e 63 6f 64 69 6e  ns a hex encodin
5190: 67 2e 20 20 68 65 78 31 36 6c 65 28 29 20 69 6e  g.  hex16le() in
51a0: 74 65 72 70 72 65 74 73 20 69 74 73 20 61 72 67  terprets its arg
51b0: 75 6d 65 6e 74 0a 2a 2a 20 61 73 20 55 54 46 31  ument.** as UTF1
51c0: 36 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 73 20  6le and returns 
51d0: 61 20 68 65 78 20 65 6e 63 6f 64 69 6e 67 2e 0a  a hex encoding..
51e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  */.static void h
51f0: 65 78 38 46 75 6e 63 28 73 71 6c 69 74 65 33 5f  ex8Func(sqlite3_
5200: 63 6f 6e 74 65 78 74 20 2a 70 2c 20 69 6e 74 20  context *p, int 
5210: 61 72 67 63 2c 20 73 71 6c 69 74 65 33 5f 76 61  argc, sqlite3_va
5220: 6c 75 65 20 2a 2a 61 72 67 76 29 7b 0a 20 20 63  lue **argv){.  c
5230: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
5240: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a  ar *z;.  int i;.
5250: 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
5260: 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ;.  z = sqlite3_
5270: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
5280: 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  0]);.  for(i=0; 
5290: 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 32  i<sizeof(zBuf)/2
52a0: 20 2d 20 32 20 26 26 20 7a 5b 69 5d 3b 20 69 2b   - 2 && z[i]; i+
52b0: 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e 74 66 28  +){.    sprintf(
52c0: 26 7a 42 75 66 5b 69 2a 32 5d 2c 20 22 25 30 32  &zBuf[i*2], "%02
52d0: 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66 29 3b 0a  x", z[i]&0xff);.
52e0: 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a 32 5d 20    }.  zBuf[i*2] 
52f0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  = 0;.  sqlite3_r
5300: 65 73 75 6c 74 5f 74 65 78 74 28 70 2c 20 28 63  esult_text(p, (c
5310: 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31 2c 20 53  har*)zBuf, -1, S
5320: 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
5330: 3b 0a 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ;.}.#ifndef SQLI
5340: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74  TE_OMIT_UTF16.st
5350: 61 74 69 63 20 76 6f 69 64 20 68 65 78 31 36 46  atic void hex16F
5360: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
5370: 65 78 74 20 2a 70 2c 20 69 6e 74 20 61 72 67 63  ext *p, int argc
5380: 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  , sqlite3_value 
5390: 2a 2a 61 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74  **argv){.  const
53a0: 20 75 6e 73 69 67 6e 65 64 20 73 68 6f 72 74 20   unsigned short 
53b0: 69 6e 74 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b  int *z;.  int i;
53c0: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 34 30 30  .  char zBuf[400
53d0: 5d 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  ];.  z = sqlite3
53e0: 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72  _value_text16(ar
53f0: 67 76 5b 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  gv[0]);.  for(i=
5400: 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 42 75 66  0; i<sizeof(zBuf
5410: 29 2f 34 20 2d 20 34 20 26 26 20 7a 5b 69 5d 3b  )/4 - 4 && z[i];
5420: 20 69 2b 2b 29 7b 0a 20 20 20 20 73 70 72 69 6e   i++){.    sprin
5430: 74 66 28 26 7a 42 75 66 5b 69 2a 34 5d 2c 20 22  tf(&zBuf[i*4], "
5440: 25 30 34 78 22 2c 20 7a 5b 69 5d 26 30 78 66 66  %04x", z[i]&0xff
5450: 29 3b 0a 20 20 7d 0a 20 20 7a 42 75 66 5b 69 2a  );.  }.  zBuf[i*
5460: 34 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  4] = 0;.  sqlite
5470: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 2c  3_result_text(p,
5480: 20 28 63 68 61 72 2a 29 7a 42 75 66 2c 20 2d 31   (char*)zBuf, -1
5490: 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
54a0: 4e 54 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  NT);.}.#endif../
54b0: 2a 0a 2a 2a 20 41 20 73 74 72 75 63 74 75 72 65  *.** A structure
54c0: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 61   into which to a
54d0: 63 63 75 6d 75 6c 61 74 65 20 74 65 78 74 2e 0a  ccumulate text..
54e0: 2a 2f 0a 73 74 72 75 63 74 20 64 73 74 72 20 7b  */.struct dstr {
54f0: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 20 20  .  int nAlloc;  
5500: 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
5510: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 55 73 65  ed */.  int nUse
5520: 64 3b 20 20 20 2f 2a 20 53 70 61 63 65 20 75 73  d;   /* Space us
5530: 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 3b  ed */.  char *z;
5540: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 61 63       /* The spac
5550: 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  e */.};../*.** A
5560: 70 70 65 6e 64 20 74 65 78 74 20 74 6f 20 61 20  ppend text to a 
5570: 64 73 74 72 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dstr.*/.static v
5580: 6f 69 64 20 64 73 74 72 41 70 70 65 6e 64 28 73  oid dstrAppend(s
5590: 74 72 75 63 74 20 64 73 74 72 20 2a 70 2c 20 63  truct dstr *p, c
55a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
55b0: 74 20 64 69 76 69 64 65 72 29 7b 0a 20 20 69 6e  t divider){.  in
55c0: 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t n = (int)strle
55d0: 6e 28 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 6e  n(z);.  if( p->n
55e0: 55 73 65 64 20 2b 20 6e 20 2b 20 32 20 3e 20 70  Used + n + 2 > p
55f0: 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20  ->nAlloc ){.    
5600: 63 68 61 72 20 2a 7a 4e 65 77 3b 0a 20 20 20 20  char *zNew;.    
5610: 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  p->nAlloc = p->n
5620: 41 6c 6c 6f 63 2a 32 20 2b 20 6e 20 2b 20 32 30  Alloc*2 + n + 20
5630: 30 3b 0a 20 20 20 20 7a 4e 65 77 20 3d 20 73 71  0;.    zNew = sq
5640: 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 70 2d  lite3_realloc(p-
5650: 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a  >z, p->nAlloc);.
5660: 20 20 20 20 69 66 28 20 7a 4e 65 77 3d 3d 30 20      if( zNew==0 
5670: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5680: 5f 66 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 20  _free(p->z);.   
5690: 20 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20     memset(p, 0, 
56a0: 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20 20  sizeof(*p));.   
56b0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
56c0: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 7a 4e 65 77  .    p->z = zNew
56d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 64 69 76 69  ;.  }.  if( divi
56e0: 64 65 72 20 26 26 20 70 2d 3e 6e 55 73 65 64 3e  der && p->nUsed>
56f0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d  0 ){.    p->z[p-
5700: 3e 6e 55 73 65 64 2b 2b 5d 20 3d 20 64 69 76 69  >nUsed++] = divi
5710: 64 65 72 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63 70  der;.  }.  memcp
5720: 79 28 26 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64  y(&p->z[p->nUsed
5730: 5d 2c 20 7a 2c 20 6e 2b 31 29 3b 0a 20 20 70 2d  ], z, n+1);.  p-
5740: 3e 6e 55 73 65 64 20 2b 3d 20 6e 3b 0a 7d 0a 0a  >nUsed += n;.}..
5750: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 64 20 66 6f  /*.** Invoked fo
5760: 72 20 65 61 63 68 20 63 61 6c 6c 62 61 63 6b 20  r each callback 
5770: 66 72 6f 6d 20 73 71 6c 69 74 65 33 45 78 65 63  from sqlite3Exec
5780: 46 75 6e 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69  Func.*/.static i
5790: 6e 74 20 65 78 65 63 46 75 6e 63 43 61 6c 6c 62  nt execFuncCallb
57a0: 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 2c  ack(void *pData,
57b0: 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20   int argc, char 
57c0: 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a 4e  **argv, char **N
57d0: 6f 74 55 73 65 64 29 7b 0a 20 20 73 74 72 75 63  otUsed){.  struc
57e0: 74 20 64 73 74 72 20 2a 70 20 3d 20 28 73 74 72  t dstr *p = (str
57f0: 75 63 74 20 64 73 74 72 2a 29 70 44 61 74 61 3b  uct dstr*)pData;
5800: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5810: 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b  i=0; i<argc; i++
5820: 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 76 5b  ){.    if( argv[
5830: 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64  i]==0 ){.      d
5840: 73 74 72 41 70 70 65 6e 64 28 70 2c 20 22 4e 55  strAppend(p, "NU
5850: 4c 4c 22 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d  LL", ' ');.    }
5860: 65 6c 73 65 7b 0a 20 20 20 20 20 20 64 73 74 72  else{.      dstr
5870: 41 70 70 65 6e 64 28 70 2c 20 61 72 67 76 5b 69  Append(p, argv[i
5880: 5d 2c 20 27 20 27 29 3b 0a 20 20 20 20 7d 0a 20  ], ' ');.    }. 
5890: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
58a0: 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
58b0: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 78 5f  tation of the x_
58c0: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 20 66 75  sqlite_exec() fu
58d0: 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 66 75  nction.  This fu
58e0: 6e 63 74 69 6f 6e 20 74 61 6b 65 73 0a 2a 2a 20  nction takes.** 
58f0: 61 20 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e  a single argumen
5900: 74 20 61 6e 64 20 61 74 74 65 6d 70 74 73 20 74  t and attempts t
5910: 6f 20 65 78 65 63 75 74 65 20 74 68 61 74 20 61  o execute that a
5920: 72 67 75 6d 65 6e 74 20 61 73 20 53 51 4c 20 63  rgument as SQL c
5930: 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20  ode..** This is 
5940: 69 6c 6c 65 67 61 6c 20 61 6e 64 20 73 68 6f 75  illegal and shou
5950: 6c 64 20 73 65 74 20 74 68 65 20 53 51 4c 49 54  ld set the SQLIT
5960: 45 5f 4d 49 53 55 53 45 20 66 6c 61 67 20 6f 6e  E_MISUSE flag on
5970: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
5980: 2a 0a 2a 2a 20 32 30 30 34 2d 4a 61 6e 2d 30 37  *.** 2004-Jan-07
5990: 3a 20 20 57 65 20 68 61 76 65 20 63 68 61 6e 67  :  We have chang
59a0: 65 64 20 74 68 69 73 20 74 6f 20 6d 61 6b 65 20  ed this to make 
59b0: 69 74 20 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c  it legal to call
59c0: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 0a   sqlite3_exec().
59d0: 2a 2a 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 61  ** from within a
59e0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 2e 20   function call. 
59f0: 20 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f   .** .** This ro
5a00: 75 74 69 6e 65 20 73 69 6d 75 6c 61 74 65 73 20  utine simulates 
5a10: 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 68 61  the effect of ha
5a20: 76 69 6e 67 20 74 77 6f 20 74 68 72 65 61 64 73  ving two threads
5a30: 20 61 74 74 65 6d 70 74 20 74 6f 0a 2a 2a 20 75   attempt to.** u
5a40: 73 65 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  se the same data
5a50: 62 61 73 65 20 61 74 20 74 68 65 20 73 61 6d 65  base at the same
5a60: 20 74 69 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   time..*/.static
5a70: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 65   void sqlite3Exe
5a80: 63 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  cFunc(.  sqlite3
5a90: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
5aa0: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
5ab0: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
5ac0: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74  e **argv.){.  st
5ad0: 72 75 63 74 20 64 73 74 72 20 78 3b 0a 20 20 6d  ruct dstr x;.  m
5ae0: 65 6d 73 65 74 28 26 78 2c 20 30 2c 20 73 69 7a  emset(&x, 0, siz
5af0: 65 6f 66 28 78 29 29 3b 0a 20 20 28 76 6f 69 64  eof(x));.  (void
5b00: 29 73 71 6c 69 74 65 33 5f 65 78 65 63 28 28 73  )sqlite3_exec((s
5b10: 71 6c 69 74 65 33 2a 29 73 71 6c 69 74 65 33 5f  qlite3*)sqlite3_
5b20: 75 73 65 72 5f 64 61 74 61 28 63 6f 6e 74 65 78  user_data(contex
5b30: 74 29 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t),.      (char*
5b40: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5b50: 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 0a 20 20  ext(argv[0]),.  
5b60: 20 20 20 20 65 78 65 63 46 75 6e 63 43 61 6c 6c      execFuncCall
5b70: 62 61 63 6b 2c 20 26 78 2c 20 30 29 3b 0a 20 20  back, &x, 0);.  
5b80: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5b90: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 78 2e 7a  ext(context, x.z
5ba0: 2c 20 78 2e 6e 55 73 65 64 2c 20 53 51 4c 49 54  , x.nUsed, SQLIT
5bb0: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
5bc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 78 2e 7a  sqlite3_free(x.z
5bd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  );.}../*.** Impl
5be0: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 6b  ementation of tk
5bf0: 74 32 32 31 33 66 75 6e 63 28 29 2c 20 61 20 73  t2213func(), a s
5c00: 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 74  calar function t
5c10: 68 61 74 20 74 61 6b 65 73 20 65 78 61 63 74 6c  hat takes exactl
5c20: 79 0a 2a 2a 20 6f 6e 65 20 61 72 67 75 6d 65 6e  y.** one argumen
5c30: 74 2e 20 49 74 20 68 61 73 20 74 77 6f 20 69 6e  t. It has two in
5c40: 74 65 72 65 73 74 69 6e 67 20 66 65 61 74 75 72  teresting featur
5c50: 65 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 74 20 63  es:.**.** * It c
5c60: 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f 76 61 6c  alls sqlite3_val
5c70: 75 65 5f 74 65 78 74 28 29 20 33 20 74 69 6d 65  ue_text() 3 time
5c80: 73 20 6f 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  s on the argumen
5c90: 74 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t sqlite3_value*
5ca0: 2e 0a 2a 2a 20 20 20 49 66 20 74 68 65 20 74 68  ..**   If the th
5cb0: 72 65 65 20 70 6f 69 6e 74 65 72 73 20 72 65 74  ree pointers ret
5cc0: 75 72 6e 65 64 20 61 72 65 20 6e 6f 74 20 74 68  urned are not th
5cd0: 65 20 73 61 6d 65 20 61 6e 20 53 51 4c 20 65 72  e same an SQL er
5ce0: 72 6f 72 20 69 73 20 72 61 69 73 65 64 2e 0a 2a  ror is raised..*
5cf0: 2a 0a 2a 2a 20 2a 20 4f 74 68 65 72 77 69 73 65  *.** * Otherwise
5d00: 20 69 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f   it returns a co
5d10: 70 79 20 6f 66 20 74 68 65 20 74 65 78 74 20 72  py of the text r
5d20: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
5d30: 20 69 74 73 20 0a 2a 2a 20 20 20 61 72 67 75 6d   its .**   argum
5d40: 65 6e 74 20 69 6e 20 73 75 63 68 20 61 20 77 61  ent in such a wa
5d50: 79 20 61 73 20 74 68 65 20 56 44 42 45 20 72 65  y as the VDBE re
5d60: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 69 73 20  presentation is 
5d70: 61 20 4d 65 6d 2a 20 63 65 6c 6c 20 0a 2a 2a 20  a Mem* cell .** 
5d80: 20 20 77 69 74 68 20 74 68 65 20 4d 45 4d 5f 54    with the MEM_T
5d90: 65 72 6d 20 66 6c 61 67 20 63 6c 65 61 72 2e 20  erm flag clear. 
5da0: 0a 2a 2a 0a 2a 2a 20 54 69 63 6b 65 74 20 23 32  .**.** Ticket #2
5db0: 32 31 33 20 63 61 6e 20 74 68 65 72 65 66 6f 72  213 can therefor
5dc0: 65 20 62 65 20 74 65 73 74 65 64 20 62 79 20 65  e be tested by e
5dd0: 76 61 6c 75 61 74 69 6e 67 20 74 68 65 20 66 6f  valuating the fo
5de0: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 53 51 4c 20 65  llowing.** SQL e
5df0: 78 70 72 65 73 73 69 6f 6e 3a 0a 2a 2a 0a 2a 2a  xpression:.**.**
5e00: 20 20 20 74 6b 74 32 32 31 33 66 75 6e 63 28 74     tkt2213func(t
5e10: 6b 74 32 32 31 33 66 75 6e 63 28 27 61 20 73 74  kt2213func('a st
5e20: 72 69 6e 67 27 29 29 3b 0a 2a 2f 0a 73 74 61 74  ring'));.*/.stat
5e30: 69 63 20 76 6f 69 64 20 74 6b 74 32 32 31 33 46  ic void tkt2213F
5e40: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
5e50: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74  e3_context *cont
5e60: 65 78 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63  ext, .  int argc
5e70: 2c 20 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  ,  .  sqlite3_va
5e80: 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
5e90: 69 6e 74 20 6e 54 65 78 74 3b 0a 20 20 75 6e 73  int nText;.  uns
5ea0: 69 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74  igned char const
5eb0: 20 2a 7a 54 65 78 74 31 3b 0a 20 20 75 6e 73 69   *zText1;.  unsi
5ec0: 67 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20  gned char const 
5ed0: 2a 7a 54 65 78 74 32 3b 0a 20 20 75 6e 73 69 67  *zText2;.  unsig
5ee0: 6e 65 64 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ned char const *
5ef0: 7a 54 65 78 74 33 3b 0a 0a 20 20 6e 54 65 78 74  zText3;..  nText
5f00: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
5f10: 5f 62 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b  _bytes(argv[0]);
5f20: 0a 20 20 7a 54 65 78 74 31 20 3d 20 73 71 6c 69  .  zText1 = sqli
5f30: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f40: 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78 74  rgv[0]);.  zText
5f50: 32 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  2 = sqlite3_valu
5f60: 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b  e_text(argv[0]);
5f70: 0a 20 20 7a 54 65 78 74 33 20 3d 20 73 71 6c 69  .  zText3 = sqli
5f80: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
5f90: 72 67 76 5b 30 5d 29 3b 0a 0a 20 20 69 66 28 20  rgv[0]);..  if( 
5fa0: 7a 54 65 78 74 31 21 3d 7a 54 65 78 74 32 20 7c  zText1!=zText2 |
5fb0: 7c 20 7a 54 65 78 74 32 21 3d 7a 54 65 78 74 33  | zText2!=zText3
5fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5fd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e  result_error(con
5fe0: 74 65 78 74 2c 20 22 74 6b 74 32 32 31 33 20 69  text, "tkt2213 i
5ff0: 73 20 6e 6f 74 20 66 69 78 65 64 22 2c 20 2d 31  s not fixed", -1
6000: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
6010: 63 68 61 72 20 2a 7a 43 6f 70 79 20 3d 20 28 63  char *zCopy = (c
6020: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61  har *)sqlite3_ma
6030: 6c 6c 6f 63 28 6e 54 65 78 74 29 3b 0a 20 20 20  lloc(nText);.   
6040: 20 6d 65 6d 63 70 79 28 7a 43 6f 70 79 2c 20 7a   memcpy(zCopy, z
6050: 54 65 78 74 31 2c 20 6e 54 65 78 74 29 3b 0a 20  Text1, nText);. 
6060: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
6070: 74 5f 74 65 78 74 28 63 6f 6e 74 65 78 74 2c 20  t_text(context, 
6080: 7a 43 6f 70 79 2c 20 6e 54 65 78 74 2c 20 73 71  zCopy, nText, sq
6090: 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20 7d  lite3_free);.  }
60a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
60b0: 6c 6c 6f 77 69 6e 67 20 53 51 4c 20 66 75 6e 63  llowing SQL func
60c0: 74 69 6f 6e 20 74 61 6b 65 73 20 34 20 61 72 67  tion takes 4 arg
60d0: 75 6d 65 6e 74 73 2e 20 20 54 68 65 20 32 6e 64  uments.  The 2nd
60e0: 20 61 6e 64 0a 2a 2a 20 34 74 68 20 61 72 67 75   and.** 4th argu
60f0: 6d 65 6e 74 20 6d 75 73 74 20 62 65 20 6f 6e 65  ment must be one
6100: 20 6f 66 20 74 68 65 73 65 20 73 74 72 69 6e 67   of these string
6110: 73 3a 20 20 27 74 65 78 74 27 2c 20 27 74 65 78  s:  'text', 'tex
6120: 74 31 36 27 2c 0a 2a 2a 20 6f 72 20 27 62 6c 6f  t16',.** or 'blo
6130: 62 27 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  b' corresponding
6140: 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   to API function
6150: 73 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 73 71 6c  s.**.**      sql
6160: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
6170: 29 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65  ).**      sqlite
6180: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29  3_value_text16()
6190: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
61a0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 29 0a 2a 2a  _value_blob().**
61b0: 0a 2a 2a 20 54 68 65 20 74 68 69 72 64 20 61 72  .** The third ar
61c0: 67 75 6d 65 6e 74 20 69 73 20 61 20 73 74 72 69  gument is a stri
61d0: 6e 67 2c 20 65 69 74 68 65 72 20 27 62 79 74 65  ng, either 'byte
61e0: 73 27 20 6f 72 20 27 62 79 74 65 73 31 36 27 20  s' or 'bytes16' 
61f0: 6f 72 20 27 6e 6f 6f 70 27 2c 0a 2a 2a 20 63 6f  or 'noop',.** co
6200: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41  rresponding to A
6210: 50 49 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  PIs:.**.**      
6220: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
6230: 74 65 73 28 29 0a 2a 2a 20 20 20 20 20 20 73 71  tes().**      sq
6240: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
6250: 73 31 36 28 29 0a 2a 2a 20 20 20 20 20 20 6e 6f  s16().**      no
6260: 6f 70 0a 2a 2a 0a 2a 2a 20 54 68 65 20 41 50 49  op.**.** The API
6270: 73 20 64 65 73 69 67 6e 61 74 65 64 20 62 79 20  s designated by 
6280: 74 68 65 20 32 6e 64 20 74 68 72 6f 75 67 68 20  the 2nd through 
6290: 34 74 68 20 61 72 67 75 6d 65 6e 74 73 20 61 72  4th arguments ar
62a0: 65 20 61 70 70 6c 69 65 64 0a 2a 2a 20 74 6f 20  e applied.** to 
62b0: 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  the first argume
62c0: 6e 74 20 69 6e 20 6f 72 64 65 72 2e 20 20 49 66  nt in order.  If
62d0: 20 74 68 65 20 70 6f 69 6e 74 65 72 73 20 72 65   the pointers re
62e0: 74 75 72 6e 65 64 20 62 79 20 74 68 65 0a 2a 2a  turned by the.**
62f0: 20 73 65 63 6f 6e 64 20 61 6e 64 20 66 6f 75 72   second and four
6300: 74 68 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  th are different
6310: 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
6320: 65 74 75 72 6e 73 20 31 2e 20 20 4f 74 68 65 72  eturns 1.  Other
6330: 77 69 73 65 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  wise,.** this ro
6340: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 30 2e  utine returns 0.
6350: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
6360: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20  tion is used to 
6370: 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 6e  test to see when
6380: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
6390: 72 73 20 66 72 6f 6d 0a 2a 2a 20 74 68 65 20 5f  rs from.** the _
63a0: 74 65 78 74 28 29 2c 20 5f 74 65 78 74 31 36 28  text(), _text16(
63b0: 29 20 61 6e 64 20 5f 62 6c 6f 62 28 29 20 41 50  ) and _blob() AP
63c0: 49 73 20 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69  Is become invali
63d0: 64 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dated..*/.static
63e0: 20 76 6f 69 64 20 70 74 72 43 68 6e 67 46 75 6e   void ptrChngFun
63f0: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
6400: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
6410: 74 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20  t, .  int argc, 
6420: 20 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75   .  sqlite3_valu
6430: 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f  e **argv.){.  co
6440: 6e 73 74 20 76 6f 69 64 20 2a 70 31 2c 20 2a 70  nst void *p1, *p
6450: 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2;.  const char 
6460: 2a 7a 43 6d 64 3b 0a 20 20 69 66 28 20 61 72 67  *zCmd;.  if( arg
6470: 63 21 3d 34 20 29 20 72 65 74 75 72 6e 3b 0a 20  c!=4 ) return;. 
6480: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
6490: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
64a0: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29  ue_text(argv[1])
64b0: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
64c0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
64d0: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74 65 78  strcmp(zCmd,"tex
64e0: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31  t")==0 ){.    p1
64f0: 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29   = (const void*)
6500: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6510: 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  xt(argv[0]);.#if
6520: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6530: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
6540: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
6550: 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29 7b 0a  "text16")==0 ){.
6560: 20 20 20 20 70 31 20 3d 20 28 63 6f 6e 73 74 20      p1 = (const 
6570: 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61  void*)sqlite3_va
6580: 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67 76 5b  lue_text16(argv[
6590: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
65a0: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
65b0: 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d 30 20  Cmd, "blob")==0 
65c0: 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e  ){.    p1 = (con
65d0: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
65e0: 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76  _value_blob(argv
65f0: 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [0]);.  }else{. 
6600: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
6610: 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74 20 63   zCmd = (const c
6620: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
6630: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 32 5d 29  ue_text(argv[2])
6640: 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30 20  ;.  if( zCmd==0 
6650: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
6660: 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 62 79 74  strcmp(zCmd,"byt
6670: 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  es")==0 ){.    s
6680: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74  qlite3_value_byt
6690: 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 23 69 66  es(argv[0]);.#if
66a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
66b0: 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65 20 69  _UTF16.  }else i
66c0: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
66d0: 22 62 79 74 65 73 31 36 22 29 3d 3d 30 20 29 7b  "bytes16")==0 ){
66e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  .    sqlite3_val
66f0: 75 65 5f 62 79 74 65 73 31 36 28 61 72 67 76 5b  ue_bytes16(argv[
6700: 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65  0]);.#endif.  }e
6710: 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
6720: 43 6d 64 2c 20 22 6e 6f 6f 70 22 29 3d 3d 30 20  Cmd, "noop")==0 
6730: 29 7b 0a 20 20 20 20 2f 2a 20 64 6f 20 6e 6f 74  ){.    /* do not
6740: 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  hing */.  }else{
6750: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
6760: 0a 20 20 7a 43 6d 64 20 3d 20 28 63 6f 6e 73 74  .  zCmd = (const
6770: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
6780: 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 33  alue_text(argv[3
6790: 5d 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  ]);.  if( zCmd==
67a0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  0 ) return;.  if
67b0: 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 22 74  ( strcmp(zCmd,"t
67c0: 65 78 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ext")==0 ){.    
67d0: 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p2 = (const void
67e0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
67f0: 74 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 23  text(argv[0]);.#
6800: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6810: 49 54 5f 55 54 46 31 36 0a 20 20 7d 65 6c 73 65  IT_UTF16.  }else
6820: 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
6830: 2c 20 22 74 65 78 74 31 36 22 29 3d 3d 30 20 29  , "text16")==0 )
6840: 7b 0a 20 20 20 20 70 32 20 3d 20 28 63 6f 6e 73  {.    p2 = (cons
6850: 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f  t void*)sqlite3_
6860: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 61 72 67  value_text16(arg
6870: 76 5b 30 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20  v[0]);.#endif.  
6880: 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
6890: 28 7a 43 6d 64 2c 20 22 62 6c 6f 62 22 29 3d 3d  (zCmd, "blob")==
68a0: 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63  0 ){.    p2 = (c
68b0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
68c0: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
68d0: 67 76 5b 30 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b  gv[0]);.  }else{
68e0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
68f0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6900: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
6910: 31 21 3d 70 32 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  1!=p2);.}../*.**
6920: 20 54 68 69 73 20 53 51 4c 20 66 75 6e 63 74 69   This SQL functi
6930: 6f 6e 20 72 65 74 75 72 6e 73 20 61 20 64 69 66  on returns a dif
6940: 66 65 72 65 6e 74 20 61 6e 73 77 65 72 20 65 61  ferent answer ea
6950: 63 68 20 74 69 6d 65 20 69 74 20 69 73 20 63 61  ch time it is ca
6960: 6c 6c 65 64 2c 20 65 76 65 6e 20 69 66 0a 2a 2a  lled, even if.**
6970: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61   the arguments a
6980: 72 65 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a  re the same..*/.
6990: 73 74 61 74 69 63 20 76 6f 69 64 20 6e 6f 6e 64  static void nond
69a0: 65 74 65 72 6d 69 6e 69 73 74 69 63 46 75 6e 63  eterministicFunc
69b0: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 5f  tion(.  sqlite3_
69c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
69d0: 2c 20 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  , .  int argc,  
69e0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
69f0: 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 74 61   **argv.){.  sta
6a00: 74 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  tic int cnt = 0;
6a10: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6a20: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 63  t_int(context, c
6a30: 6e 74 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nt++);.}../*.** 
6a40: 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
6a50: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20  create_function 
6a60: 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68  DB.**.** Call th
6a70: 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  e sqlite3_create
6a80: 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e  _function API on
6a90: 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
6aa0: 61 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20  ase in order.** 
6ab0: 74 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e 63  to create a func
6ac0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f  tion named "x_co
6ad0: 61 6c 65 73 63 65 22 2e 20 20 54 68 69 73 20 66  alesce".  This f
6ae0: 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65  unction does the
6af0: 20 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61   same thing.** a
6b00: 73 20 74 68 65 20 22 63 6f 61 6c 65 73 63 65 22  s the "coalesce"
6b10: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73   function.  This
6b20: 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 72   function also r
6b30: 65 67 69 73 74 65 72 73 20 61 6e 20 53 51 4c 20  egisters an SQL 
6b40: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65  function.** name
6b50: 64 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63  d "x_sqlite_exec
6b60: 22 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 73  " that invokes s
6b70: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 20 20  qlite3_exec().  
6b80: 49 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33  Invoking sqlite3
6b90: 5f 65 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74 68  _exec().** in th
6ba0: 69 73 20 77 61 79 20 69 73 20 69 6c 6c 65 67 61  is way is illega
6bb0: 6c 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20  l recursion and 
6bc0: 73 68 6f 75 6c 64 20 72 61 69 73 65 20 61 6e 20  should raise an 
6bd0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72  SQLITE_MISUSE er
6be0: 72 6f 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66 65  ror..** The effe
6bf0: 63 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f  ct is similar to
6c00: 20 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74   trying to use t
6c10: 68 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65  he same database
6c20: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d   connection from
6c30: 0a 2a 2a 20 74 77 6f 20 74 68 72 65 61 64 73 20  .** two threads 
6c40: 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
6c50: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
6c60: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
6c70: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
6c80: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
6c90: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
6ca0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6cb0: 6e 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20  nction function 
6cc0: 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73  while a query is
6cd0: 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20   in progress in 
6ce0: 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74  order.** to test
6cf0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55   the SQLITE_MISU
6d00: 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67  SE detection log
6d10: 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ic..*/.static in
6d20: 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75  t test_create_fu
6d30: 6e 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  nction(.  void *
6d40: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
6d50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
6d60: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
6d70: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
6d80: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
6d90: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
6da0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
6db0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
6dc0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
6dd0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
6de0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
6df0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
6e00: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
6e10: 69 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28  ite3 *db;..  if(
6e20: 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20   argc!=2 ){.    
6e30: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
6e40: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
6e50: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
6e60: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
6e70: 20 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c 20         " DB\"", 
6e80: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
6e90: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
6ea0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
6eb0: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
6ec0: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
6ed0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
6ee0: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
6ef0: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78  _function(db, "x
6f00: 5f 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20  _coalesce", -1, 
6f10: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
6f20: 0a 20 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75  .        t1_ifnu
6f30: 6c 6c 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  llFunc, 0, 0);. 
6f40: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6f50: 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
6f60: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6f70: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38  nction(db, "hex8
6f80: 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
6f90: 38 20 7c 20 53 51 4c 49 54 45 5f 44 45 54 45 52  8 | SQLITE_DETER
6fa0: 4d 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20  MINISTIC,.      
6fb0: 20 20 20 20 30 2c 20 68 65 78 38 46 75 6e 63 2c      0, hex8Func,
6fc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 69 66 6e   0, 0);.  }.#ifn
6fd0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6fe0: 55 54 46 31 36 0a 20 20 69 66 28 20 72 63 3d 3d  UTF16.  if( rc==
6ff0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7000: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7010: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7020: 2c 20 22 68 65 78 31 36 22 2c 20 31 2c 20 53 51  , "hex16", 1, SQ
7030: 4c 49 54 45 5f 55 54 46 31 36 20 7c 20 53 51 4c  LITE_UTF16 | SQL
7040: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
7050: 43 2c 0a 20 20 20 20 20 20 20 20 20 20 30 2c 20  C,.          0, 
7060: 68 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30 29  hex16Func, 0, 0)
7070: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69  ;.  }.#endif.  i
7080: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7090: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
70a0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
70b0: 74 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32 31  tion(db, "tkt221
70c0: 33 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49 54  3func", 1, SQLIT
70d0: 45 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20  E_ANY, 0, .     
70e0: 20 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e 63       tkt2213Func
70f0: 74 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tion, 0, 0);.  }
7100: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
7110: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
7120: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7130: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70 6f  function(db, "po
7140: 69 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20 34  inter_change", 4
7150: 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c  , SQLITE_ANY, 0,
7160: 20 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 43   .          ptrC
7170: 68 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  hngFunction, 0, 
7180: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 75  0);.  }..  /* Fu
7190: 6e 63 74 69 6f 6e 73 20 63 6f 75 6e 74 65 72 31  nctions counter1
71a0: 28 29 20 61 6e 64 20 63 6f 75 6e 74 65 72 32 28  () and counter2(
71b0: 29 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20  ) have the same 
71c0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2d  implementation -
71d0: 20 74 68 65 79 0a 20 20 2a 2a 20 62 6f 74 68 20   they.  ** both 
71e0: 72 65 74 75 72 6e 20 61 6e 20 61 73 63 65 6e 64  return an ascend
71f0: 69 6e 67 20 69 6e 74 65 67 65 72 20 77 69 74 68  ing integer with
7200: 20 65 61 63 68 20 63 61 6c 6c 2e 20 20 42 75 74   each call.  But
7210: 20 63 6f 75 6e 74 65 72 31 28 29 20 69 73 20 6d   counter1() is m
7220: 61 72 6b 65 64 0a 20 20 2a 2a 20 61 73 20 6e 6f  arked.  ** as no
7230: 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20  n-deterministic 
7240: 61 6e 64 20 63 6f 75 6e 74 65 72 32 28 29 20 69  and counter2() i
7250: 73 20 6d 61 72 6b 65 64 20 61 73 20 64 65 74 65  s marked as dete
7260: 72 6d 69 6e 69 73 74 69 63 2e 0a 20 20 2a 2f 0a  rministic..  */.
7270: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7280: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7290: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
72a0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 63 6f 75  unction(db, "cou
72b0: 6e 74 65 72 31 22 2c 20 2d 31 2c 20 53 51 4c 49  nter1", -1, SQLI
72c0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
72d0: 20 20 20 30 2c 20 6e 6f 6e 64 65 74 65 72 6d 69     0, nondetermi
72e0: 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e 2c 20  nisticFunction, 
72f0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  0, 0);.  }.  if(
7300: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
7310: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
7320: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
7330: 6f 6e 28 64 62 2c 20 22 63 6f 75 6e 74 65 72 32  on(db, "counter2
7340: 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  ", -1, SQLITE_UT
7350: 46 38 7c 53 51 4c 49 54 45 5f 44 45 54 45 52 4d  F8|SQLITE_DETERM
7360: 49 4e 49 53 54 49 43 2c 0a 20 20 20 20 20 20 20  INISTIC,.       
7370: 20 20 20 30 2c 20 6e 6f 6e 64 65 74 65 72 6d 69     0, nondetermi
7380: 6e 69 73 74 69 63 46 75 6e 63 74 69 6f 6e 2c 20  nisticFunction, 
7390: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e  0, 0);.  }..#ifn
73a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
73b0: 55 54 46 31 36 0a 20 20 2f 2a 20 55 73 65 20 74  UTF16.  /* Use t
73c0: 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  he sqlite3_creat
73d0: 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 29 20 41  e_function16() A
73e0: 50 49 20 68 65 72 65 2e 20 4d 61 69 6e 6c 79 20  PI here. Mainly 
73f0: 66 6f 72 20 66 75 6e 2c 20 62 75 74 20 61 6c 73  for fun, but als
7400: 6f 20 0a 20 20 2a 2a 20 62 65 63 61 75 73 65 20  o .  ** because 
7410: 69 74 20 69 73 20 6e 6f 74 20 74 65 73 74 65 64  it is not tested
7420: 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65 2e 20   anywhere else. 
7430: 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  */.  if( rc==SQL
7440: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f  ITE_OK ){.    co
7450: 6e 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36  nst void *zUtf16
7460: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61  ;.    sqlite3_va
7470: 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 20 20 73  lue *pVal;.    s
7480: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7490: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
74a0: 20 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65     pVal = sqlite
74b0: 33 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20  3ValueNew(db);. 
74c0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53     sqlite3ValueS
74d0: 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
74e0: 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22 2c  "x_sqlite_exec",
74f0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51   SQLITE_UTF8, SQ
7500: 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
7510: 20 20 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74    zUtf16 = sqlit
7520: 65 33 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c  e3ValueText(pVal
7530: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
7540: 54 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64  TIVE);.    if( d
7550: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
7560: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
7570: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
7580: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
7590: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
75a0: 5f 66 75 6e 63 74 69 6f 6e 31 36 28 64 62 2c 20  _function16(db, 
75b0: 7a 55 74 66 31 36 2c 20 0a 20 20 20 20 20 20 20  zUtf16, .       
75c0: 20 20 20 20 20 20 20 20 20 31 2c 20 53 51 4c 49           1, SQLI
75d0: 54 45 5f 55 54 46 31 36 2c 20 64 62 2c 20 73 71  TE_UTF16, db, sq
75e0: 6c 69 74 65 33 45 78 65 63 46 75 6e 63 2c 20 30  lite3ExecFunc, 0
75f0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
7600: 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
7610: 28 70 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  (pVal);.    sqli
7620: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7630: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
7640: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 73 71  #endif..  if( sq
7650: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
7660: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
7670: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
7680: 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  ROR;.  Tcl_SetRe
7690: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
76a0: 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
76b0: 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
76c0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
76d0: 0a 2a 2a 20 52 6f 75 74 69 6e 65 73 20 74 6f 20  .** Routines to 
76e0: 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 78 5f  implement the x_
76f0: 63 6f 75 6e 74 28 29 20 61 67 67 72 65 67 61 74  count() aggregat
7700: 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  e function..**.*
7710: 2a 20 78 5f 63 6f 75 6e 74 28 29 20 63 6f 75 6e  * x_count() coun
7720: 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ts the number of
7730: 20 6e 6f 6e 2d 6e 75 6c 6c 20 61 72 67 75 6d 65   non-null argume
7740: 6e 74 73 2e 20 20 42 75 74 20 74 68 65 72 65 20  nts.  But there 
7750: 61 72 65 0a 2a 2a 20 73 6f 6d 65 20 74 77 69 73  are.** some twis
7760: 74 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70  ts for testing p
7770: 75 72 70 6f 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  urposes..**.** I
7780: 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
7790: 6f 20 78 5f 63 6f 75 6e 74 28 29 20 69 73 20 34  o x_count() is 4
77a0: 30 20 74 68 65 6e 20 61 20 55 54 46 2d 38 20 65  0 then a UTF-8 e
77b0: 72 72 6f 72 20 69 73 20 72 65 70 6f 72 74 65 64  rror is reported
77c0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 65 70 20  .** on the step 
77d0: 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20 78 5f  function.  If x_
77e0: 63 6f 75 6e 74 28 34 31 29 20 69 73 20 73 65 65  count(41) is see
77f0: 6e 2c 20 74 68 65 6e 20 61 20 55 54 46 2d 31 36  n, then a UTF-16
7800: 20 65 72 72 6f 72 0a 2a 2a 20 69 73 20 72 65 70   error.** is rep
7810: 6f 72 74 65 64 20 6f 6e 20 74 68 65 20 73 74 65  orted on the ste
7820: 70 20 66 75 6e 63 74 69 6f 6e 2e 20 20 49 66 20  p function.  If 
7830: 74 68 65 20 74 6f 74 61 6c 20 63 6f 75 6e 74 20  the total count 
7840: 69 73 20 34 32 2c 20 74 68 65 6e 0a 2a 2a 20 61  is 42, then.** a
7850: 20 55 54 46 2d 38 20 65 72 72 6f 72 20 69 73 20   UTF-8 error is 
7860: 72 65 70 6f 72 74 65 64 20 6f 6e 20 74 68 65 20  reported on the 
7870: 66 69 6e 61 6c 69 7a 65 20 66 75 6e 63 74 69 6f  finalize functio
7880: 6e 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  n..*/.typedef st
7890: 72 75 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20  ruct t1CountCtx 
78a0: 74 31 43 6f 75 6e 74 43 74 78 3b 0a 73 74 72 75  t1CountCtx;.stru
78b0: 63 74 20 74 31 43 6f 75 6e 74 43 74 78 20 7b 0a  ct t1CountCtx {.
78c0: 20 20 69 6e 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74    int n;.};.stat
78d0: 69 63 20 76 6f 69 64 20 74 31 43 6f 75 6e 74 53  ic void t1CountS
78e0: 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  tep(.  sqlite3_c
78f0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
7900: 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73  .  int argc,.  s
7910: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
7920: 72 67 76 0a 29 7b 0a 20 20 74 31 43 6f 75 6e 74  rgv.){.  t1Count
7930: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
7940: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
7950: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
7960: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
7970: 69 66 28 20 28 61 72 67 63 3d 3d 30 20 7c 7c 20  if( (argc==0 || 
7980: 53 51 4c 49 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c  SQLITE_NULL!=sql
7990: 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28  ite3_value_type(
79a0: 61 72 67 76 5b 30 5d 29 20 29 20 26 26 20 70 20  argv[0]) ) && p 
79b0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20  ){.    p->n++;. 
79c0: 20 7d 0a 20 20 69 66 28 20 61 72 67 63 3e 30 20   }.  if( argc>0 
79d0: 29 7b 0a 20 20 20 20 69 6e 74 20 76 20 3d 20 73  ){.    int v = s
79e0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
79f0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69  (argv[0]);.    i
7a00: 66 28 20 76 3d 3d 34 30 20 29 7b 0a 20 20 20 20  f( v==40 ){.    
7a10: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7a20: 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20  _error(context, 
7a30: 22 76 61 6c 75 65 20 6f 66 20 34 30 20 68 61 6e  "value of 40 han
7a40: 64 65 64 20 74 6f 20 78 5f 63 6f 75 6e 74 22 2c  ded to x_count",
7a50: 20 2d 31 29 3b 0a 23 69 66 6e 64 65 66 20 53 51   -1);.#ifndef SQ
7a60: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
7a70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 3d      }else if( v=
7a80: 3d 34 31 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e  =41 ){.      con
7a90: 73 74 20 63 68 61 72 20 7a 55 74 66 31 36 45 72  st char zUtf16Er
7aa0: 72 4d 73 67 5b 5d 20 3d 20 7b 20 30 2c 20 30 78  rMsg[] = { 0, 0x
7ab0: 36 31 2c 20 30 2c 20 30 78 36 32 2c 20 30 2c 20  61, 0, 0x62, 0, 
7ac0: 30 78 36 33 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a  0x63, 0, 0, 0};.
7ad0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65        sqlite3_re
7ae0: 73 75 6c 74 5f 65 72 72 6f 72 31 36 28 63 6f 6e  sult_error16(con
7af0: 74 65 78 74 2c 20 26 7a 55 74 66 31 36 45 72 72  text, &zUtf16Err
7b00: 4d 73 67 5b 31 2d 53 51 4c 49 54 45 5f 42 49 47  Msg[1-SQLITE_BIG
7b10: 45 4e 44 49 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65  ENDIAN], -1);.#e
7b20: 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ndif.    }.  }.}
7b30: 20 20 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20     .static void 
7b40: 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 28  t1CountFinalize(
7b50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
7b60: 2a 63 6f 6e 74 65 78 74 29 7b 0a 20 20 74 31 43  *context){.  t1C
7b70: 6f 75 6e 74 43 74 78 20 2a 70 3b 0a 20 20 70 20  ountCtx *p;.  p 
7b80: 3d 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67  = sqlite3_aggreg
7b90: 61 74 65 5f 63 6f 6e 74 65 78 74 28 63 6f 6e 74  ate_context(cont
7ba0: 65 78 74 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  ext, sizeof(*p))
7bb0: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
7bc0: 20 69 66 28 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b   if( p->n==42 ){
7bd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
7be0: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
7bf0: 65 78 74 2c 20 22 78 5f 63 6f 75 6e 74 20 74 6f  ext, "x_count to
7c00: 74 61 6c 73 20 74 6f 20 34 32 22 2c 20 2d 31 29  tals to 42", -1)
7c10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
7c20: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7c30: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 70  t_int(context, p
7c40: 20 3f 20 70 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20   ? p->n : 0);.  
7c50: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64    }.  }.}..#ifnd
7c60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
7c70: 45 50 52 45 43 41 54 45 44 0a 73 74 61 74 69 63  EPRECATED.static
7c80: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7c90: 74 53 74 65 70 28 0a 20 20 73 71 6c 69 74 65 33  tStep(.  sqlite3
7ca0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
7cb0: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
7cc0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
7cd0: 2a 61 72 67 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f  *argv.){.  /* no
7ce0: 2d 6f 70 20 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63  -op */.}..static
7cf0: 20 76 6f 69 64 20 6c 65 67 61 63 79 43 6f 75 6e   void legacyCoun
7d00: 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69 74 65  tFinalize(sqlite
7d10: 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65  3_context *conte
7d20: 78 74 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 72  xt){.  sqlite3_r
7d30: 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65 78  esult_int(contex
7d40: 74 2c 20 73 71 6c 69 74 65 33 5f 61 67 67 72 65  t, sqlite3_aggre
7d50: 67 61 74 65 5f 63 6f 75 6e 74 28 63 6f 6e 74 65  gate_count(conte
7d60: 78 74 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  xt));.}.#endif..
7d70: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
7d80: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67 67  lite3_create_agg
7d90: 72 65 67 61 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20  regate DB.**.** 
7da0: 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74 65 33  Call the sqlite3
7db0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
7dc0: 20 41 50 49 20 6f 6e 20 74 68 65 20 67 69 76 65   API on the give
7dd0: 6e 20 64 61 74 61 62 61 73 65 20 69 6e 20 6f 72  n database in or
7de0: 64 65 72 0a 2a 2a 20 74 6f 20 63 72 65 61 74 65  der.** to create
7df0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65   a function name
7e00: 64 20 22 78 5f 63 6f 75 6e 74 22 2e 20 20 54 68  d "x_count".  Th
7e10: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 73  is function is s
7e20: 69 6d 69 6c 61 72 0a 2a 2a 20 74 6f 20 74 68 65  imilar.** to the
7e30: 20 62 75 69 6c 74 2d 69 6e 20 63 6f 75 6e 74 28   built-in count(
7e40: 29 20 66 75 6e 63 74 69 6f 6e 2c 20 77 69 74 68  ) function, with
7e50: 20 61 20 66 65 77 20 73 70 65 63 69 61 6c 20 71   a few special q
7e60: 75 69 72 6b 73 0a 2a 2a 20 66 6f 72 20 74 65 73  uirks.** for tes
7e70: 74 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  ting the sqlite3
7e80: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 29 20  _result_error() 
7e90: 41 50 49 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  APIs..**.** The 
7ea0: 6f 72 69 67 69 6e 61 6c 20 6d 6f 74 69 76 61 74  original motivat
7eb0: 69 6f 6e 20 66 6f 72 20 74 68 69 73 20 72 6f 75  ion for this rou
7ec0: 74 69 6e 65 20 77 61 73 20 74 6f 20 62 65 20 61  tine was to be a
7ed0: 62 6c 65 20 74 6f 20 63 61 6c 6c 20 74 68 65 0a  ble to call the.
7ee0: 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  ** sqlite3_creat
7ef0: 65 5f 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e_aggregate func
7f00: 74 69 6f 6e 20 77 68 69 6c 65 20 61 20 71 75 65  tion while a que
7f10: 72 79 20 69 73 20 69 6e 20 70 72 6f 67 72 65 73  ry is in progres
7f20: 73 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74 6f  s in order.** to
7f30: 20 74 65 73 74 20 74 68 65 20 53 51 4c 49 54 45   test the SQLITE
7f40: 5f 4d 49 53 55 53 45 20 64 65 74 65 63 74 69 6f  _MISUSE detectio
7f50: 6e 20 6c 6f 67 69 63 2e 20 20 53 65 65 20 6d 69  n logic.  See mi
7f60: 73 75 73 65 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a  suse.test..**.**
7f70: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
7f80: 73 20 6c 61 74 65 72 20 65 78 74 65 6e 64 65 64  s later extended
7f90: 20 74 6f 20 74 65 73 74 20 74 68 65 20 75 73 65   to test the use
7fa0: 20 6f 66 20 73 71 6c 69 74 65 33 5f 72 65 73 75   of sqlite3_resu
7fb0: 6c 74 5f 65 72 72 6f 72 28 29 0a 2a 2a 20 77 69  lt_error().** wi
7fc0: 74 68 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  thin aggregate f
7fd0: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  unctions..**.** 
7fe0: 4c 61 74 65 72 3a 20 49 74 20 69 73 20 6e 6f 77  Later: It is now
7ff0: 20 61 6c 73 6f 20 65 78 74 65 6e 64 65 64 20 74   also extended t
8000: 6f 20 72 65 67 69 73 74 65 72 20 74 68 65 20 61  o register the a
8010: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
8020: 6e 0a 2a 2a 20 22 6c 65 67 61 63 79 5f 63 6f 75  n.** "legacy_cou
8030: 6e 74 28 29 22 20 77 69 74 68 20 74 68 65 20 73  nt()" with the s
8040: 75 70 70 6c 69 65 64 20 64 61 74 61 62 61 73 65  upplied database
8050: 20 68 61 6e 64 6c 65 2e 20 54 68 69 73 20 69 73   handle. This is
8060: 20 75 73 65 64 0a 2a 2a 20 74 6f 20 74 65 73 74   used.** to test
8070: 20 74 68 65 20 64 65 70 72 65 63 61 74 65 64 20   the deprecated 
8080: 73 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74  sqlite3_aggregat
8090: 65 5f 63 6f 75 6e 74 28 29 20 41 50 49 2e 0a 2a  e_count() API..*
80a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
80b0: 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  t_create_aggrega
80c0: 74 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  te(.  void *NotU
80d0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
80e0: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
80f0: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
8100: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
8110: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
8120: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
8130: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
8140: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8150: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
8160: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
8170: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
8180: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
8190: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
81a0: 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72 67 63  t rc;.  if( argc
81b0: 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
81c0: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
81d0: 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
81e0: 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
81f0: 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20  , argv[0],.     
8200: 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c    " FILENAME\"",
8210: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8220: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8230: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
8240: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
8250: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
8260: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
8270: 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
8280: 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
8290: 78 5f 63 6f 75 6e 74 22 2c 20 30 2c 20 53 51 4c  x_count", 0, SQL
82a0: 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a  ITE_UTF8, 0, 0,.
82b0: 20 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65        t1CountSte
82c0: 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a  p,t1CountFinaliz
82d0: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
82e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
82f0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
8300: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20  te_function(db, 
8310: 22 78 5f 63 6f 75 6e 74 22 2c 20 31 2c 20 53 51  "x_count", 1, SQ
8320: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c  LITE_UTF8, 0, 0,
8330: 0a 20 20 20 20 20 20 20 20 74 31 43 6f 75 6e 74  .        t1Count
8340: 53 74 65 70 2c 74 31 43 6f 75 6e 74 46 69 6e 61  Step,t1CountFina
8350: 6c 69 7a 65 29 3b 0a 20 20 7d 0a 23 69 66 6e 64  lize);.  }.#ifnd
8360: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
8370: 45 50 52 45 43 41 54 45 44 0a 20 20 69 66 28 20  EPRECATED.  if( 
8380: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
8390: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
83a0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
83b0: 6e 28 64 62 2c 20 22 6c 65 67 61 63 79 5f 63 6f  n(db, "legacy_co
83c0: 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  unt", 0, SQLITE_
83d0: 41 4e 59 2c 20 30 2c 20 30 2c 0a 20 20 20 20 20  ANY, 0, 0,.     
83e0: 20 20 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74     legacyCountSt
83f0: 65 70 2c 20 6c 65 67 61 63 79 43 6f 75 6e 74 46  ep, legacyCountF
8400: 69 6e 61 6c 69 7a 65 0a 20 20 20 20 29 3b 0a 20  inalize.    );. 
8410: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20   }.#endif.  if( 
8420: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
8430: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
8440: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
8450: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74  ERROR;.  Tcl_Set
8460: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
8470: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
8480: 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
8490: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
84a0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 70  ./*.** Usage:  p
84b0: 72 69 6e 74 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a  rintf TEXT.**.**
84c0: 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20   Send output to 
84d0: 70 72 69 6e 74 66 2e 20 20 55 73 65 20 74 68 69  printf.  Use thi
84e0: 73 20 72 61 74 68 65 72 20 74 68 61 6e 20 70 75  s rather than pu
84f0: 74 73 20 74 6f 20 6d 65 72 67 65 20 74 68 65 20  ts to merge the 
8500: 6f 75 74 70 75 74 0a 2a 2a 20 69 6e 20 74 68 65  output.** in the
8510: 20 63 6f 72 72 65 63 74 20 73 65 71 75 65 6e 63   correct sequenc
8520: 65 20 77 69 74 68 20 64 65 62 75 67 67 69 6e 67  e with debugging
8530: 20 70 72 69 6e 74 66 73 20 69 6e 73 65 72 74 65   printfs inserte
8540: 64 20 69 6e 74 6f 20 43 20 63 6f 64 65 2e 0a 2a  d into C code..*
8550: 2a 20 50 75 74 73 20 75 73 65 73 20 61 20 73 65  * Puts uses a se
8560: 70 61 72 61 74 65 20 62 75 66 66 65 72 20 61 6e  parate buffer an
8570: 64 20 64 65 62 75 67 67 69 6e 67 20 73 74 61 74  d debugging stat
8580: 65 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 6f  ements will be o
8590: 75 74 20 6f 66 0a 2a 2a 20 73 65 71 75 65 6e 63  ut of.** sequenc
85a0: 65 20 69 66 20 69 74 20 69 73 20 75 73 65 64 2e  e if it is used.
85b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
85c0: 65 73 74 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f  est_printf(.  vo
85d0: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
85e0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
85f0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
8600: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
8610: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
8620: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
8630: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
8640: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
8650: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
8660: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
8670: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
8680: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
8690: 2f 0a 29 7b 0a 20 20 69 66 28 20 61 72 67 63 21  /.){.  if( argc!
86a0: 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
86b0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
86c0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
86d0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
86e0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
86f0: 20 22 20 54 45 58 54 5c 22 22 2c 20 30 29 3b 0a   " TEXT\"", 0);.
8700: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
8710: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 72 69 6e  RROR;.  }.  prin
8720: 74 66 28 22 25 73 5c 6e 22 2c 20 61 72 67 76 5b  tf("%s\n", argv[
8730: 31 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1]);.  return TC
8740: 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a  L_OK;.}..../*.**
8750: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8760: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20 46 4f 52  _mprintf_int FOR
8770: 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45  MAT INTEGER INTE
8780: 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a  GER INTEGER.**.*
8790: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
87a0: 69 74 68 20 74 68 72 65 65 20 69 6e 74 65 67 65  ith three intege
87b0: 72 20 61 72 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73  r arguments.*/.s
87c0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
87d0: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 28 0a 20  3_mprintf_int(. 
87e0: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
87f0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8800: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8810: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8820: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8830: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8840: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8850: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
8860: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
8870: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
8880: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
8890: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
88a0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b  t */.){.  int a[
88b0: 33 5d 2c 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a  3], i;.  char *z
88c0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20  ;.  if( argc!=5 
88d0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
88e0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
88f0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
8900: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
8910: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
8920: 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 49  FORMAT INT INT I
8930: 4e 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  NT\"", 0);.    r
8940: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
8950: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
8960: 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<5; i++){.    i
8970: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
8980: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
8990: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
89a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
89b0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
89c0: 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20 61  rintf(argv[1], a
89d0: 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 29  [0], a[1], a[2])
89e0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
89f0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
8a00: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
8a10: 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20  ee(z);.  return 
8a20: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
8a30: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
8a40: 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 20 46  _mprintf_int64 F
8a50: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
8a60: 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a  TEGER INTEGER.**
8a70: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8a80: 20 77 69 74 68 20 74 68 72 65 65 20 36 34 2d 62   with three 64-b
8a90: 69 74 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d  it integer argum
8aa0: 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ents.*/.static i
8ab0: 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  nt sqlite3_mprin
8ac0: 74 66 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  tf_int64(.  void
8ad0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
8ae0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
8af0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
8b00: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
8b10: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
8b20: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
8b30: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
8b40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8b50: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
8b60: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
8b70: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
8b80: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
8b90: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
8ba0: 6c 69 74 65 5f 69 6e 74 36 34 20 61 5b 33 5d 3b  lite_int64 a[3];
8bb0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66  .  char *z;.  if
8bc0: 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
8bd0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8be0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
8bf0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
8c00: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
8c10: 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54  .       " FORMAT
8c20: 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c   INT INT INT\"",
8c30: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
8c40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
8c50: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69   for(i=2; i<5; i
8c60: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c  ++){.    if( sql
8c70: 69 74 65 33 41 74 6f 69 36 34 28 61 72 67 76 5b  ite3Atoi64(argv[
8c80: 69 5d 2c 20 26 61 5b 69 2d 32 5d 2c 20 31 30 30  i], &a[i-2], 100
8c90: 30 30 30 30 2c 20 53 51 4c 49 54 45 5f 55 54 46  0000, SQLITE_UTF
8ca0: 38 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f  8) ){.      Tcl_
8cb0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
8cc0: 65 72 70 2c 20 22 61 72 67 75 6d 65 6e 74 20 69  erp, "argument i
8cd0: 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 36 34  s not a valid 64
8ce0: 2d 62 69 74 20 69 6e 74 65 67 65 72 22 2c 20 30  -bit integer", 0
8cf0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8d00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
8d10: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
8d20: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
8d30: 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20  1], a[0], a[1], 
8d40: 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70  a[2]);.  Tcl_App
8d50: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
8d60: 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  , z, 0);.  sqlit
8d70: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65  e3_free(z);.  re
8d80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
8d90: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
8da0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
8db0: 6e 67 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ng FORMAT INTEGE
8dc0: 52 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  R INTEGER INTEGE
8dd0: 52 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  R.**.** Call mpr
8de0: 69 6e 74 66 20 77 69 74 68 20 74 68 72 65 65 20  intf with three 
8df0: 6c 6f 6e 67 20 69 6e 74 65 67 65 72 20 61 72 67  long integer arg
8e00: 75 6d 65 6e 74 73 2e 20 20 20 54 68 69 73 20 6d  uments.   This m
8e10: 69 67 68 74 20 62 65 20 74 68 65 0a 2a 2a 20 73  ight be the.** s
8e20: 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f 6d  ame as sqlite3_m
8e30: 70 72 69 6e 74 66 5f 69 6e 74 20 6f 72 20 73 71  printf_int or sq
8e40: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
8e50: 74 36 34 2c 20 64 65 70 65 6e 64 69 6e 67 20 6f  t64, depending o
8e60: 6e 0a 2a 2a 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a  n.** platform..*
8e70: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
8e80: 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e  ite3_mprintf_lon
8e90: 67 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73  g(.  void *NotUs
8ea0: 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ed,.  Tcl_Interp
8eb0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
8ec0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
8ed0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
8ee0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
8ef0: 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20  .  int argc,    
8f00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
8f10: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8f20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67   */.  char **arg
8f30: 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  v            /* 
8f40: 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67  Text of each arg
8f50: 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ument */.){.  in
8f60: 74 20 69 3b 0a 20 20 6c 6f 6e 67 20 69 6e 74 20  t i;.  long int 
8f70: 61 5b 33 5d 3b 0a 20 20 69 6e 74 20 62 5b 33 5d  a[3];.  int b[3]
8f80: 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  ;.  char *z;.  i
8f90: 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20  f( argc!=5 ){.  
8fa0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
8fb0: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
8fc0: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
8fd0: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
8fe0: 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41  ,.       " FORMA
8ff0: 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22 22  T INT INT INT\""
9000: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
9010: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9020: 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b 20    for(i=2; i<5; 
9030: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63  i++){.    if( Tc
9040: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9050: 20 61 72 67 76 5b 69 5d 2c 20 26 62 5b 69 2d 32   argv[i], &b[i-2
9060: 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  ]) ) return TCL_
9070: 45 52 52 4f 52 3b 0a 20 20 20 20 61 5b 69 2d 32  ERROR;.    a[i-2
9080: 5d 20 3d 20 28 6c 6f 6e 67 20 69 6e 74 29 62 5b  ] = (long int)b[
9090: 69 2d 32 5d 3b 0a 20 20 20 20 61 5b 69 2d 32 5d  i-2];.    a[i-2]
90a0: 20 26 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 28   &= (((u64)1)<<(
90b0: 73 69 7a 65 6f 66 28 69 6e 74 29 2a 38 29 29 2d  sizeof(int)*8))-
90c0: 31 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  1;.  }.  z = sql
90d0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
90e0: 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d  v[1], a[0], a[1]
90f0: 2c 20 61 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 41  , a[2]);.  Tcl_A
9100: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9110: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
9120: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
9130: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
9140: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
9150: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
9160: 73 74 72 20 46 4f 52 4d 41 54 20 49 4e 54 45 47  str FORMAT INTEG
9170: 45 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e  ER INTEGER STRIN
9180: 47 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72  G.**.** Call mpr
9190: 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e  intf with two in
91a0: 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20  teger arguments 
91b0: 61 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61  and one string a
91c0: 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69  rgument.*/.stati
91d0: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
91e0: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
91f0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9200: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9210: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9220: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9230: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9240: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9250: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9260: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9270: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
9280: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
9290: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
92a0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
92b0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
92c0: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
92d0: 69 66 28 20 61 72 67 63 3c 34 20 7c 7c 20 61 72  if( argc<4 || ar
92e0: 67 63 3e 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f  gc>5 ){.    Tcl_
92f0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
9300: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
9310: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
9320: 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20  ", argv[0],.    
9330: 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54 20     " FORMAT INT 
9340: 49 4e 54 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c  INT ?STRING?\"",
9350: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9360: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9370: 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b 20 69   for(i=2; i<4; i
9380: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c  ++){.    if( Tcl
9390: 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20  _GetInt(interp, 
93a0: 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d  argv[i], &a[i-2]
93b0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
93c0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20  RROR;.  }.  z = 
93d0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
93e0: 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61  argv[1], a[0], a
93f0: 5b 31 5d 2c 20 61 72 67 63 3e 34 20 3f 20 61 72  [1], argc>4 ? ar
9400: 67 76 5b 34 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20  gv[4] : NULL);. 
9410: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
9420: 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b  t(interp, z, 0);
9430: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
9440: 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  z);.  return TCL
9450: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
9460: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6e  age:  sqlite3_sn
9470: 70 72 69 6e 74 66 5f 73 74 72 20 49 4e 54 45 47  printf_str INTEG
9480: 45 52 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45  ER FORMAT INTEGE
9490: 52 20 49 4e 54 45 47 45 52 20 53 54 52 49 4e 47  R INTEGER STRING
94a0: 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69  .**.** Call mpri
94b0: 6e 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74  ntf with two int
94c0: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61  eger arguments a
94d0: 6e 64 20 6f 6e 65 20 73 74 72 69 6e 67 20 61 72  nd one string ar
94e0: 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  gument.*/.static
94f0: 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 6e 70   int sqlite3_snp
9500: 72 69 6e 74 66 5f 73 74 72 28 0a 20 20 76 6f 69  rintf_str(.  voi
9510: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
9520: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
9530: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
9540: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
9550: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
9560: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
9570: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
9580: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
9590: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
95a0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
95b0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
95c0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
95d0: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
95e0: 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 63 68  i;.  int n;.  ch
95f0: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67  ar *z;.  if( arg
9600: 63 3c 35 20 7c 7c 20 61 72 67 63 3e 36 20 29 7b  c<5 || argc>6 ){
9610: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9620: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
9630: 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
9640: 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76  uld be \"", argv
9650: 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 49 4e  [0],.       " IN
9660: 54 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54  T FORMAT INT INT
9670: 20 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29   ?STRING?\"", 0)
9680: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
9690: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
96a0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
96b0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 6e  erp, argv[1], &n
96c0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
96d0: 52 52 4f 52 3b 0a 20 20 69 66 28 20 6e 3c 30 20  RROR;.  if( n<0 
96e0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
96f0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9700: 22 4e 20 6d 75 73 74 20 62 65 20 6e 6f 6e 2d 6e  "N must be non-n
9710: 65 67 61 74 69 76 65 22 2c 20 30 29 3b 0a 20 20  egative", 0);.  
9720: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9730: 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  OR;.  }.  for(i=
9740: 33 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20  3; i<5; i++){.  
9750: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
9760: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d  (interp, argv[i]
9770: 2c 20 26 61 5b 69 2d 33 5d 29 20 29 20 72 65 74  , &a[i-3]) ) ret
9780: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9790: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
97a0: 5f 6d 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a  _malloc( n+1 );.
97b0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
97c0: 74 66 28 6e 2c 20 7a 2c 20 61 72 67 76 5b 32 5d  tf(n, z, argv[2]
97d0: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 72  , a[0], a[1], ar
97e0: 67 63 3e 34 20 3f 20 61 72 67 76 5b 35 5d 20 3a  gc>4 ? argv[5] :
97f0: 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c 5f 41 70   NULL);.  Tcl_Ap
9800: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9810: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
9820: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
9830: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9840: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
9850: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64  qlite3_mprintf_d
9860: 6f 75 62 6c 65 20 46 4f 52 4d 41 54 20 49 4e 54  ouble FORMAT INT
9870: 45 47 45 52 20 49 4e 54 45 47 45 52 20 44 4f 55  EGER INTEGER DOU
9880: 42 4c 45 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d  BLE.**.** Call m
9890: 70 72 69 6e 74 66 20 77 69 74 68 20 74 77 6f 20  printf with two 
98a0: 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74  integer argument
98b0: 73 20 61 6e 64 20 6f 6e 65 20 64 6f 75 62 6c 65  s and one double
98c0: 20 61 72 67 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61   argument.*/.sta
98d0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
98e0: 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 28 0a  mprintf_double(.
98f0: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
9900: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
9910: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
9920: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
9930: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
9940: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
9950: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
9960: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
9970: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
9980: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
9990: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
99a0: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
99b0: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 61  nt */.){.  int a
99c0: 5b 33 5d 2c 20 69 3b 0a 20 20 64 6f 75 62 6c 65  [3], i;.  double
99d0: 20 72 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20   r;.  char *z;. 
99e0: 20 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a   if( argc!=5 ){.
99f0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
9a00: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
9a10: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
9a20: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
9a30: 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52  0],.       " FOR
9a40: 4d 41 54 20 49 4e 54 20 49 4e 54 20 44 4f 55 42  MAT INT INT DOUB
9a50: 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  LE\"", 0);.    r
9a60: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9a70: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20  .  }.  for(i=2; 
9a80: 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  i<4; i++){.    i
9a90: 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e  f( Tcl_GetInt(in
9aa0: 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26  terp, argv[i], &
9ab0: 61 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72 6e  a[i-2]) ) return
9ac0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
9ad0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75    if( Tcl_GetDou
9ae0: 62 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ble(interp, argv
9af0: 5b 34 5d 2c 20 26 72 29 20 29 20 72 65 74 75 72  [4], &r) ) retur
9b00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
9b10: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
9b20: 74 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d  tf(argv[1], a[0]
9b30: 2c 20 61 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63  , a[1], r);.  Tc
9b40: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9b50: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9b60: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
9b70: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9b80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9b90: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
9ba0: 74 66 5f 73 63 61 6c 65 64 20 46 4f 52 4d 41 54  tf_scaled FORMAT
9bb0: 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45 0a 2a   DOUBLE DOUBLE.*
9bc0: 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74  *.** Call mprint
9bd0: 66 20 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20  f with a single 
9be0: 64 6f 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20  double argument 
9bf0: 77 68 69 63 68 20 69 73 20 74 68 65 20 70 72 6f  which is the pro
9c00: 64 75 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74  duct of the.** t
9c10: 77 6f 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76  wo arguments giv
9c20: 65 6e 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20  en above.  This 
9c30: 69 73 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72  is used to gener
9c40: 61 74 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64  ate overflow and
9c50: 20 75 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f   underflow.** do
9c60: 75 62 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68  ubles to test th
9c70: 61 74 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76  at they are conv
9c80: 65 72 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a  erted properly..
9c90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
9ca0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
9cb0: 61 6c 65 64 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  aled(.  void *No
9cc0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
9cd0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
9ce0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
9cf0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
9d00: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
9d10: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
9d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d30: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
9d40: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
9d50: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
9d60: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
9d70: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
9d80: 20 69 6e 74 20 69 3b 0a 20 20 64 6f 75 62 6c 65   int i;.  double
9d90: 20 72 5b 32 5d 3b 0a 20 20 63 68 61 72 20 2a 7a   r[2];.  char *z
9da0: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 34 20  ;.  if( argc!=4 
9db0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
9dc0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
9dd0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
9de0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
9df0: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
9e00: 46 4f 52 4d 41 54 20 44 4f 55 42 4c 45 20 44 4f  FORMAT DOUBLE DO
9e10: 55 42 4c 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20  UBLE\"", 0);.   
9e20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
9e30: 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 32  R;.  }.  for(i=2
9e40: 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<4; i++){.   
9e50: 20 69 66 28 20 54 63 6c 5f 47 65 74 44 6f 75 62   if( Tcl_GetDoub
9e60: 6c 65 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  le(interp, argv[
9e70: 69 5d 2c 20 26 72 5b 69 2d 32 5d 29 20 29 20 72  i], &r[i-2]) ) r
9e80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
9e90: 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74  .  }.  z = sqlit
9ea0: 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b  e3_mprintf(argv[
9eb0: 31 5d 2c 20 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a  1], r[0]*r[1]);.
9ec0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
9ed0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
9ee0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
9ef0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
9f00: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
9f10: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
9f20: 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 20 46  printf_stronly F
9f30: 4f 52 4d 41 54 20 53 54 52 49 4e 47 0a 2a 2a 0a  ORMAT STRING.**.
9f40: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
9f50: 77 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f  with a single do
9f60: 75 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68  uble argument wh
9f70: 69 63 68 20 69 73 20 74 68 65 20 70 72 6f 64 75  ich is the produ
9f80: 63 74 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f  ct of the.** two
9f90: 20 61 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e   arguments given
9fa0: 20 61 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73   above.  This is
9fb0: 20 75 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74   used to generat
9fc0: 65 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75  e overflow and u
9fd0: 6e 64 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62  nderflow.** doub
9fe0: 6c 65 73 20 74 6f 20 74 65 73 74 20 74 68 61 74  les to test that
9ff0: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72   they are conver
a000: 74 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  ted properly..*/
a010: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
a020: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
a030: 6e 6c 79 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  nly(.  void *Not
a040: 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
a050: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
a060: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
a070: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
a080: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
a090: 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
a0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
a0b0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
a0c0: 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
a0d0: 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
a0e0: 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
a0f0: 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
a100: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
a110: 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
a120: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
a130: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
a140: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
a150: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
a160: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 53 54       " FORMAT ST
a170: 52 49 4e 47 5c 22 22 2c 20 30 29 3b 0a 20 20 20  RING\"", 0);.   
a180: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
a190: 52 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c  R;.  }.  z = sql
a1a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67  ite3_mprintf(arg
a1b0: 76 5b 31 5d 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  v[1], argv[2]);.
a1c0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
a1d0: 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29  lt(interp, z, 0)
a1e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
a1f0: 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  (z);.  return TC
a200: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
a210: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d  sage:  sqlite3_m
a220: 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
a230: 20 46 4f 52 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a   FORMAT HEX.**.*
a240: 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77  * Call mprintf w
a250: 69 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75  ith a single dou
a260: 62 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69  ble argument whi
a270: 63 68 20 69 73 20 64 65 72 69 76 65 64 20 66 72  ch is derived fr
a280: 6f 6d 20 74 68 65 0a 2a 2a 20 68 65 78 61 64 65  om the.** hexade
a290: 63 69 6d 61 6c 20 65 6e 63 6f 64 69 6e 67 20 6f  cimal encoding o
a2a0: 66 20 61 6e 20 49 45 45 45 20 64 6f 75 62 6c 65  f an IEEE double
a2b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a2c0: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f  sqlite3_mprintf_
a2d0: 68 65 78 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69  hexdouble(.  voi
a2e0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
a2f0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
a300: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
a310: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
a320: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
a330: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
a340: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
a350: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
a360: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
a370: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
a380: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
a390: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
a3a0: 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  .){.  char *z;. 
a3b0: 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 75 6e 73   double r;.  uns
a3c0: 69 67 6e 65 64 20 69 6e 74 20 78 31 2c 20 78 32  igned int x1, x2
a3d0: 3b 0a 20 20 73 71 6c 69 74 65 5f 75 69 6e 74 36  ;.  sqlite_uint6
a3e0: 34 20 64 3b 0a 20 20 69 66 28 20 61 72 67 63 21  4 d;.  if( argc!
a3f0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
a400: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
a410: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
a420: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
a430: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
a440: 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47   " FORMAT STRING
a450: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
a460: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a470: 20 7d 0a 20 20 69 66 28 20 73 73 63 61 6e 66 28   }.  if( sscanf(
a480: 61 72 67 76 5b 32 5d 2c 20 22 25 30 38 78 25 30  argv[2], "%08x%0
a490: 38 78 22 2c 20 26 78 32 2c 20 26 78 31 29 21 3d  8x", &x2, &x1)!=
a4a0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
a4b0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
a4c0: 2c 20 22 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  , "2nd argument 
a4d0: 73 68 6f 75 6c 64 20 62 65 20 31 36 2d 63 68 61  should be 16-cha
a4e0: 72 61 63 74 65 72 73 20 6f 66 20 68 65 78 22 2c  racters of hex",
a4f0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
a500: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
a510: 20 64 20 3d 20 78 32 3b 0a 20 20 64 20 3d 20 28   d = x2;.  d = (
a520: 64 3c 3c 33 32 29 20 2b 20 78 31 3b 0a 20 20 6d  d<<32) + x1;.  m
a530: 65 6d 63 70 79 28 26 72 2c 20 26 64 2c 20 73 69  emcpy(&r, &d, si
a540: 7a 65 6f 66 28 72 29 29 3b 0a 20 20 7a 20 3d 20  zeof(r));.  z = 
a550: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
a560: 61 72 67 76 5b 31 5d 2c 20 72 29 3b 0a 20 20 54  argv[1], r);.  T
a570: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
a580: 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20  interp, z, 0);. 
a590: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
a5a0: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
a5b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
a5c0: 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  e: sqlite3_enabl
a5d0: 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65 20 3f  e_shared_cache ?
a5e0: 42 4f 4f 4c 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23  BOOLEAN?.**.*/.#
a5f0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
a600: 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45 44 5f 43  TE_OMIT_SHARED_C
a610: 41 43 48 45 29 0a 73 74 61 74 69 63 20 69 6e 74  ACHE).static int
a620: 20 74 65 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61   test_enable_sha
a630: 72 65 64 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  red(.  ClientDat
a640: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
a650: 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
a660: 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
a670: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
a680: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
a690: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
a6a0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
a6b0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
a6c0: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
a6d0: 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
a6e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
a6f0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
a700: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
a710: 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
a720: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
a730: 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 65   int rc;.  int e
a740: 6e 61 62 6c 65 3b 0a 20 20 69 6e 74 20 72 65 74  nable;.  int ret
a750: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a   = 0;..  if( obj
a760: 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=2 && objc!=1 
a770: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
a780: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a790: 31 2c 20 6f 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45  1, objv, "?BOOLE
a7a0: 41 4e 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AN?");.    retur
a7b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
a7c0: 0a 20 20 72 65 74 20 3d 20 73 71 6c 69 74 65 33  .  ret = sqlite3
a7d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61  GlobalConfig.sha
a7e0: 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64 3b  redCacheEnabled;
a7f0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 32 20  ..  if( objc==2 
a800: 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47  ){.    if( Tcl_G
a810: 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
a820: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d  (interp, objv[1]
a830: 2c 20 26 65 6e 61 62 6c 65 29 20 29 7b 0a 20 20  , &enable) ){.  
a840: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
a850: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
a860: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 6e 61  rc = sqlite3_ena
a870: 62 6c 65 5f 73 68 61 72 65 64 5f 63 61 63 68 65  ble_shared_cache
a880: 28 65 6e 61 62 6c 65 29 3b 0a 20 20 20 20 69 66  (enable);.    if
a890: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
a8a0: 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  ){.      Tcl_Set
a8b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
a8c0: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72  char *)sqlite3Er
a8d0: 72 53 74 72 28 72 63 29 2c 20 54 43 4c 5f 53 54  rStr(rc), TCL_ST
a8e0: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 72 65 74  ATIC);.      ret
a8f0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
a900: 20 20 20 7d 0a 20 20 7d 0a 20 20 54 63 6c 5f 53     }.  }.  Tcl_S
a910: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
a920: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
a930: 61 6e 4f 62 6a 28 72 65 74 29 29 3b 0a 20 20 72  anObj(ret));.  r
a940: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
a950: 23 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20  #endif..../*.** 
a960: 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 65  Usage: sqlite3_e
a970: 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63  xtended_result_c
a980: 6f 64 65 73 20 20 20 44 42 20 20 20 20 42 4f 4f  odes   DB    BOO
a990: 4c 45 41 4e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69  LEAN.**.*/.stati
a9a0: 63 20 69 6e 74 20 74 65 73 74 5f 65 78 74 65 6e  c int test_exten
a9b0: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
a9c0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
a9d0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
a9e0: 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
a9f0: 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
aa00: 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
aa10: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
aa20: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
aa30: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
aa40: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
aa50: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
aa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
aa70: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
aa80: 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
aa90: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
aaa0: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
aab0: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
aac0: 74 20 65 6e 61 62 6c 65 3b 0a 20 20 73 71 6c 69  t enable;.  sqli
aad0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
aae0: 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
aaf0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
ab00: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
ab10: 20 22 44 42 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a   "DB BOOLEAN");.
ab20: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
ab30: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
ab40: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
ab50: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
ab60: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
ab70: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
ab80: 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
ab90: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
aba0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
abb0: 5d 2c 20 26 65 6e 61 62 6c 65 29 20 29 20 72 65  ], &enable) ) re
abc0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
abd0: 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
abe0: 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28  ed_result_codes(
abf0: 64 62 2c 20 65 6e 61 62 6c 65 29 3b 0a 20 20 72  db, enable);.  r
ac00: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ac10: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
ac20: 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f 6e  lite3_libversion
ac30: 5f 6e 75 6d 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74  _number.**.*/.st
ac40: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 69  atic int test_li
ac50: 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28  bversion_number(
ac60: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
ac70: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
ac80: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
ac90: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
aca0: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
acb0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
acc0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
acd0: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
ace0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
acf0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
ad00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ad10: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
ad20: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
ad30: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
ad40: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
ad50: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
ad60: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
ad70: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
ad80: 4f 62 6a 28 73 71 6c 69 74 65 33 5f 6c 69 62 76  Obj(sqlite3_libv
ad90: 65 72 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 29 29  ersion_number())
ada0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
adb0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
adc0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  ge: sqlite3_tabl
add0: 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
ade0: 61 20 44 42 20 64 62 6e 61 6d 65 20 74 62 6c 6e  a DB dbname tbln
adf0: 61 6d 65 20 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a  ame colname.**.*
ae00: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
ae10: 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
ae20: 54 41 44 41 54 41 0a 73 74 61 74 69 63 20 69 6e  TADATA.static in
ae30: 74 20 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c  t test_table_col
ae40: 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20  umn_metadata(.  
ae50: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
ae60: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
ae70: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
ae80: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
ae90: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
aea0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
aeb0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
aec0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
aed0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
aee0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
aef0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
af00: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
af10: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
af20: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
af30: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
af40: 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
af50: 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
af60: 68 61 72 20 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73  har *zDb;.  cons
af70: 74 20 63 68 61 72 20 2a 7a 54 62 6c 3b 0a 20 20  t char *zTbl;.  
af80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
af90: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 54 63  ;.  int rc;.  Tc
afa0: 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20  l_Obj *pRet;..  
afb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 61 74  const char *zDat
afc0: 61 74 79 70 65 3b 0a 20 20 63 6f 6e 73 74 20 63  atype;.  const c
afd0: 68 61 72 20 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20  har *zCollseq;. 
afe0: 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20   int notnull;.  
aff0: 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a  int primarykey;.
b000: 20 20 69 6e 74 20 61 75 74 6f 69 6e 63 72 65 6d    int autoincrem
b010: 65 6e 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  ent;..  if( objc
b020: 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=5 ){.    Tcl_W
b030: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
b040: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
b050: 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20   dbname tblname 
b060: 63 6f 6c 6e 61 6d 65 22 29 3b 0a 20 20 20 20 72  colname");.    r
b070: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b080: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
b090: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
b0a0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
b0b0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
b0c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b0d0: 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74  .  zDb = Tcl_Get
b0e0: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b  String(objv[2]);
b0f0: 0a 20 20 7a 54 62 6c 20 3d 20 54 63 6c 5f 47 65  .  zTbl = Tcl_Ge
b100: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29  tString(objv[3])
b110: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47  ;.  zCol = Tcl_G
b120: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 34 5d  etString(objv[4]
b130: 29 3b 0a 0a 20 20 69 66 28 20 73 74 72 6c 65 6e  );..  if( strlen
b140: 28 7a 44 62 29 3d 3d 30 20 29 20 7a 44 62 20 3d  (zDb)==0 ) zDb =
b150: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
b160: 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
b170: 5f 6d 65 74 61 64 61 74 61 28 64 62 2c 20 7a 44  _metadata(db, zD
b180: 62 2c 20 7a 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a  b, zTbl, zCol, .
b190: 20 20 20 20 20 20 26 7a 44 61 74 61 74 79 70 65        &zDatatype
b1a0: 2c 20 26 7a 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f  , &zCollseq, &no
b1b0: 74 6e 75 6c 6c 2c 20 26 70 72 69 6d 61 72 79 6b  tnull, &primaryk
b1c0: 65 79 2c 20 26 61 75 74 6f 69 6e 63 72 65 6d 65  ey, &autoincreme
b1d0: 6e 74 29 3b 0a 0a 20 20 69 66 28 20 72 63 21 3d  nt);..  if( rc!=
b1e0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b1f0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
b200: 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
b210: 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 30 29  3_errmsg(db), 0)
b220: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
b230: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70  _ERROR;.  }..  p
b240: 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ret = Tcl_NewObj
b250: 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ();.  Tcl_ListOb
b260: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30  jAppendElement(0
b270: 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
b280: 74 72 69 6e 67 4f 62 6a 28 7a 44 61 74 61 74 79  tringObj(zDataty
b290: 70 65 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  pe, -1));.  Tcl_
b2a0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
b2b0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
b2c0: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
b2d0: 43 6f 6c 6c 73 65 71 2c 20 2d 31 29 29 3b 0a 20  Collseq, -1));. 
b2e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
b2f0: 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
b300: 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
b310: 28 6e 6f 74 6e 75 6c 6c 29 29 3b 0a 20 20 54 63  (notnull));.  Tc
b320: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b330: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b340: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 70 72  Tcl_NewIntObj(pr
b350: 69 6d 61 72 79 6b 65 79 29 29 3b 0a 20 20 54 63  imarykey));.  Tc
b360: 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
b370: 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20  lement(0, pRet, 
b380: 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 61 75  Tcl_NewIntObj(au
b390: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 29 3b 0a 20  toincrement));. 
b3a0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
b3b0: 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 29 3b  t(interp, pRet);
b3c0: 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
b3d0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  K;.}.#endif..#if
b3e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
b3f0: 5f 49 4e 43 52 42 4c 4f 42 0a 0a 73 74 61 74 69  _INCRBLOB..stati
b400: 63 20 69 6e 74 20 62 6c 6f 62 48 61 6e 64 6c 65  c int blobHandle
b410: 46 72 6f 6d 4f 62 6a 28 0a 20 20 54 63 6c 5f 49  FromObj(.  Tcl_I
b420: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 0a  nterp *interp, .
b430: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c    Tcl_Obj *pObj,
b440: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
b450: 2a 2a 70 70 42 6c 6f 62 0a 29 7b 0a 20 20 63 68  **ppBlob.){.  ch
b460: 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a  ar *z;.  int n;.
b470: 0a 20 20 7a 20 3d 20 54 63 6c 5f 47 65 74 53 74  .  z = Tcl_GetSt
b480: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a  ringFromObj(pObj
b490: 2c 20 26 6e 29 3b 0a 20 20 69 66 28 20 6e 3d 3d  , &n);.  if( n==
b4a0: 30 20 29 7b 0a 20 20 20 20 2a 70 70 42 6c 6f 62  0 ){.    *ppBlob
b4b0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
b4c0: 20 20 20 69 6e 74 20 6e 6f 74 55 73 65 64 3b 0a     int notUsed;.
b4d0: 20 20 20 20 54 63 6c 5f 43 68 61 6e 6e 65 6c 20      Tcl_Channel 
b4e0: 63 68 61 6e 6e 65 6c 3b 0a 20 20 20 20 43 6c 69  channel;.    Cli
b4f0: 65 6e 74 44 61 74 61 20 69 6e 73 74 61 6e 63 65  entData instance
b500: 44 61 74 61 3b 0a 20 20 20 20 0a 20 20 20 20 63  Data;.    .    c
b510: 68 61 6e 6e 65 6c 20 3d 20 54 63 6c 5f 47 65 74  hannel = Tcl_Get
b520: 43 68 61 6e 6e 65 6c 28 69 6e 74 65 72 70 2c 20  Channel(interp, 
b530: 7a 2c 20 26 6e 6f 74 55 73 65 64 29 3b 0a 20 20  z, &notUsed);.  
b540: 20 20 69 66 28 20 21 63 68 61 6e 6e 65 6c 20 29    if( !channel )
b550: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
b560: 52 3b 0a 0a 20 20 20 20 54 63 6c 5f 46 6c 75 73  R;..    Tcl_Flus
b570: 68 28 63 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20  h(channel);.    
b580: 54 63 6c 5f 53 65 65 6b 28 63 68 61 6e 6e 65 6c  Tcl_Seek(channel
b590: 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54 29 3b 0a  , 0, SEEK_SET);.
b5a0: 0a 20 20 20 20 69 6e 73 74 61 6e 63 65 44 61 74  .    instanceDat
b5b0: 61 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e 6e  a = Tcl_GetChann
b5c0: 65 6c 49 6e 73 74 61 6e 63 65 44 61 74 61 28 63  elInstanceData(c
b5d0: 68 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 2a 70 70  hannel);.    *pp
b5e0: 42 6c 6f 62 20 3d 20 2a 28 28 73 71 6c 69 74 65  Blob = *((sqlite
b5f0: 33 5f 62 6c 6f 62 20 2a 2a 29 69 6e 73 74 61 6e  3_blob **)instan
b600: 63 65 44 61 74 61 29 3b 0a 20 20 7d 0a 0a 20 20  ceData);.  }..  
b610: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
b620: 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ..static int tes
b630: 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 28 0a 20  t_blob_reopen(. 
b640: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
b650: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
b660: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
b670: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
b680: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
b690: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
b6a0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
b6b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
b6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b6d0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
b6e0: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
b6f0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
b700: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
b710: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c  ents */.){.  Tcl
b720: 5f 57 69 64 65 49 6e 74 20 69 52 6f 77 69 64 3b  _WideInt iRowid;
b730: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
b740: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 72 63  *pBlob;.  int rc
b750: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
b760: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
b770: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
b780: 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e   1, objv, "CHANN
b790: 45 4c 20 52 4f 57 49 44 22 29 3b 0a 20 20 20 20  EL ROWID");.    
b7a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
b7b0: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f  ;.  }..  if( blo
b7c0: 62 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69  bHandleFromObj(i
b7d0: 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20  nterp, objv[1], 
b7e0: 26 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e  &pBlob) ) return
b7f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
b800: 28 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74  ( Tcl_GetWideInt
b810: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b820: 6f 62 6a 76 5b 32 5d 2c 20 26 69 52 6f 77 69 64  objv[2], &iRowid
b830: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
b840: 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
b850: 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 6f 70 65  lite3_blob_reope
b860: 6e 28 70 42 6c 6f 62 2c 20 69 52 6f 77 69 64 29  n(pBlob, iRowid)
b870: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
b880: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
b890: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
b8a0: 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
b8b0: 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54  e3ErrName(rc), T
b8c0: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
b8d0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
b8e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 43 4c  =SQLITE_OK ? TCL
b8f0: 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52 4f 52 29  _OK : TCL_ERROR)
b900: 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ;.}..#endif../*.
b910: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
b920: 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
b930: 6f 6e 5f 76 32 20 44 42 2d 48 41 4e 44 4c 45 20  on_v2 DB-HANDLE 
b940: 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44 45  NAME CMP-PROC DE
b950: 4c 2d 50 52 4f 43 0a 2a 2a 0a 2a 2a 20 20 20 54  L-PROC.**.**   T
b960: 68 69 73 20 54 63 6c 20 70 72 6f 63 20 69 73 20  his Tcl proc is 
b970: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
b980: 20 74 68 65 20 65 78 70 65 72 69 6d 65 6e 74 61   the experimenta
b990: 6c 0a 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 63  l.**   sqlite3_c
b9a0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
b9b0: 76 32 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  v2() interface..
b9c0: 2a 2f 0a 73 74 72 75 63 74 20 54 65 73 74 43 6f  */.struct TestCo
b9d0: 6c 6c 61 74 69 6f 6e 58 20 7b 0a 20 20 54 63 6c  llationX {.  Tcl
b9e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 3b  _Interp *interp;
b9f0: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 43 6d 70  .  Tcl_Obj *pCmp
ba00: 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44 65  ;.  Tcl_Obj *pDe
ba10: 6c 3b 0a 7d 3b 0a 74 79 70 65 64 65 66 20 73 74  l;.};.typedef st
ba20: 72 75 63 74 20 54 65 73 74 43 6f 6c 6c 61 74 69  ruct TestCollati
ba30: 6f 6e 58 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f  onX TestCollatio
ba40: 6e 58 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  nX;.static void 
ba50: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
ba60: 69 6f 6e 44 65 6c 28 76 6f 69 64 20 2a 70 43 74  ionDel(void *pCt
ba70: 78 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61 74  x){.  TestCollat
ba80: 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74 43  ionX *p = (TestC
ba90: 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74 78  ollationX *)pCtx
baa0: 3b 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 54 63  ;..  int rc = Tc
bab0: 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69  l_EvalObjEx(p->i
bac0: 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 6c 2c 20  nterp, p->pDel, 
bad0: 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c  TCL_EVAL_DIRECT|
bae0: 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29  TCL_EVAL_GLOBAL)
baf0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f  ;.  if( rc!=TCL_
bb00: 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 42 61  OK ){.    Tcl_Ba
bb10: 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d  ckgroundError(p-
bb20: 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20  >interp);.  }.. 
bb30: 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
bb40: 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63  t(p->pCmp);.  Tc
bb50: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
bb60: 2d 3e 70 44 65 6c 29 3b 0a 20 20 73 71 6c 69 74  ->pDel);.  sqlit
bb70: 65 33 5f 66 72 65 65 28 28 76 6f 69 64 20 2a 29  e3_free((void *)
bb80: 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  p);.}.static int
bb90: 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61   testCreateColla
bba0: 74 69 6f 6e 43 6d 70 28 0a 20 20 76 6f 69 64 20  tionCmp(.  void 
bbb0: 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 4c 65  *pCtx,.  int nLe
bbc0: 66 74 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  ft,.  const void
bbd0: 20 2a 7a 4c 65 66 74 2c 0a 20 20 69 6e 74 20 6e   *zLeft,.  int n
bbe0: 52 69 67 68 74 2c 0a 20 20 63 6f 6e 73 74 20 76  Right,.  const v
bbf0: 6f 69 64 20 2a 7a 52 69 67 68 74 0a 29 7b 0a 20  oid *zRight.){. 
bc00: 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20   TestCollationX 
bc10: 2a 70 20 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74  *p = (TestCollat
bc20: 69 6f 6e 58 20 2a 29 70 43 74 78 3b 0a 20 20 54  ionX *)pCtx;.  T
bc30: 63 6c 5f 4f 62 6a 20 2a 70 53 63 72 69 70 74 20  cl_Obj *pScript 
bc40: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
bc50: 62 6a 28 70 2d 3e 70 43 6d 70 29 3b 0a 20 20 69  bj(p->pCmp);.  i
bc60: 6e 74 20 69 52 65 73 20 3d 20 30 3b 0a 0a 20 20  nt iRes = 0;..  
bc70: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
bc80: 28 70 53 63 72 69 70 74 29 3b 0a 20 20 54 63 6c  (pScript);.  Tcl
bc90: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
bca0: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
bcb0: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
bcc0: 62 6a 28 28 63 68 61 72 20 2a 29 7a 4c 65 66 74  bj((char *)zLeft
bcd0: 2c 20 6e 4c 65 66 74 29 29 3b 0a 20 20 54 63 6c  , nLeft));.  Tcl
bce0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
bcf0: 65 6d 65 6e 74 28 30 2c 20 70 53 63 72 69 70 74  ement(0, pScript
bd00: 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
bd10: 62 6a 28 28 63 68 61 72 20 2a 29 7a 52 69 67 68  bj((char *)zRigh
bd20: 74 2c 6e 52 69 67 68 74 29 29 3b 0a 0a 20 20 69  t,nRight));..  i
bd30: 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 45  f( TCL_OK!=Tcl_E
bd40: 76 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65  valObjEx(p->inte
bd50: 72 70 2c 20 70 53 63 72 69 70 74 2c 20 54 43 4c  rp, pScript, TCL
bd60: 5f 45 56 41 4c 5f 44 49 52 45 43 54 7c 54 43 4c  _EVAL_DIRECT|TCL
bd70: 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 0a 20 20  _EVAL_GLOBAL).  
bd80: 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f   || TCL_OK!=Tcl_
bd90: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 70 2d  GetIntFromObj(p-
bda0: 3e 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  >interp, Tcl_Get
bdb0: 4f 62 6a 52 65 73 75 6c 74 28 70 2d 3e 69 6e 74  ObjResult(p->int
bdc0: 65 72 70 29 2c 20 26 69 52 65 73 29 0a 20 20 29  erp), &iRes).  )
bdd0: 7b 0a 20 20 20 20 54 63 6c 5f 42 61 63 6b 67 72  {.    Tcl_Backgr
bde0: 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e 69 6e 74  oundError(p->int
bdf0: 65 72 70 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  erp);.  }.  Tcl_
be00: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 53 63  DecrRefCount(pSc
be10: 72 69 70 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e  ript);..  return
be20: 20 69 52 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20   iRes;.}.static 
be30: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
be40: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
be50: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
be60: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
be70: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
be80: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
be90: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
bea0: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
beb0: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
bec0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
bed0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
bee0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
bef0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
bf00: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
bf10: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
bf20: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 65 73 74  nts */.){.  Test
bf30: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 3b 0a 20  CollationX *p;. 
bf40: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
bf50: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
bf60: 62 6a 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  bjc!=5 ){.    Tc
bf70: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
bf80: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
bf90: 22 44 42 2d 48 41 4e 44 4c 45 20 4e 41 4d 45 20  "DB-HANDLE NAME 
bfa0: 43 4d 50 2d 50 52 4f 43 20 44 45 4c 2d 50 52 4f  CMP-PROC DEL-PRO
bfb0: 43 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  C");.    return 
bfc0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
bfd0: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
bfe0: 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
bff0: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
c000: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
c010: 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 70 20  TCL_ERROR;..  p 
c020: 3d 20 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e  = (TestCollation
c030: 58 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  X *)sqlite3_mall
c040: 6f 63 28 73 69 7a 65 6f 66 28 54 65 73 74 43 6f  oc(sizeof(TestCo
c050: 6c 6c 61 74 69 6f 6e 58 29 29 3b 0a 20 20 70 2d  llationX));.  p-
c060: 3e 70 43 6d 70 20 3d 20 6f 62 6a 76 5b 33 5d 3b  >pCmp = objv[3];
c070: 0a 20 20 70 2d 3e 70 44 65 6c 20 3d 20 6f 62 6a  .  p->pDel = obj
c080: 76 5b 34 5d 3b 0a 20 20 70 2d 3e 69 6e 74 65 72  v[4];.  p->inter
c090: 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 54 63  p = interp;.  Tc
c0a0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
c0b0: 2d 3e 70 43 6d 70 29 3b 0a 20 20 54 63 6c 5f 49  ->pCmp);.  Tcl_I
c0c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
c0d0: 44 65 6c 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71  Del);..  rc = sq
c0e0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
c0f0: 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c 20 54 63  lation_v2(db, Tc
c100: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
c110: 5b 32 5d 29 2c 20 31 36 2c 20 0a 20 20 20 20 20  [2]), 16, .     
c120: 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65 73 74   (void *)p, test
c130: 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 43  CreateCollationC
c140: 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f  mp, testCreateCo
c150: 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a  llationDel.  );.
c160: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
c170: 5f 4d 49 53 55 53 45 20 29 7b 0a 20 20 20 20 54  _MISUSE ){.    T
c180: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
c190: 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33  interp, "sqlite3
c1a0: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 65 5f  _create_collate_
c1b0: 76 32 28 29 20 66 61 69 6c 65 64 20 74 6f 20 64  v2() failed to d
c1c0: 65 74 65 63 74 20 22 0a 20 20 20 20 20 20 22 61  etect ".      "a
c1d0: 6e 20 69 6e 76 61 6c 69 64 20 65 6e 63 6f 64 69  n invalid encodi
c1e0: 6e 67 22 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ng", (char*)0);.
c1f0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
c200: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  RROR;.  }.  rc =
c210: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c220: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62 2c  collation_v2(db,
c230: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
c240: 62 6a 76 5b 32 5d 29 2c 20 53 51 4c 49 54 45 5f  bjv[2]), SQLITE_
c250: 55 54 46 38 2c 20 0a 20 20 20 20 20 20 28 76 6f  UTF8, .      (vo
c260: 69 64 20 2a 29 70 2c 20 74 65 73 74 43 72 65 61  id *)p, testCrea
c270: 74 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 2c 20  teCollationCmp, 
c280: 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74  testCreateCollat
c290: 69 6f 6e 44 65 6c 0a 20 20 29 3b 0a 20 20 72 65  ionDel.  );.  re
c2a0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
c2b0: 2f 2a 0a 2a 2a 20 55 53 41 47 45 3a 20 73 71 6c  /*.** USAGE: sql
c2c0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
c2d0: 74 69 6f 6e 5f 76 32 20 44 42 20 4e 41 4d 45 20  tion_v2 DB NAME 
c2e0: 4e 41 52 47 20 45 4e 43 20 3f 53 57 49 54 43 48  NARG ENC ?SWITCH
c2f0: 45 53 3f 0a 2a 2a 0a 2a 2a 20 41 76 61 69 6c 61  ES?.**.** Availa
c300: 62 6c 65 20 73 77 69 74 63 68 65 73 20 61 72 65  ble switches are
c310: 3a 0a 2a 2a 0a 2a 2a 20 20 20 2d 66 75 6e 63 20  :.**.**   -func 
c320: 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d     SCRIPT.**   -
c330: 73 74 65 70 20 20 20 20 53 43 52 49 50 54 0a 2a  step    SCRIPT.*
c340: 2a 20 20 20 2d 66 69 6e 61 6c 20 20 20 53 43 52  *   -final   SCR
c350: 49 50 54 0a 2a 2a 20 20 20 2d 64 65 73 74 72 6f  IPT.**   -destro
c360: 79 20 53 43 52 49 50 54 0a 2a 2f 0a 74 79 70 65  y SCRIPT.*/.type
c370: 64 65 66 20 73 74 72 75 63 74 20 43 72 65 61 74  def struct Creat
c380: 65 46 75 6e 63 74 69 6f 6e 56 32 20 43 72 65 61  eFunctionV2 Crea
c390: 74 65 46 75 6e 63 74 69 6f 6e 56 32 3b 0a 73 74  teFunctionV2;.st
c3a0: 72 75 63 74 20 43 72 65 61 74 65 46 75 6e 63 74  ruct CreateFunct
c3b0: 69 6f 6e 56 32 20 7b 0a 20 20 54 63 6c 5f 49 6e  ionV2 {.  Tcl_In
c3c0: 74 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20  terp *interp;.  
c3d0: 54 63 6c 5f 4f 62 6a 20 2a 70 46 75 6e 63 3b 20  Tcl_Obj *pFunc; 
c3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3f0: 2f 2a 20 53 63 72 69 70 74 20 66 6f 72 20 66 75  /* Script for fu
c400: 6e 63 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f  nction invocatio
c410: 6e 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  n */.  Tcl_Obj *
c420: 70 53 74 65 70 3b 20 20 20 20 20 20 20 20 20 20  pStep;          
c430: 20 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74         /* Script
c440: 20 66 6f 72 20 61 67 67 2e 20 73 74 65 70 20 69   for agg. step i
c450: 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  nvocation */.  T
c460: 63 6c 5f 4f 62 6a 20 2a 70 46 69 6e 61 6c 3b 20  cl_Obj *pFinal; 
c470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c480: 2a 20 53 63 72 69 70 74 20 66 6f 72 20 61 67 67  * Script for agg
c490: 2e 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 69  . finalization i
c4a0: 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54  nvocation */.  T
c4b0: 63 6c 5f 4f 62 6a 20 2a 70 44 65 73 74 72 6f 79  cl_Obj *pDestroy
c4c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
c4d0: 2a 20 44 65 73 74 72 75 63 74 6f 72 20 73 63 72  * Destructor scr
c4e0: 69 70 74 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63  ipt */.};.static
c4f0: 20 76 6f 69 64 20 63 66 32 46 75 6e 63 28 73 71   void cf2Func(sq
c500: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63  lite3_context *c
c510: 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c 20 73 71  tx, int nArg, sq
c520: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41  lite3_value **aA
c530: 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  rg){.}.static vo
c540: 69 64 20 63 66 32 53 74 65 70 28 73 71 6c 69 74  id cf2Step(sqlit
c550: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 2c  e3_context *ctx,
c560: 20 69 6e 74 20 6e 41 72 67 2c 20 73 71 6c 69 74   int nArg, sqlit
c570: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 41 72 67 29  e3_value **aArg)
c580: 7b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  {.}.static void 
c590: 63 66 32 46 69 6e 61 6c 28 73 71 6c 69 74 65 33  cf2Final(sqlite3
c5a0: 5f 63 6f 6e 74 65 78 74 20 2a 63 74 78 29 7b 0a  _context *ctx){.
c5b0: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 66  }.static void cf
c5c0: 32 44 65 73 74 72 6f 79 28 76 6f 69 64 20 2a 70  2Destroy(void *p
c5d0: 55 73 65 72 29 7b 0a 20 20 43 72 65 61 74 65 46  User){.  CreateF
c5e0: 75 6e 63 74 69 6f 6e 56 32 20 2a 70 20 3d 20 28  unctionV2 *p = (
c5f0: 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32  CreateFunctionV2
c600: 20 2a 29 70 55 73 65 72 3b 0a 0a 20 20 69 66 28   *)pUser;..  if(
c610: 20 70 2d 3e 69 6e 74 65 72 70 20 26 26 20 70 2d   p->interp && p-
c620: 3e 70 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >pDestroy ){.   
c630: 20 69 6e 74 20 72 63 20 3d 20 54 63 6c 5f 45 76   int rc = Tcl_Ev
c640: 61 6c 4f 62 6a 45 78 28 70 2d 3e 69 6e 74 65 72  alObjEx(p->inter
c650: 70 2c 20 70 2d 3e 70 44 65 73 74 72 6f 79 2c 20  p, p->pDestroy, 
c660: 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
c670: 54 43 4c 5f 4f 4b 20 29 20 54 63 6c 5f 42 61 63  TCL_OK ) Tcl_Bac
c680: 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28 70 2d 3e  kgroundError(p->
c690: 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a 0a 20 20  interp);.  }..  
c6a0: 69 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54  if( p->pFunc ) T
c6b0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
c6c0: 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66  p->pFunc); .  if
c6d0: 28 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c  ( p->pStep ) Tcl
c6e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _DecrRefCount(p-
c6f0: 3e 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20  >pStep); .  if( 
c700: 70 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f  p->pFinal ) Tcl_
c710: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  DecrRefCount(p->
c720: 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20  pFinal); .  if( 
c730: 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63  p->pDestroy ) Tc
c740: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
c750: 2d 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 20 20  ->pDestroy); .  
c760: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29 3b  sqlite3_free(p);
c770: 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
c780: 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  st_create_functi
c790: 6f 6e 5f 76 32 28 0a 20 20 43 6c 69 65 6e 74 44  on_v2(.  ClientD
c7a0: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
c7b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 74 20           /* Not 
c7c0: 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  used */.  Tcl_In
c7d0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
c7e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
c7f0: 20 69 6e 76 6f 6b 69 6e 67 20 54 43 4c 20 69 6e   invoking TCL in
c800: 74 65 72 70 72 65 74 65 72 20 2a 2f 0a 20 20 69  terpreter */.  i
c810: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c830: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
c840: 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
c850: 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
c860: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
c870: 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
c880: 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
c890: 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db;.  const cha
c8a0: 72 20 2a 7a 46 75 6e 63 3b 0a 20 20 69 6e 74 20  r *zFunc;.  int 
c8b0: 6e 41 72 67 3b 0a 20 20 69 6e 74 20 65 6e 63 3b  nArg;.  int enc;
c8c0: 0a 20 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f  .  CreateFunctio
c8d0: 6e 56 32 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  nV2 *p;.  int i;
c8e0: 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 74  .  int rc;..  st
c8f0: 72 75 63 74 20 45 6e 63 54 61 62 6c 65 20 7b 0a  ruct EncTable {.
c900: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
c910: 7a 45 6e 63 3b 0a 20 20 20 20 69 6e 74 20 65 6e  zEnc;.    int en
c920: 63 3b 0a 20 20 7d 20 61 45 6e 63 5b 5d 20 3d 20  c;.  } aEnc[] = 
c930: 7b 0a 20 20 20 20 7b 22 75 74 66 38 22 2c 20 20  {.    {"utf8",  
c940: 20 20 53 51 4c 49 54 45 5f 55 54 46 38 20 7d 2c    SQLITE_UTF8 },
c950: 0a 20 20 20 20 7b 22 75 74 66 31 36 22 2c 20 20  .    {"utf16",  
c960: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7d 2c   SQLITE_UTF16 },
c970: 0a 20 20 20 20 7b 22 75 74 66 31 36 6c 65 22 2c  .    {"utf16le",
c980: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
c990: 7d 2c 0a 20 20 20 20 7b 22 75 74 66 31 36 62 65  },.    {"utf16be
c9a0: 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  ", SQLITE_UTF16B
c9b0: 45 20 7d 2c 0a 20 20 20 20 7b 22 61 6e 79 22 2c  E },.    {"any",
c9c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 41 4e 59 20       SQLITE_ANY 
c9d0: 7d 2c 0a 20 20 20 20 7b 22 30 22 2c 20 30 20 7d  },.    {"0", 0 }
c9e0: 0a 20 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  .  };..  if( obj
c9f0: 63 3c 35 20 7c 7c 20 28 6f 62 6a 63 25 32 29 3d  c<5 || (objc%2)=
ca00: 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =0 ){.    Tcl_Wr
ca10: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
ca20: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
ca30: 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 53 57  NAME NARG ENC SW
ca40: 49 54 43 48 45 53 2e 2e 2e 22 29 3b 0a 20 20 20  ITCHES...");.   
ca50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ca60: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
ca70: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
ca80: 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
ca90: 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
caa0: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
cab0: 4f 52 3b 0a 20 20 7a 46 75 6e 63 20 3d 20 54 63  OR;.  zFunc = Tc
cac0: 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
cad0: 5b 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  [2]);.  if( Tcl_
cae0: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
caf0: 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
cb00: 6e 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 54  nArg) ) return T
cb10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
cb20: 54 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d  Tcl_GetIndexFrom
cb30: 4f 62 6a 53 74 72 75 63 74 28 69 6e 74 65 72 70  ObjStruct(interp
cb40: 2c 20 6f 62 6a 76 5b 34 5d 2c 20 61 45 6e 63 2c  , objv[4], aEnc,
cb50: 20 73 69 7a 65 6f 66 28 61 45 6e 63 5b 30 5d 29   sizeof(aEnc[0])
cb60: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 22 65 6e  , .          "en
cb70: 63 6f 64 69 6e 67 22 2c 20 30 2c 20 26 65 6e 63  coding", 0, &enc
cb80: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
cb90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
cba0: 0a 20 20 65 6e 63 20 3d 20 61 45 6e 63 5b 65 6e  .  enc = aEnc[en
cbb0: 63 5d 2e 65 6e 63 3b 0a 0a 20 20 70 20 3d 20 73  c].enc;..  p = s
cbc0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
cbd0: 7a 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74  zeof(CreateFunct
cbe0: 69 6f 6e 56 32 29 29 3b 0a 20 20 61 73 73 65 72  ionV2));.  asser
cbf0: 74 28 20 70 20 29 3b 0a 20 20 6d 65 6d 73 65 74  t( p );.  memset
cc00: 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 43 72  (p, 0, sizeof(Cr
cc10: 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 29 29  eateFunctionV2))
cc20: 3b 0a 20 20 70 2d 3e 69 6e 74 65 72 70 20 3d 20  ;.  p->interp = 
cc30: 69 6e 74 65 72 70 3b 0a 0a 20 20 66 6f 72 28 69  interp;..  for(i
cc40: 3d 35 3b 20 69 3c 6f 62 6a 63 3b 20 69 2b 3d 32  =5; i<objc; i+=2
cc50: 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 77 69 74  ){.    int iSwit
cc60: 63 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  ch;.    const ch
cc70: 61 72 20 2a 61 7a 53 77 69 74 63 68 5b 5d 20 3d  ar *azSwitch[] =
cc80: 20 7b 22 2d 66 75 6e 63 22 2c 20 22 2d 73 74 65   {"-func", "-ste
cc90: 70 22 2c 20 22 2d 66 69 6e 61 6c 22 2c 20 22 2d  p", "-final", "-
cca0: 64 65 73 74 72 6f 79 22 2c 20 30 7d 3b 0a 20 20  destroy", 0};.  
ccb0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
ccc0: 65 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  exFromObj(interp
ccd0: 2c 20 6f 62 6a 76 5b 69 5d 2c 20 61 7a 53 77 69  , objv[i], azSwi
cce0: 74 63 68 2c 20 22 73 77 69 74 63 68 22 2c 20 30  tch, "switch", 0
ccf0: 2c 20 26 69 53 77 69 74 63 68 29 20 29 7b 0a 20  , &iSwitch) ){. 
cd00: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
cd10: 65 28 70 29 3b 0a 20 20 20 20 20 20 72 65 74 75  e(p);.      retu
cd20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
cd30: 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28    }..    switch(
cd40: 20 69 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20   iSwitch ){.    
cd50: 20 20 63 61 73 65 20 30 3a 20 70 2d 3e 70 46 75    case 0: p->pFu
cd60: 6e 63 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  nc = objv[i+1]; 
cd70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cd80: 20 20 63 61 73 65 20 31 3a 20 70 2d 3e 70 53 74    case 1: p->pSt
cd90: 65 70 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b 20  ep = objv[i+1]; 
cda0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cdb0: 20 20 63 61 73 65 20 32 3a 20 70 2d 3e 70 46 69    case 2: p->pFi
cdc0: 6e 61 6c 20 3d 20 6f 62 6a 76 5b 69 2b 31 5d 3b  nal = objv[i+1];
cdd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
cde0: 20 20 63 61 73 65 20 33 3a 20 70 2d 3e 70 44 65    case 3: p->pDe
cdf0: 73 74 72 6f 79 20 3d 20 6f 62 6a 76 5b 69 2b 31  stroy = objv[i+1
ce00: 5d 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ];   break;.    
ce10: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 70  }.  }.  if( p->p
ce20: 46 75 6e 63 20 29 20 70 2d 3e 70 46 75 6e 63 20  Func ) p->pFunc 
ce30: 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
ce40: 62 6a 28 70 2d 3e 70 46 75 6e 63 29 3b 20 0a 20  bj(p->pFunc); . 
ce50: 20 69 66 28 20 70 2d 3e 70 53 74 65 70 20 29 20   if( p->pStep ) 
ce60: 70 2d 3e 70 53 74 65 70 20 3d 20 54 63 6c 5f 44  p->pStep = Tcl_D
ce70: 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70  uplicateObj(p->p
ce80: 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70 2d  Step); .  if( p-
ce90: 3e 70 46 69 6e 61 6c 20 29 20 70 2d 3e 70 46 69  >pFinal ) p->pFi
cea0: 6e 61 6c 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  nal = Tcl_Duplic
ceb0: 61 74 65 4f 62 6a 28 70 2d 3e 70 46 69 6e 61 6c  ateObj(p->pFinal
cec0: 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65  ); .  if( p->pDe
ced0: 73 74 72 6f 79 20 29 20 70 2d 3e 70 44 65 73 74  stroy ) p->pDest
cee0: 72 6f 79 20 3d 20 54 63 6c 5f 44 75 70 6c 69 63  roy = Tcl_Duplic
cef0: 61 74 65 4f 62 6a 28 70 2d 3e 70 44 65 73 74 72  ateObj(p->pDestr
cf00: 6f 79 29 3b 20 0a 0a 20 20 69 66 28 20 70 2d 3e  oy); ..  if( p->
cf10: 70 46 75 6e 63 20 29 20 54 63 6c 5f 49 6e 63 72  pFunc ) Tcl_Incr
cf20: 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e  RefCount(p->pFun
cf30: 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53  c); .  if( p->pS
cf40: 74 65 70 20 29 20 54 63 6c 5f 49 6e 63 72 52 65  tep ) Tcl_IncrRe
cf50: 66 43 6f 75 6e 74 28 70 2d 3e 70 53 74 65 70 29  fCount(p->pStep)
cf60: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 46 69 6e  ; .  if( p->pFin
cf70: 61 6c 20 29 20 54 63 6c 5f 49 6e 63 72 52 65 66  al ) Tcl_IncrRef
cf80: 43 6f 75 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29  Count(p->pFinal)
cf90: 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 44 65 73  ; .  if( p->pDes
cfa0: 74 72 6f 79 20 29 20 54 63 6c 5f 49 6e 63 72 52  troy ) Tcl_IncrR
cfb0: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74  efCount(p->pDest
cfc0: 72 6f 79 29 3b 20 0a 0a 20 20 72 63 20 3d 20 73  roy); ..  rc = s
cfd0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
cfe0: 6e 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46  nction_v2(db, zF
cff0: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
d000: 28 76 6f 69 64 20 2a 29 70 2c 20 0a 20 20 20 20  (void *)p, .    
d010: 20 20 28 70 2d 3e 70 46 75 6e 63 20 3f 20 63 66    (p->pFunc ? cf
d020: 32 46 75 6e 63 20 3a 20 30 29 2c 0a 20 20 20 20  2Func : 0),.    
d030: 20 20 28 70 2d 3e 70 53 74 65 70 20 3f 20 63 66    (p->pStep ? cf
d040: 32 53 74 65 70 20 3a 20 30 29 2c 0a 20 20 20 20  2Step : 0),.    
d050: 20 20 28 70 2d 3e 70 46 69 6e 61 6c 20 3f 20 63    (p->pFinal ? c
d060: 66 32 46 69 6e 61 6c 20 3a 20 30 29 2c 0a 20 20  f2Final : 0),.  
d070: 20 20 20 20 63 66 32 44 65 73 74 72 6f 79 0a 20      cf2Destroy. 
d080: 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51   );.  if( rc!=SQ
d090: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
d0a0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
d0b0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
d0c0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
d0d0: 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  erp, sqlite3ErrN
d0e0: 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
d0f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d100: 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
d110: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
d120: 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
d130: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44  load_extension D
d140: 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50  B-HANDLE FILE ?P
d150: 52 4f 43 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROC?.*/.static i
d160: 6e 74 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74  nt test_load_ext
d170: 65 6e 73 69 6f 6e 28 0a 20 20 43 6c 69 65 6e 74  ension(.  Client
d180: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
d190: 20 2f 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a   /* Not used */.
d1a0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
d1b0: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
d1c0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d1d0: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
d1e0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
d1f0: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
d200: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d210: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
d220: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
d230: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
d240: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
d250: 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49 6e 66  .){.  Tcl_CmdInf
d260: 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 73 71 6c  o cmdInfo;.  sql
d270: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
d280: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  rc;.  char *zDb;
d290: 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
d2a0: 20 20 63 68 61 72 20 2a 7a 50 72 6f 63 20 3d 20    char *zProc = 
d2b0: 30 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20  0;.  char *zErr 
d2c0: 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
d2d0: 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=4 && objc!=3 )
d2e0: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
d2f0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
d300: 2c 20 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44  , objv, "DB-HAND
d310: 4c 45 20 46 49 4c 45 20 3f 50 52 4f 43 3f 22 29  LE FILE ?PROC?")
d320: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
d330: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
d340: 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
d350: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a 46  g(objv[1]);.  zF
d360: 69 6c 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ile = Tcl_GetStr
d370: 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
d380: 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b 0a 20  if( objc==4 ){. 
d390: 20 20 20 7a 50 72 6f 63 20 3d 20 54 63 6c 5f 47     zProc = Tcl_G
d3a0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
d3b0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 45 78 74  );.  }..  /* Ext
d3c0: 72 61 63 74 20 74 68 65 20 43 20 64 61 74 61 62  ract the C datab
d3d0: 61 73 65 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20  ase handle from 
d3e0: 74 68 65 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20  the Tcl command 
d3f0: 6e 61 6d 65 20 2a 2f 0a 20 20 69 66 28 20 21 54  name */.  if( !T
d400: 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66  cl_GetCommandInf
d410: 6f 28 69 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26  o(interp, zDb, &
d420: 63 6d 64 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20  cmdInfo) ){.    
d430: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
d440: 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
d450: 64 20 6e 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20  d not found: ", 
d460: 7a 44 62 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  zDb, (char*)0);.
d470: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
d480: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d  RROR;.  }.  db =
d490: 20 28 28 73 74 72 75 63 74 20 53 71 6c 69 74 65   ((struct Sqlite
d4a0: 44 62 2a 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43  Db*)cmdInfo.objC
d4b0: 6c 69 65 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a  lientData)->db;.
d4c0: 20 20 61 73 73 65 72 74 28 64 62 29 3b 0a 0a 20    assert(db);.. 
d4d0: 20 2f 2a 20 43 61 6c 6c 20 74 68 65 20 75 6e 64   /* Call the und
d4e0: 65 72 6c 79 69 6e 67 20 43 20 66 75 6e 63 74 69  erlying C functi
d4f0: 6f 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  on. If an error 
d500: 6f 63 63 75 72 73 2c 20 73 65 74 20 72 63 20 74  occurs, set rc t
d510: 6f 20 0a 20 20 2a 2a 20 54 43 4c 5f 45 52 52 4f  o .  ** TCL_ERRO
d520: 52 20 61 6e 64 20 6c 6f 61 64 20 61 6e 79 20 65  R and load any e
d530: 72 72 6f 72 20 73 74 72 69 6e 67 20 69 6e 74 6f  rror string into
d540: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
d550: 2e 20 49 66 20 6e 6f 20 0a 20 20 2a 2a 20 65 72  . If no .  ** er
d560: 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20  ror occurs, set 
d570: 72 63 20 74 6f 20 54 43 4c 5f 4f 4b 2e 0a 20 20  rc to TCL_OK..  
d580: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
d590: 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
d5a0: 53 49 4f 4e 0a 20 20 72 63 20 3d 20 53 51 4c 49  SION.  rc = SQLI
d5b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7a 45 72 72  TE_ERROR;.  zErr
d5c0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
d5d0: 74 66 28 22 74 68 69 73 20 62 75 69 6c 64 20 6f  tf("this build o
d5e0: 6d 69 74 73 20 73 71 6c 69 74 65 33 5f 6c 6f 61  mits sqlite3_loa
d5f0: 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29 22 29 3b  d_extension()");
d600: 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 73 71  .#else.  rc = sq
d610: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
d620: 73 69 6f 6e 28 64 62 2c 20 7a 46 69 6c 65 2c 20  sion(db, zFile, 
d630: 7a 50 72 6f 63 2c 20 26 7a 45 72 72 29 3b 0a 23  zProc, &zErr);.#
d640: 65 6e 64 69 66 0a 20 20 69 66 28 20 72 63 21 3d  endif.  if( rc!=
d650: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d660: 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
d670: 6e 74 65 72 70 2c 20 7a 45 72 72 20 3f 20 7a 45  nterp, zErr ? zE
d680: 72 72 20 3a 20 22 22 2c 20 54 43 4c 5f 56 4f 4c  rr : "", TCL_VOL
d690: 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 63 20 3d  ATILE);.    rc =
d6a0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 65   TCL_ERROR;.  }e
d6b0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 54 43  lse{.    rc = TC
d6c0: 4c 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  L_OK;.  }.  sqli
d6d0: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
d6e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d6f0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
d700: 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61  lite3_enable_loa
d710: 64 5f 65 78 74 65 6e 73 69 6f 6e 20 44 42 2d 48  d_extension DB-H
d720: 41 4e 44 4c 45 20 4f 4e 4f 46 46 0a 2a 2f 0a 73  ANDLE ONOFF.*/.s
d730: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65  tatic int test_e
d740: 6e 61 62 6c 65 5f 6c 6f 61 64 28 0a 20 20 43 6c  nable_load(.  Cl
d750: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
d760: 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73 65 64  ata, /* Not used
d770: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
d780: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
d790: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
d7a0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
d7b0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
d7c0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
d7d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d7e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d7f0: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
d800: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
d810: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
d820: 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d  s */.){.  Tcl_Cm
d830: 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20  dInfo cmdInfo;. 
d840: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
d850: 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 69 6e 74  char *zDb;.  int
d860: 20 6f 6e 6f 66 66 3b 0a 0a 20 20 69 66 28 20 6f   onoff;..  if( o
d870: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
d880: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
d890: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
d8a0: 22 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46 46  "DB-HANDLE ONOFF
d8b0: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
d8c0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
d8d0: 7a 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zDb = Tcl_GetStr
d8e0: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 0a 20  ing(objv[1]);.. 
d8f0: 20 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20   /* Extract the 
d900: 43 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  C database handl
d910: 65 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63  e from the Tcl c
d920: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20  ommand name */. 
d930: 20 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d   if( !Tcl_GetCom
d940: 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c  mandInfo(interp,
d950: 20 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20   zDb, &cmdInfo) 
d960: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
d970: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
d980: 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75  "command not fou
d990: 6e 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61  nd: ", zDb, (cha
d9a0: 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72  r*)0);.    retur
d9b0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
d9c0: 0a 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74  .  db = ((struct
d9d0: 20 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e   SqliteDb*)cmdIn
d9e0: 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
d9f0: 29 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28  )->db;.  assert(
da00: 64 62 29 3b 0a 0a 20 20 2f 2a 20 47 65 74 20 74  db);..  /* Get t
da10: 68 65 20 6f 6e 6f 66 66 20 70 61 72 61 6d 65 74  he onoff paramet
da20: 65 72 20 2a 2f 0a 20 20 69 66 28 20 54 63 6c 5f  er */.  if( Tcl_
da30: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
da40: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
da50: 5d 2c 20 26 6f 6e 6f 66 66 29 20 29 7b 0a 20 20  ], &onoff) ){.  
da60: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
da70: 4f 52 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20  OR;.  }..#ifdef 
da80: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
da90: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 54 63 6c  _EXTENSION.  Tcl
daa0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
dab0: 74 65 72 70 2c 20 22 74 68 69 73 20 62 75 69 6c  terp, "this buil
dac0: 64 20 6f 6d 69 74 73 20 73 71 6c 69 74 65 33 5f  d omits sqlite3_
dad0: 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 29  load_extension()
dae0: 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ");.  return TCL
daf0: 5f 45 52 52 4f 52 3b 0a 23 65 6c 73 65 0a 20 20  _ERROR;.#else.  
db00: 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
db10: 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62  oad_extension(db
db20: 2c 20 6f 6e 6f 66 66 29 3b 0a 20 20 72 65 74 75  , onoff);.  retu
db30: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 23 65 6e 64 69  rn TCL_OK;.#endi
db40: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  f.}../*.** Usage
db50: 3a 20 20 73 71 6c 69 74 65 5f 61 62 6f 72 74 0a  :  sqlite_abort.
db60: 2a 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  **.** Shutdown t
db70: 68 65 20 70 72 6f 63 65 73 73 20 69 6d 6d 65 64  he process immed
db80: 69 61 74 65 6c 79 2e 20 20 54 68 69 73 20 69 73  iately.  This is
db90: 20 6e 6f 74 20 61 20 63 6c 65 61 6e 20 73 68 75   not a clean shu
dba0: 74 64 6f 77 6e 2e 0a 2a 2a 20 54 68 69 73 20 63  tdown..** This c
dbb0: 6f 6d 6d 61 6e 64 20 69 73 20 75 73 65 64 20 74  ommand is used t
dbc0: 6f 20 74 65 73 74 20 74 68 65 20 72 65 63 6f 76  o test the recov
dbd0: 65 72 61 62 69 6c 69 74 79 20 6f 66 20 61 20 64  erability of a d
dbe0: 61 74 61 62 61 73 65 20 69 6e 0a 2a 2a 20 74 68  atabase in.** th
dbf0: 65 20 65 76 65 6e 74 20 6f 66 20 61 20 70 72 6f  e event of a pro
dc00: 67 72 61 6d 20 63 72 61 73 68 2e 0a 2a 2f 0a 73  gram crash..*/.s
dc10: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
dc20: 5f 61 62 6f 72 74 28 0a 20 20 76 6f 69 64 20 2a  _abort(.  void *
dc30: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
dc40: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
dc50: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
dc60: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
dc70: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
dc80: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
dc90: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
dca0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
dcb0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
dcc0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
dcd0: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
dce0: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
dcf0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 4d 53  .#if defined(_MS
dd00: 43 5f 56 45 52 29 0a 20 20 2f 2a 20 57 65 20 64  C_VER).  /* We d
dd10: 6f 20 74 68 69 73 2c 20 6f 74 68 65 72 77 69 73  o this, otherwis
dd20: 65 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20  e the test will 
dd30: 68 61 6c 74 20 77 69 74 68 20 61 20 70 6f 70 75  halt with a popu
dd40: 70 20 6d 65 73 73 61 67 65 0a 20 20 20 2a 20 74  p message.   * t
dd50: 68 61 74 20 77 65 20 68 61 76 65 20 74 6f 20 63  hat we have to c
dd60: 6c 69 63 6b 20 61 77 61 79 20 62 65 66 6f 72 65  lick away before
dd70: 20 74 68 65 20 74 65 73 74 20 77 69 6c 6c 20 63   the test will c
dd80: 6f 6e 74 69 6e 75 65 2e 0a 20 20 20 2a 2f 0a 20  ontinue..   */. 
dd90: 20 5f 73 65 74 5f 61 62 6f 72 74 5f 62 65 68 61   _set_abort_beha
dda0: 76 69 6f 72 28 20 30 2c 20 5f 43 41 4c 4c 5f 52  vior( 0, _CALL_R
ddb0: 45 50 4f 52 54 46 41 55 4c 54 20 29 3b 0a 23 65  EPORTFAULT );.#e
ddc0: 6e 64 69 66 0a 20 20 65 78 69 74 28 32 35 35 29  ndif.  exit(255)
ddd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 69 6e 74 65  ;.  assert( inte
dde0: 72 70 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 54 68  rp==0 );   /* Th
ddf0: 69 73 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 66  is will always f
de00: 61 69 6c 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  ail */.  return 
de10: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
de20: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
de30: 6f 75 74 69 6e 65 20 69 73 20 61 20 75 73 65 72  outine is a user
de40: 2d 64 65 66 69 6e 65 64 20 53 51 4c 20 66 75 6e  -defined SQL fun
de50: 63 74 69 6f 6e 20 77 68 6f 73 65 20 70 75 72 70  ction whose purp
de60: 6f 73 65 0a 2a 2a 20 69 73 20 74 6f 20 74 65 73  ose.** is to tes
de70: 74 20 74 68 65 20 73 71 6c 69 74 65 5f 73 65 74  t the sqlite_set
de80: 5f 72 65 73 75 6c 74 28 29 20 41 50 49 2e 0a 2a  _result() API..*
de90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
dea0: 73 74 46 75 6e 63 28 73 71 6c 69 74 65 33 5f 63  stFunc(sqlite3_c
deb0: 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c  ontext *context,
dec0: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
ded0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
dee0: 7b 0a 20 20 77 68 69 6c 65 28 20 61 72 67 63 3e  {.  while( argc>
def0: 3d 32 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =2 ){.    const 
df00: 63 68 61 72 20 2a 7a 41 72 67 30 20 3d 20 28 63  char *zArg0 = (c
df10: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
df20: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
df30: 3b 0a 20 20 20 20 69 66 28 20 7a 41 72 67 30 20  ;.    if( zArg0 
df40: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  ){.      if( 0==
df50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
df60: 41 72 67 30 2c 20 22 69 6e 74 22 29 20 29 7b 0a  Arg0, "int") ){.
df70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
df80: 72 65 73 75 6c 74 5f 69 6e 74 28 63 6f 6e 74 65  result_int(conte
df90: 78 74 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  xt, sqlite3_valu
dfa0: 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 29 3b  e_int(argv[1]));
dfb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
dfc0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
dfd0: 7a 41 72 67 30 2c 22 69 6e 74 36 34 22 29 3d 3d  zArg0,"int64")==
dfe0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
dff0: 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 36  ite3_result_int6
e000: 34 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74  4(context, sqlit
e010: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 36 34 28 61  e3_value_int64(a
e020: 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20  rgv[1]));.      
e030: 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
e040: 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c 22  3StrICmp(zArg0,"
e050: 73 74 72 69 6e 67 22 29 3d 3d 30 20 29 7b 0a 20  string")==0 ){. 
e060: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
e070: 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74 65  esult_text(conte
e080: 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69 74  xt, (char*)sqlit
e090: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
e0a0: 67 76 5b 31 5d 29 2c 20 2d 31 2c 0a 20 20 20 20  gv[1]), -1,.    
e0b0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
e0c0: 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20  RANSIENT);.     
e0d0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
e0e0: 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67 30 2c  e3StrICmp(zArg0,
e0f0: 22 64 6f 75 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "double")==0 ){.
e100: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
e110: 72 65 73 75 6c 74 5f 64 6f 75 62 6c 65 28 63 6f  result_double(co
e120: 6e 74 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 76  ntext, sqlite3_v
e130: 61 6c 75 65 5f 64 6f 75 62 6c 65 28 61 72 67 76  alue_double(argv
e140: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
e150: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
e160: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 6e 75 6c  rICmp(zArg0,"nul
e170: 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  l")==0 ){.      
e180: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
e190: 5f 6e 75 6c 6c 28 63 6f 6e 74 65 78 74 29 3b 0a  _null(context);.
e1a0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
e1b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
e1c0: 41 72 67 30 2c 22 76 61 6c 75 65 22 29 3d 3d 30  Arg0,"value")==0
e1d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
e1e0: 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c 75 65  te3_result_value
e1f0: 28 63 6f 6e 74 65 78 74 2c 20 61 72 67 76 5b 73  (context, argv[s
e200: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69 6e 74  qlite3_value_int
e210: 28 61 72 67 76 5b 31 5d 29 5d 29 3b 0a 20 20 20  (argv[1])]);.   
e220: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
e230: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
e240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e250: 6c 73 65 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  lse{.      goto 
e260: 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d  error_out;.    }
e270: 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 3b 0a  .    argc -= 2;.
e280: 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b 0a 20      argv += 2;. 
e290: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 0a 65 72   }.  return;..er
e2a0: 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
e2b0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
e2c0: 63 6f 6e 74 65 78 74 2c 22 66 69 72 73 74 20 61  context,"first a
e2d0: 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20 62  rgument should b
e2e0: 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20  e one of: ".    
e2f0: 20 20 22 69 6e 74 20 69 6e 74 36 34 20 73 74 72    "int int64 str
e300: 69 6e 67 20 64 6f 75 62 6c 65 20 6e 75 6c 6c 20  ing double null 
e310: 76 61 6c 75 65 22 2c 20 2d 31 29 3b 0a 7d 0a 0a  value", -1);.}..
e320: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
e330: 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74  qlite_register_t
e340: 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 20 44 42  est_function  DB
e350: 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 67    NAME.**.** Reg
e360: 69 73 74 65 72 20 74 68 65 20 74 65 73 74 20 53  ister the test S
e370: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 20 74  QL function on t
e380: 68 65 20 64 61 74 61 62 61 73 65 20 44 42 20 75  he database DB u
e390: 6e 64 65 72 20 74 68 65 20 6e 61 6d 65 20 4e 41  nder the name NA
e3a0: 4d 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ME..*/.static in
e3b0: 74 20 74 65 73 74 5f 72 65 67 69 73 74 65 72 5f  t test_register_
e3c0: 66 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  func(.  void *No
e3d0: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
e3e0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
e3f0: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
e400: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
e410: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
e420: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
e430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e440: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
e450: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
e460: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
e470: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
e480: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
e490: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
e4a0: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
e4b0: 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
e4c0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e4d0: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
e4e0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
e4f0: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
e500: 20 20 20 20 20 22 20 44 42 20 46 55 4e 43 54 49       " DB FUNCTI
e510: 4f 4e 2d 4e 41 4d 45 22 2c 20 30 29 3b 0a 20 20  ON-NAME", 0);.  
e520: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
e530: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
e540: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
e550: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
e560: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
e570: 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
e580: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
e590: 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32 5d 2c  ion(db, argv[2],
e5a0: 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38   -1, SQLITE_UTF8
e5b0: 2c 20 30 2c 20 0a 20 20 20 20 20 20 74 65 73 74  , 0, .      test
e5c0: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
e5d0: 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
e5e0: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
e5f0: 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
e600: 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b 0a  ErrStr(rc), 0);.
e610: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
e620: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
e630: 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f  sqlite3TestErrCo
e640: 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72  de(interp, db, r
e650: 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
e660: 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20  ERROR;.  return 
e670: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
e680: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
e690: 5f 66 69 6e 61 6c 69 7a 65 20 20 53 54 4d 54 20  _finalize  STMT 
e6a0: 0a 2a 2a 0a 2a 2a 20 46 69 6e 61 6c 69 7a 65 20  .**.** Finalize 
e6b0: 61 20 73 74 61 74 65 6d 65 6e 74 20 68 61 6e 64  a statement hand
e6c0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
e6d0: 74 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 28  t test_finalize(
e6e0: 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
e6f0: 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
e700: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
e710: 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
e720: 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
e730: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
e740: 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
e750: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  rc;.  sqlite3 *d
e760: 62 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62  b = 0;..  if( ob
e770: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
e780: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e790: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
e7a0: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
e7b0: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
e7c0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
e7d0: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
e7e0: 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20  <STMT>", 0);.   
e7f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e800: 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65  R;.  }..  if( ge
e810: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
e820: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
e830: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
e840: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
e850: 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20  L_ERROR;..  if( 
e860: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 64 62 20  pStmt ){.    db 
e870: 3d 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  = StmtToDb(pStmt
e880: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
e890: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
e8a0: 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74  Stmt);.  Tcl_Set
e8b0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
e8c0: 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
e8d0: 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
e8e0: 49 43 29 3b 0a 20 20 69 66 28 20 64 62 20 26 26  IC);.  if( db &&
e8f0: 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72 43   sqlite3TestErrC
e900: 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62 2c 20  ode(interp, db, 
e910: 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
e920: 5f 45 52 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e  _ERROR;.  return
e930: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
e940: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
e950: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 20 20 53  3_stmt_status  S
e960: 54 4d 54 20 20 43 4f 44 45 20 20 52 45 53 45 54  TMT  CODE  RESET
e970: 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 47 65 74 20 74  FLAG.**.** Get t
e980: 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73 74  he value of a st
e990: 61 74 75 73 20 63 6f 75 6e 74 65 72 20 66 72 6f  atus counter fro
e9a0: 6d 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  m a statement..*
e9b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
e9c0: 74 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 0a 20  t_stmt_status(. 
e9d0: 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
e9e0: 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
e9f0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
ea00: 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
ea10: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
ea20: 0a 20 20 69 6e 74 20 69 56 61 6c 75 65 3b 0a 20  .  int iValue;. 
ea30: 20 69 6e 74 20 69 2c 20 6f 70 2c 20 72 65 73 65   int i, op, rese
ea40: 74 46 6c 61 67 3b 0a 20 20 63 6f 6e 73 74 20 63  tFlag;.  const c
ea50: 68 61 72 20 2a 7a 4f 70 4e 61 6d 65 3b 0a 20 20  har *zOpName;.  
ea60: 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
ea70: 74 6d 74 3b 0a 0a 20 20 73 74 61 74 69 63 20 63  tmt;..  static c
ea80: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
ea90: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
eaa0: 61 6d 65 3b 0a 20 20 20 20 69 6e 74 20 6f 70 3b  ame;.    int op;
eab0: 0a 20 20 7d 20 61 4f 70 5b 5d 20 3d 20 7b 0a 20  .  } aOp[] = {. 
eac0: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
ead0: 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
eae0: 5f 53 54 45 50 22 2c 20 20 20 53 51 4c 49 54 45  _STEP",   SQLITE
eaf0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55 4c 4c  _STMTSTATUS_FULL
eb00: 53 43 41 4e 5f 53 54 45 50 20 20 20 7d 2c 0a 20  SCAN_STEP   },. 
eb10: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
eb20: 54 53 54 41 54 55 53 5f 53 4f 52 54 22 2c 20 20  TSTATUS_SORT",  
eb30: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
eb40: 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54  _STMTSTATUS_SORT
eb50: 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
eb60: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
eb70: 54 53 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45  TSTATUS_AUTOINDE
eb80: 58 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45  X",       SQLITE
eb90: 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54 4f  _STMTSTATUS_AUTO
eba0: 49 4e 44 45 58 20 20 20 20 20 20 20 7d 2c 0a 20  INDEX       },. 
ebb0: 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 53 54 4d     { "SQLITE_STM
ebc0: 54 53 54 41 54 55 53 5f 56 4d 5f 53 54 45 50 22  TSTATUS_VM_STEP"
ebd0: 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ,         SQLITE
ebe0: 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53  _STMTSTATUS_VM_S
ebf0: 54 45 50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  TEP         },. 
ec00: 20 7d 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d   };.  if( objc!=
ec10: 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
ec20: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
ec30: 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
ec40: 20 50 41 52 41 4d 45 54 45 52 20 52 45 53 45 54   PARAMETER RESET
ec50: 46 4c 41 47 22 29 3b 0a 20 20 20 20 72 65 74 75  FLAG");.    retu
ec60: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ec70: 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  }.  if( getStmtP
ec80: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
ec90: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
eca0: 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
ecb0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ecc0: 52 3b 0a 20 20 7a 4f 70 4e 61 6d 65 20 3d 20 54  R;.  zOpName = T
ecd0: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
ece0: 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  v[2]);.  for(i=0
ecf0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4f  ; i<ArraySize(aO
ed00: 70 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  p); i++){.    if
ed10: 28 20 73 74 72 63 6d 70 28 61 4f 70 5b 69 5d 2e  ( strcmp(aOp[i].
ed20: 7a 4e 61 6d 65 2c 20 7a 4f 70 4e 61 6d 65 29 3d  zName, zOpName)=
ed30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6f 70 20 3d  =0 ){.      op =
ed40: 20 61 4f 70 5b 69 5d 2e 6f 70 3b 0a 20 20 20 20   aOp[i].op;.    
ed50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ed60: 20 7d 0a 20 20 69 66 28 20 69 3e 3d 41 72 72 61   }.  if( i>=Arra
ed70: 79 53 69 7a 65 28 61 4f 70 29 20 29 7b 0a 20 20  ySize(aOp) ){.  
ed80: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
ed90: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
eda0: 6f 62 6a 76 5b 32 5d 2c 20 26 6f 70 29 20 29 20  objv[2], &op) ) 
edb0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
edc0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
edd0: 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62  GetBooleanFromOb
ede0: 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
edf0: 5d 2c 20 26 72 65 73 65 74 46 6c 61 67 29 20 29  ], &resetFlag) )
ee00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
ee10: 52 3b 0a 20 20 69 56 61 6c 75 65 20 3d 20 73 71  R;.  iValue = sq
ee20: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
ee30: 73 28 70 53 74 6d 74 2c 20 6f 70 2c 20 72 65 73  s(pStmt, op, res
ee40: 65 74 46 6c 61 67 29 3b 0a 20 20 54 63 6c 5f 53  etFlag);.  Tcl_S
ee50: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ee60: 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
ee70: 6a 28 69 56 61 6c 75 65 29 29 3b 0a 20 20 72 65  j(iValue));.  re
ee80: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
ee90: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
eea0: 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
eeb0: 41 54 55 53 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ATUS./*.** Usage
eec0: 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  :  sqlite3_stmt_
eed0: 73 63 61 6e 73 74 61 74 75 73 20 53 54 4d 54 20  scanstatus STMT 
eee0: 49 44 58 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  IDX.*/.static in
eef0: 74 20 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e  t test_stmt_scan
ef00: 73 74 61 74 75 73 28 0a 20 20 76 6f 69 64 20 2a  status(.  void *
ef10: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
ef20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ef30: 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
ef40: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
ef50: 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
ef60: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
ef70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
ef80: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 2a 2f  irst argument */
ef90: 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 20 20 20  .  int idx;     
efa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
efb0: 20 20 20 2f 2a 20 53 65 63 6f 6e 64 20 61 72 67     /* Second arg
efc0: 75 6d 65 6e 74 20 2a 2f 0a 0a 20 20 63 6f 6e 73  ument */..  cons
efd0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20  t char *zName;. 
efe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78   const char *zEx
eff0: 70 6c 61 69 6e 3b 0a 20 20 73 71 6c 69 74 65 33  plain;.  sqlite3
f000: 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 3b 0a 20 20  _int64 nLoop;.  
f010: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 56  sqlite3_int64 nV
f020: 69 73 69 74 3b 0a 20 20 64 6f 75 62 6c 65 20 72  isit;.  double r
f030: 45 73 74 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a  Est;.  int res;.
f040: 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
f050: 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
f060: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
f070: 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 49 44  , objv, "STMT ID
f080: 58 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  X");.    return 
f090: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
f0a0: 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
f0b0: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
f0c0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
f0d0: 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
f0e0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
f0f0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
f100: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f110: 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29  objv[2], &idx) )
f120: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f130: 52 3b 0a 0a 20 20 72 65 73 20 3d 20 73 71 6c 69  R;..  res = sqli
f140: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
f150: 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  tus(pStmt, idx, 
f160: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
f170: 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e  NLOOP, (void*)&n
f180: 4c 6f 6f 70 29 3b 0a 20 20 69 66 28 20 72 65 73  Loop);.  if( res
f190: 3d 3d 30 20 29 7b 0a 20 20 20 20 54 63 6c 5f 4f  ==0 ){.    Tcl_O
f1a0: 62 6a 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e  bj *pRet = Tcl_N
f1b0: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 54 63 6c  ewObj();.    Tcl
f1c0: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
f1d0: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
f1e0: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
f1f0: 22 6e 4c 6f 6f 70 22 2c 20 2d 31 29 29 3b 0a 20  "nLoop", -1));. 
f200: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f210: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f220: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  Ret, Tcl_NewWide
f230: 49 6e 74 4f 62 6a 28 6e 4c 6f 6f 70 29 29 3b 0a  IntObj(nLoop));.
f240: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
f250: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53 74 6d  _scanstatus(pStm
f260: 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45 5f 53  t, idx, SQLITE_S
f270: 43 41 4e 53 54 41 54 5f 4e 56 49 53 49 54 2c 20  CANSTAT_NVISIT, 
f280: 28 76 6f 69 64 2a 29 26 6e 56 69 73 69 74 29 3b  (void*)&nVisit);
f290: 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  .    Tcl_ListObj
f2a0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c  AppendElement(0,
f2b0: 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
f2c0: 72 69 6e 67 4f 62 6a 28 22 6e 56 69 73 69 74 22  ringObj("nVisit"
f2d0: 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
f2e0: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f2f0: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
f300: 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
f310: 6e 56 69 73 69 74 29 29 3b 0a 20 20 20 20 73 71  nVisit));.    sq
f320: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
f330: 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78  tatus(pStmt, idx
f340: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
f350: 54 5f 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72  T_EST, (void*)&r
f360: 45 73 74 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  Est);.    Tcl_Li
f370: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f380: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
f390: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6e 45  NewStringObj("nE
f3a0: 73 74 22 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54  st", -1));.    T
f3b0: 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
f3c0: 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c  Element(0, pRet,
f3d0: 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f 62   Tcl_NewDoubleOb
f3e0: 6a 28 72 45 73 74 29 29 3b 0a 20 20 20 20 73 71  j(rEst));.    sq
f3f0: 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
f400: 74 61 74 75 73 28 70 53 74 6d 74 2c 20 69 64 78  tatus(pStmt, idx
f410: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
f420: 54 5f 4e 41 4d 45 2c 20 28 76 6f 69 64 2a 29 26  T_NAME, (void*)&
f430: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 54 63 6c 5f  zName);.    Tcl_
f440: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
f450: 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63  ment(0, pRet, Tc
f460: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
f470: 7a 4e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 20 20  zName", -1));.  
f480: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
f490: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
f4a0: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
f4b0: 67 4f 62 6a 28 7a 4e 61 6d 65 2c 20 2d 31 29 29  gObj(zName, -1))
f4c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
f4d0: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 53  mt_scanstatus(pS
f4e0: 74 6d 74 2c 20 69 64 78 2c 20 53 51 4c 49 54 45  tmt, idx, SQLITE
f4f0: 5f 53 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49  _SCANSTAT_EXPLAI
f500: 4e 2c 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c  N, (void*)&zExpl
f510: 61 69 6e 29 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ain);.    Tcl_Li
f520: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
f530: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
f540: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 7a 45  NewStringObj("zE
f550: 78 70 6c 61 69 6e 22 2c 20 2d 31 29 29 3b 0a 20  xplain", -1));. 
f560: 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70     Tcl_ListObjAp
f570: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
f580: 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  Ret, Tcl_NewStri
f590: 6e 67 4f 62 6a 28 7a 45 78 70 6c 61 69 6e 2c 20  ngObj(zExplain, 
f5a0: 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  -1));.    Tcl_Se
f5b0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
f5c0: 70 2c 20 70 52 65 74 29 3b 0a 20 20 7d 65 6c 73  p, pRet);.  }els
f5d0: 65 7b 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74  e{.    Tcl_Reset
f5e0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a  Result(interp);.
f5f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
f600: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
f610: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74  age:  sqlite3_st
f620: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65  mt_scanstatus_re
f630: 73 65 74 20 20 53 54 4d 54 0a 2a 2f 0a 73 74 61  set  STMT.*/.sta
f640: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
f650: 74 5f 73 63 61 6e 73 74 61 74 75 73 5f 72 65 73  t_scanstatus_res
f660: 65 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  et(.  void * cli
f670: 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
f680: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
f690: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
f6a0: 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
f6b0: 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
f6c0: 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 20  stmt *pStmt;    
f6d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
f6e0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 69   argument */.  i
f6f0: 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
f700: 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
f710: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
f720: 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
f730: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
f740: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
f750: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
f760: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f770: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
f780: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
f790: 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
f7a0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
f7b0: 73 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  s_reset(pStmt);.
f7c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
f7d0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f7e0: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
f7f0: 5f 6e 65 78 74 5f 73 74 6d 74 20 20 44 42 20 20  _next_stmt  DB  
f800: 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  STMT.**.** Retur
f810: 6e 20 74 68 65 20 6e 65 78 74 20 73 74 61 74 6d  n the next statm
f820: 65 6e 74 20 69 6e 20 73 65 71 75 65 6e 63 65 20  ent in sequence 
f830: 61 66 74 65 72 20 53 54 4d 54 2e 0a 2a 2f 0a 73  after STMT..*/.s
f840: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6e  tatic int test_n
f850: 65 78 74 5f 73 74 6d 74 28 0a 20 20 76 6f 69 64  ext_stmt(.  void
f860: 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
f870: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
f880: 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
f890: 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
f8a0: 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
f8b0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
f8c0: 74 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  t;.  sqlite3 *db
f8d0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
f8e0: 66 5b 35 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  f[50];..  if( ob
f8f0: 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
f900: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
f910: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
f920: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
f930: 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
f940: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
f950: 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
f960: 44 42 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20  DB STMT", 0);.  
f970: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f980: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
f990: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
f9a0: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
f9b0: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
f9c0: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
f9d0: 52 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74  ROR;.  if( getSt
f9e0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
f9f0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
fa00: 6f 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74  objv[2]), &pStmt
fa10: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
fa20: 52 52 4f 52 3b 0a 20 20 70 53 74 6d 74 20 3d 20  RROR;.  pStmt = 
fa30: 73 71 6c 69 74 65 33 5f 6e 65 78 74 5f 73 74 6d  sqlite3_next_stm
fa40: 74 28 64 62 2c 20 70 53 74 6d 74 29 3b 0a 20 20  t(db, pStmt);.  
fa50: 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
fa60: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
fa70: 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
fa80: 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
fa90: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
faa0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 54 63 6c 5f  _ERROR;.    Tcl_
fab0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fac0: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
fad0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
fae0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
faf0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ge:  sqlite3_stm
fb00: 74 5f 72 65 61 64 6f 6e 6c 79 20 20 53 54 4d 54  t_readonly  STMT
fb10: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
fb20: 75 65 20 69 66 20 53 54 4d 54 20 69 73 20 61 20  ue if STMT is a 
fb30: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 6f 72 20  NULL pointer or 
fb40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73  a pointer to a s
fb50: 74 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74  tatement.** that
fb60: 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
fb70: 6f 20 6c 65 61 76 65 20 74 68 65 20 64 61 74 61  o leave the data
fb80: 62 61 73 65 20 75 6e 6d 6f 64 69 66 69 65 64 2e  base unmodified.
fb90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
fba0: 65 73 74 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c  est_stmt_readonl
fbb0: 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
fbc0: 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
fbd0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
fbe0: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
fbf0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
fc00: 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
fc10: 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
fc20: 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
fc30: 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
fc40: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
fc50: 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
fc60: 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
fc70: 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
fc80: 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
fc90: 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
fca0: 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TMT", 0);.    re
fcb0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fcc0: 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
fcd0: 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
fce0: 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
fcf0: 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
fd00: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
fd10: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
fd20: 69 74 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e  ite3_stmt_readon
fd30: 6c 79 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c  ly(pStmt);.  Tcl
fd40: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
fd50: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
fd60: 6c 65 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20  leanObj(rc));.  
fd70: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
fd80: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
fd90: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73  sqlite3_stmt_bus
fda0: 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65  y  STMT.**.** Re
fdb0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d  turn true if STM
fdc0: 54 20 69 73 20 61 20 6e 6f 6e 2d 4e 55 4c 4c 20  T is a non-NULL 
fdd0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 73 74 61  pointer to a sta
fde0: 74 65 6d 65 6e 74 0a 2a 2a 20 74 68 61 74 20 68  tement.** that h
fdf0: 61 73 20 62 65 65 6e 20 73 74 65 70 70 65 64 20  as been stepped 
fe00: 62 75 74 20 6e 6f 74 20 74 6f 20 63 6f 6d 70 6c  but not to compl
fe10: 65 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  etion..*/.static
fe20: 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 62   int test_stmt_b
fe30: 75 73 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  usy(.  void * cl
fe40: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
fe50: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
fe60: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
fe70: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
fe80: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
fe90: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
fea0: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
feb0: 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
fec0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
fed0: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
fee0: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
fef0: 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
ff00: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
ff10: 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
ff20: 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
ff30: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
ff40: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
ff50: 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
ff60: 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
ff70: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
ff80: 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
ff90: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
ffa0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 62 75 73 79  qlite3_stmt_busy
ffb0: 28 70 53 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53  (pStmt);.  Tcl_S
ffc0: 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
ffd0: 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65  rp, Tcl_NewBoole
ffe0: 61 6e 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65  anObj(rc));.  re
fff0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
10000 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 75 73  /*.** Usage:  us
10010 65 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20  es_stmt_journal 
10020 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75   STMT.**.** Retu
10030 72 6e 20 74 72 75 65 20 69 66 20 53 54 4d 54 20  rn true if STMT 
10040 75 73 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74  uses a statement
10050 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61   journal..*/.sta
10060 74 69 63 20 69 6e 74 20 75 73 65 73 5f 73 74 6d  tic int uses_stm
10070 74 5f 6a 6f 75 72 6e 61 6c 28 0a 20 20 76 6f 69  t_journal(.  voi
10080 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
10090 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
100a0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
100b0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
100c0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
100d0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
100e0 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
100f0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
10100 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
10110 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
10120 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
10130 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
10140 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
10150 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
10160 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  T", 0);.    retu
10170 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
10180 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
10190 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
101a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
101b0 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
101c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
101d0 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  OR;.  sqlite3_st
101e0 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53 74 6d  mt_readonly(pStm
101f0 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  t);.  Tcl_SetObj
10200 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
10210 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
10220 28 28 28 56 64 62 65 20 2a 29 70 53 74 6d 74 29  (((Vdbe *)pStmt)
10230 2d 3e 75 73 65 73 53 74 6d 74 4a 6f 75 72 6e 61  ->usesStmtJourna
10240 6c 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  l));.  return TC
10250 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
10260 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
10270 72 65 73 65 74 20 20 53 54 4d 54 20 0a 2a 2a 0a  reset  STMT .**.
10280 2a 2a 20 52 65 73 65 74 20 61 20 73 74 61 74 65  ** Reset a state
10290 6d 65 6e 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a  ment handle..*/.
102a0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
102b0 72 65 73 65 74 28 0a 20 20 76 6f 69 64 20 2a 20  reset(.  void * 
102c0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
102d0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
102e0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
102f0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10300 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
10310 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
10320 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
10330 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
10340 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
10350 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
10360 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
10370 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
10380 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
10390 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
103a0 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29 3b 0a   " <STMT>", 0);.
103b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
103c0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
103d0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
103e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
103f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
10400 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
10410 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
10420 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
10430 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20  t(pStmt);.  if( 
10440 70 53 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33  pStmt && sqlite3
10450 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
10460 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
10470 6d 74 29 2c 20 72 63 29 20 29 7b 0a 20 20 20 20  mt), rc) ){.    
10480 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10490 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52  ;.  }.  Tcl_SetR
104a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
104b0 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
104c0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
104d0 43 29 3b 0a 2f 2a 0a 20 20 69 66 28 20 72 63 20  C);./*.  if( rc 
104e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
104f0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a  L_ERROR;.  }.*/.
10500 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10510 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
10520 20 20 73 71 6c 69 74 65 33 5f 65 78 70 69 72 65    sqlite3_expire
10530 64 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65  d STMT .**.** Re
10540 74 75 72 6e 20 54 52 55 45 20 69 66 20 61 20 72  turn TRUE if a r
10550 65 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20  ecompilation of 
10560 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
10570 20 72 65 63 6f 6d 6d 65 6e 64 65 64 2e 0a 2a 2f   recommended..*/
10580 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
10590 5f 65 78 70 69 72 65 64 28 0a 20 20 76 6f 69 64  _expired(.  void
105a0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
105b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
105c0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
105d0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
105e0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
105f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
10600 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c  DEPRECATED.  sql
10610 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
10620 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
10630 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
10640 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
10650 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
10660 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
10670 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
10680 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
10690 30 5d 2c 20 30 29 2c 20 22 20 3c 53 54 4d 54 3e  0], 0), " <STMT>
106a0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
106b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
106c0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
106d0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
106e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
106f0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
10700 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
10710 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
10720 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
10730 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 73  _NewBooleanObj(s
10740 71 6c 69 74 65 33 5f 65 78 70 69 72 65 64 28 70  qlite3_expired(p
10750 53 74 6d 74 29 29 29 3b 0a 23 65 6e 64 69 66 0a  Stmt)));.#endif.
10760 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
10770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
10780 20 20 73 71 6c 69 74 65 33 5f 74 72 61 6e 73 66    sqlite3_transf
10790 65 72 5f 62 69 6e 64 69 6e 67 73 20 46 52 4f 4d  er_bindings FROM
107a0 53 54 4d 54 20 54 4f 53 54 4d 54 0a 2a 2a 0a 2a  STMT TOSTMT.**.*
107b0 2a 20 54 72 61 6e 73 66 65 72 20 61 6c 6c 20 62  * Transfer all b
107c0 69 6e 64 69 6e 67 73 20 66 72 6f 6d 20 46 52 4f  indings from FRO
107d0 4d 53 54 4d 54 20 6f 76 65 72 20 74 6f 20 54 4f  MSTMT over to TO
107e0 53 54 4d 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69  STMT.*/.static i
107f0 6e 74 20 74 65 73 74 5f 74 72 61 6e 73 66 65 72  nt test_transfer
10800 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 20  _bind(.  void * 
10810 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
10820 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
10830 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
10840 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
10850 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
10860 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
10870 52 45 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65  RECATED.  sqlite
10880 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 31 2c 20  3_stmt *pStmt1, 
10890 2a 70 53 74 6d 74 32 3b 0a 20 20 69 66 28 20 6f  *pStmt2;.  if( o
108a0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
108b0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
108c0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
108d0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
108e0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
108f0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
10900 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
10910 20 46 52 4f 4d 2d 53 54 4d 54 20 54 4f 2d 53 54   FROM-STMT TO-ST
10920 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
10930 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10940 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74   }.  if( getStmt
10950 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
10960 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
10970 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 31 29  jv[1]), &pStmt1)
10980 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
10990 4f 52 3b 0a 20 20 69 66 28 20 67 65 74 53 74 6d  OR;.  if( getStm
109a0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
109b0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
109c0 62 6a 76 5b 32 5d 29 2c 20 26 70 53 74 6d 74 32  bjv[2]), &pStmt2
109d0 29 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  )) return TCL_ER
109e0 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
109f0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
10a00 0a 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74  .     Tcl_NewInt
10a10 4f 62 6a 28 73 71 6c 69 74 65 33 5f 74 72 61 6e  Obj(sqlite3_tran
10a20 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 28 70 53  sfer_bindings(pS
10a30 74 6d 74 31 2c 70 53 74 6d 74 32 29 29 29 3b 0a  tmt1,pStmt2)));.
10a40 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
10a50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10a60 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33   Usage:  sqlite3
10a70 5f 63 68 61 6e 67 65 73 20 44 42 0a 2a 2a 0a 2a  _changes DB.**.*
10a80 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
10a90 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 6d  ber of changes m
10aa0 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  ade to the datab
10ab0 61 73 65 20 62 79 20 74 68 65 20 6c 61 73 74 20  ase by the last 
10ac0 53 51 4c 0a 2a 2a 20 65 78 65 63 75 74 69 6f 6e  SQL.** execution
10ad0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
10ae0 74 65 73 74 5f 63 68 61 6e 67 65 73 28 0a 20 20  test_changes(.  
10af0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
10b00 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
10b10 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
10b20 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
10b30 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
10b40 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
10b50 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
10b60 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
10b70 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
10b80 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
10b90 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
10ba0 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
10bb0 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42 22 2c  objv[0]), " DB",
10bc0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
10bd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
10be0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
10bf0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
10c00 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
10c10 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
10c20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
10c30 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
10c40 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
10c50 4f 62 6a 28 73 71 6c 69 74 65 33 5f 63 68 61 6e  Obj(sqlite3_chan
10c60 67 65 73 28 64 62 29 29 29 3b 0a 20 20 72 65 74  ges(db)));.  ret
10c70 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
10c80 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
10c90 20 22 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61   "static_bind_va
10ca0 6c 75 65 22 20 74 68 61 74 20 76 61 72 69 61 62  lue" that variab
10cb0 6c 65 73 20 61 72 65 20 62 6f 75 6e 64 20 74 6f  les are bound to
10cc0 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 46 4c 41   when.** the FLA
10cd0 47 20 6f 70 74 69 6f 6e 20 6f 66 20 73 71 6c 69  G option of sqli
10ce0 74 65 33 5f 62 69 6e 64 20 69 73 20 22 73 74 61  te3_bind is "sta
10cf0 74 69 63 22 0a 2a 2f 0a 73 74 61 74 69 63 20 63  tic".*/.static c
10d00 68 61 72 20 2a 73 71 6c 69 74 65 5f 73 74 61 74  har *sqlite_stat
10d10 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 20 3d 20  ic_bind_value = 
10d20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  0;.static int sq
10d30 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
10d40 5f 6e 62 79 74 65 20 3d 20 30 3b 0a 0a 2f 2a 0a  _nbyte = 0;../*.
10d50 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
10d60 65 33 5f 62 69 6e 64 20 20 56 4d 20 20 49 44 58  e3_bind  VM  IDX
10d70 20 20 56 41 4c 55 45 20 20 46 4c 41 47 53 0a 2a    VALUE  FLAGS.*
10d80 2a 0a 2a 2a 20 53 65 74 73 20 74 68 65 20 76 61  *.** Sets the va
10d90 6c 75 65 20 6f 66 20 74 68 65 20 49 44 58 2d 74  lue of the IDX-t
10da0 68 20 6f 63 63 75 72 72 65 6e 63 65 20 6f 66 20  h occurrence of 
10db0 22 3f 22 20 69 6e 20 74 68 65 20 6f 72 69 67 69  "?" in the origi
10dc0 6e 61 6c 20 53 51 4c 0a 2a 2a 20 73 74 72 69 6e  nal SQL.** strin
10dd0 67 2e 20 20 56 41 4c 55 45 20 69 73 20 74 68 65  g.  VALUE is the
10de0 20 6e 65 77 20 76 61 6c 75 65 2e 20 20 49 66 20   new value.  If 
10df0 46 4c 41 47 53 3d 3d 22 6e 75 6c 6c 22 20 74 68  FLAGS=="null" th
10e00 65 6e 20 56 41 4c 55 45 20 69 73 0a 2a 2a 20 69  en VALUE is.** i
10e10 67 6e 6f 72 65 64 20 61 6e 64 20 74 68 65 20 76  gnored and the v
10e20 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20 4e  alue is set to N
10e30 55 4c 4c 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d  ULL.  If FLAGS==
10e40 22 73 74 61 74 69 63 22 20 74 68 65 6e 0a 2a 2a  "static" then.**
10e50 20 74 68 65 20 76 61 6c 75 65 20 69 73 20 73 65   the value is se
10e60 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 6f  t to the value o
10e70 66 20 61 20 73 74 61 74 69 63 20 76 61 72 69 61  f a static varia
10e80 62 6c 65 20 6e 61 6d 65 64 0a 2a 2a 20 22 73 71  ble named.** "sq
10e90 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64  lite_static_bind
10ea0 5f 76 61 6c 75 65 22 2e 20 20 49 66 20 46 4c 41  _value".  If FLA
10eb0 47 53 3d 3d 22 6e 6f 72 6d 61 6c 22 20 74 68 65  GS=="normal" the
10ec0 6e 20 61 20 63 6f 70 79 0a 2a 2a 20 6f 66 20 74  n a copy.** of t
10ed0 68 65 20 56 41 4c 55 45 20 69 73 20 6d 61 64 65  he VALUE is made
10ee0 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22 62 6c  .  If FLAGS=="bl
10ef0 6f 62 31 30 22 20 74 68 65 6e 20 61 20 56 41 4c  ob10" then a VAL
10f00 55 45 20 69 73 20 69 67 6e 6f 72 65 64 0a 2a 2a  UE is ignored.**
10f10 20 61 6e 20 61 20 31 30 2d 62 79 74 65 20 62 6c   an a 10-byte bl
10f20 6f 62 20 22 61 62 63 5c 30 30 30 78 79 7a 5c 30  ob "abc\000xyz\0
10f30 30 30 70 71 22 20 69 73 20 69 6e 73 65 72 74 65  00pq" is inserte
10f40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
10f50 20 74 65 73 74 5f 62 69 6e 64 28 0a 20 20 76 6f   test_bind(.  vo
10f60 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
10f70 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
10f80 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
10f90 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
10fa0 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
10fb0 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
10fc0 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
10fd0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
10fe0 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
10ff0 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
11000 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
11010 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
11020 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  /.){.  sqlite3_s
11030 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e  tmt *pStmt;.  in
11040 74 20 72 63 3b 0a 20 20 69 6e 74 20 69 64 78 3b  t rc;.  int idx;
11050 0a 20 20 69 66 28 20 61 72 67 63 21 3d 35 20 29  .  if( argc!=5 )
11060 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
11070 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
11080 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
11090 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
110a0 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20  v[0], .       " 
110b0 56 4d 20 49 44 58 20 56 41 4c 55 45 20 28 6e 75  VM IDX VALUE (nu
110c0 6c 6c 7c 73 74 61 74 69 63 7c 6e 6f 72 6d 61 6c  ll|static|normal
110d0 29 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  )\"", 0);.    re
110e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
110f0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
11100 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
11110 20 61 72 67 76 5b 31 5d 2c 20 26 70 53 74 6d 74   argv[1], &pStmt
11120 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
11130 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
11140 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61  GetInt(interp, a
11150 72 67 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20  rgv[2], &idx) ) 
11160 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
11170 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 61  ;.  if( strcmp(a
11180 72 67 76 5b 34 5d 2c 22 6e 75 6c 6c 22 29 3d 3d  rgv[4],"null")==
11190 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
111a0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
111b0 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20 7d  pStmt, idx);.  }
111c0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
111d0 61 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 22  argv[4],"static"
111e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
111f0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
11200 78 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 73  xt(pStmt, idx, s
11210 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
11220 64 5f 76 61 6c 75 65 2c 20 2d 31 2c 20 30 29 3b  d_value, -1, 0);
11230 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
11240 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22 73 74 61  cmp(argv[4],"sta
11250 74 69 63 2d 6e 62 79 74 65 73 22 29 3d 3d 30 20  tic-nbytes")==0 
11260 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11270 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
11280 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65  tmt, idx, sqlite
11290 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
112a0 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ue,.            
112b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
112c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
112d0 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62  e_static_bind_nb
112e0 79 74 65 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  yte, 0);.  }else
112f0 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
11300 5b 34 5d 2c 22 6e 6f 72 6d 61 6c 22 29 3d 3d 30  [4],"normal")==0
11310 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
11320 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
11330 53 74 6d 74 2c 20 69 64 78 2c 20 61 72 67 76 5b  Stmt, idx, argv[
11340 33 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  3], -1, SQLITE_T
11350 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 65 6c  RANSIENT);.  }el
11360 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 72  se if( strcmp(ar
11370 67 76 5b 34 5d 2c 22 62 6c 6f 62 31 30 22 29 3d  gv[4],"blob10")=
11380 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
11390 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
113a0 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 22 61 62  (pStmt, idx, "ab
113b0 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22 2c  c\000xyz\000pq",
113c0 20 31 30 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   10, SQLITE_STAT
113d0 49 43 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  IC);.  }else{.  
113e0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
113f0 6c 74 28 69 6e 74 65 72 70 2c 20 22 34 74 68 20  lt(interp, "4th 
11400 61 72 67 75 6d 65 6e 74 20 73 68 6f 75 6c 64 20  argument should 
11410 62 65 20 22 0a 20 20 20 20 20 20 20 20 22 5c 22  be ".        "\"
11420 6e 75 6c 6c 5c 22 20 6f 72 20 5c 22 73 74 61 74  null\" or \"stat
11430 69 63 5c 22 20 6f 72 20 5c 22 6e 6f 72 6d 61 6c  ic\" or \"normal
11440 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
11450 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
11460 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
11470 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
11480 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
11490 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
114a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
114b0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 63 68 61  f( rc ){.    cha
114c0 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20  r zBuf[50];.    
114d0 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
114e0 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
114f0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
11500 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
11510 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
11520 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
11530 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
11540 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
11550 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
11560 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
11570 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64 5f 74  .** Usage: add_t
11580 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c 64 62 20  est_collate <db 
11590 70 74 72 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66  ptr> <utf8> <utf
115a0 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65 3e 0a  16le> <utf16be>.
115b0 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
115c0 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 74  ion is used to t
115d0 65 73 74 20 74 68 61 74 20 53 51 4c 69 74 65 20  est that SQLite 
115e0 73 65 6c 65 63 74 73 20 74 68 65 20 63 6f 72 72  selects the corr
115f0 65 63 74 20 63 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a  ect collation.**
11600 20 73 65 71 75 65 6e 63 65 20 63 61 6c 6c 62 61   sequence callba
11610 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c 65  ck when multiple
11620 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20 64   versions (for d
11630 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65 6e  ifferent text en
11640 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65 20  codings).** are 
11650 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  available..**.**
11660 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72 6f   Calling this ro
11670 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73 20  utine registers 
11680 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
11690 71 75 65 6e 63 65 20 22 74 65 73 74 5f 63 6f 6c  quence "test_col
116a0 6c 61 74 65 22 0a 2a 2a 20 77 69 74 68 20 64 61  late".** with da
116b0 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 64  tabase handle <d
116c0 62 3e 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  b>. The second a
116d0 72 67 75 6d 65 6e 74 20 6d 75 73 74 20 62 65 20  rgument must be 
116e0 61 20 6c 69 73 74 20 6f 66 20 74 68 72 65 65 0a  a list of three.
116f0 2a 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65  ** boolean value
11700 73 2e 20 49 66 20 74 68 65 20 66 69 72 73 74 20  s. If the first 
11710 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20  is true, then a 
11720 76 65 72 73 69 6f 6e 20 6f 66 20 74 65 73 74 5f  version of test_
11730 63 6f 6c 6c 61 74 65 20 69 73 0a 2a 2a 20 72 65  collate is.** re
11740 67 69 73 74 65 72 65 64 20 66 6f 72 20 55 54 46  gistered for UTF
11750 2d 38 2c 20 69 66 20 74 68 65 20 73 65 63 6f 6e  -8, if the secon
11760 64 20 69 73 20 74 72 75 65 2c 20 61 20 76 65 72  d is true, a ver
11770 73 69 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72  sion is register
11780 65 64 20 66 6f 72 0a 2a 2a 20 55 54 46 2d 31 36  ed for.** UTF-16
11790 6c 65 2c 20 69 66 20 74 68 65 20 74 68 69 72 64  le, if the third
117a0 20 69 73 20 74 72 75 65 2c 20 61 20 55 54 46 2d   is true, a UTF-
117b0 31 36 62 65 20 76 65 72 73 69 6f 6e 20 69 73 20  16be version is 
117c0 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 20 50 72  available..** Pr
117d0 65 76 69 6f 75 73 20 76 65 72 73 69 6f 6e 73 20  evious versions 
117e0 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20  of test_collate 
117f0 61 72 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a  are deleted..**.
11800 2a 2a 20 54 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  ** The collation
11810 20 73 65 71 75 65 6e 63 65 20 74 65 73 74 5f 63   sequence test_c
11820 6f 6c 6c 61 74 65 20 69 73 20 69 6d 70 6c 65 6d  ollate is implem
11830 65 6e 74 65 64 20 62 79 20 63 61 6c 6c 69 6e 67  ented by calling
11840 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   the.** followin
11850 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a 2a 2a  g TCL script:.**
11860 0a 2a 2a 20 20 20 22 74 65 73 74 5f 63 6f 6c 6c  .**   "test_coll
11870 61 74 65 20 3c 65 6e 63 3e 20 3c 6c 68 73 3e 20  ate <enc> <lhs> 
11880 3c 72 68 73 3e 22 0a 2a 2a 0a 2a 2a 20 54 68 65  <rhs>".**.** The
11890 20 3c 6c 68 73 3e 20 61 6e 64 20 3c 72 68 73 3e   <lhs> and <rhs>
118a0 20 61 72 65 20 74 68 65 20 74 77 6f 20 76 61 6c   are the two val
118b0 75 65 73 20 62 65 69 6e 67 20 63 6f 6d 70 61 72  ues being compar
118c0 65 64 2c 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ed, encoded in U
118d0 54 46 2d 38 2e 0a 2a 2a 20 54 68 65 20 3c 65 6e  TF-8..** The <en
118e0 63 3e 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  c> parameter is 
118f0 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20  the encoding of 
11900 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 66 75  the collation fu
11910 6e 63 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 53  nction that.** S
11920 51 4c 69 74 65 20 73 65 6c 65 63 74 65 64 20 74  QLite selected t
11930 6f 20 63 61 6c 6c 2e 20 54 68 65 20 54 43 4c 20  o call. The TCL 
11940 74 65 73 74 20 73 63 72 69 70 74 20 69 6d 70 6c  test script impl
11950 65 6d 65 6e 74 73 20 74 68 65 0a 2a 2a 20 22 74  ements the.** "t
11960 65 73 74 5f 63 6f 6c 6c 61 74 65 22 20 70 72 6f  est_collate" pro
11970 63 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68  c..**.** Note th
11980 61 74 20 74 68 69 73 20 77 69 6c 6c 20 6f 6e 6c  at this will onl
11990 79 20 77 6f 72 6b 20 77 69 74 68 20 6f 6e 65 20  y work with one 
119a0 69 6e 74 65 72 70 72 65 74 65 72 20 61 74 20 61  interpreter at a
119b0 20 74 69 6d 65 2c 20 61 73 20 74 68 65 0a 2a 2a   time, as the.**
119c0 20 69 6e 74 65 72 70 20 70 6f 69 6e 74 65 72 20   interp pointer 
119d0 74 6f 20 75 73 65 20 77 68 65 6e 20 65 76 61 6c  to use when eval
119e0 75 61 74 69 6e 67 20 74 68 65 20 54 43 4c 20 73  uating the TCL s
119f0 63 72 69 70 74 20 69 73 20 73 74 6f 72 65 64 20  cript is stored 
11a00 69 6e 0a 2a 2a 20 70 54 65 73 74 43 6f 6c 6c 61  in.** pTestColla
11a10 74 65 49 6e 74 65 72 70 2e 0a 2a 2f 0a 73 74 61  teInterp..*/.sta
11a20 74 69 63 20 54 63 6c 5f 49 6e 74 65 72 70 2a 20  tic Tcl_Interp* 
11a30 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
11a40 72 70 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 74  rp;.static int t
11a50 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
11a60 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c 20  (.  void *pCtx, 
11a70 0a 20 20 69 6e 74 20 6e 41 2c 20 63 6f 6e 73 74  .  int nA, const
11a80 20 76 6f 69 64 20 2a 7a 41 2c 0a 20 20 69 6e 74   void *zA,.  int
11a90 20 6e 42 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nB, const void 
11aa0 2a 7a 42 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  *zB.){.  Tcl_Int
11ab0 65 72 70 20 2a 69 20 3d 20 70 54 65 73 74 43 6f  erp *i = pTestCo
11ac0 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 20 20 69  llateInterp;.  i
11ad0 6e 74 20 65 6e 63 69 6e 20 3d 20 53 51 4c 49 54  nt encin = SQLIT
11ae0 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43 74  E_PTR_TO_INT(pCt
11af0 78 29 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20  x);.  int res;. 
11b00 20 69 6e 74 20 6e 3b 0a 0a 20 20 73 71 6c 69 74   int n;..  sqlit
11b10 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
11b20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 0a    Tcl_Obj *pX;..
11b30 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74    pX = Tcl_NewSt
11b40 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 63 6f  ringObj("test_co
11b50 6c 6c 61 74 65 22 2c 20 2d 31 29 3b 0a 20 20 54  llate", -1);.  T
11b60 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
11b70 70 58 29 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  pX);..  switch( 
11b80 65 6e 63 69 6e 20 29 7b 0a 20 20 20 20 63 61 73  encin ){.    cas
11b90 65 20 53 51 4c 49 54 45 5f 55 54 46 38 3a 0a 20  e SQLITE_UTF8:. 
11ba0 20 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a       Tcl_ListObj
11bb0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c  AppendElement(i,
11bc0 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  pX,Tcl_NewString
11bd0 4f 62 6a 28 22 55 54 46 2d 38 22 2c 2d 31 29 29  Obj("UTF-8",-1))
11be0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
11bf0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 55     case SQLITE_U
11c00 54 46 31 36 4c 45 3a 0a 20 20 20 20 20 20 54 63  TF16LE:.      Tc
11c10 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
11c20 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c 5f  lement(i,pX,Tcl_
11c30 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
11c40 46 2d 31 36 4c 45 22 2c 2d 31 29 29 3b 0a 20 20  F-16LE",-1));.  
11c50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
11c60 61 73 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ase SQLITE_UTF16
11c70 42 45 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69  BE:.      Tcl_Li
11c80 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
11c90 6e 74 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53  nt(i,pX,Tcl_NewS
11ca0 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
11cb0 42 45 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20  BE",-1));.      
11cc0 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
11cd0 6c 74 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74  lt:.      assert
11ce0 28 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  (0);.  }..  sqli
11cf0 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
11d00 6c 6c 6f 63 28 29 3b 0a 20 20 70 56 61 6c 20 3d  lloc();.  pVal =
11d10 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77   sqlite3ValueNew
11d20 28 30 29 3b 0a 20 20 69 66 28 20 70 56 61 6c 20  (0);.  if( pVal 
11d30 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  ){.    sqlite3Va
11d40 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
11d50 6e 41 2c 20 7a 41 2c 20 65 6e 63 69 6e 2c 20 53  nA, zA, encin, S
11d60 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
11d70 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76     n = sqlite3_v
11d80 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29  alue_bytes(pVal)
11d90 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
11da0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11db0 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  ,pX,.        Tcl
11dc0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
11dd0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
11de0 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
11df0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
11e00 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20  lueSetStr(pVal, 
11e10 6e 42 2c 20 7a 42 2c 20 65 6e 63 69 6e 2c 20 53  nB, zB, encin, S
11e20 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
11e30 20 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76     n = sqlite3_v
11e40 61 6c 75 65 5f 62 79 74 65 73 28 70 56 61 6c 29  alue_bytes(pVal)
11e50 3b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ;.    Tcl_ListOb
11e60 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
11e70 2c 70 58 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  ,pX,.        Tcl
11e80 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
11e90 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
11ea0 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 6e 29  ue_text(pVal),n)
11eb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61  );.    sqlite3Va
11ec0 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 20  lueFree(pVal);. 
11ed0 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42   }.  sqlite3EndB
11ee0 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
11ef0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
11f00 69 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c  i, pX, 0);.  Tcl
11f10 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58  _DecrRefCount(pX
11f20 29 3b 0a 20 20 54 63 6c 5f 47 65 74 49 6e 74 46  );.  Tcl_GetIntF
11f30 72 6f 6d 4f 62 6a 28 69 2c 20 54 63 6c 5f 47 65  romObj(i, Tcl_Ge
11f40 74 4f 62 6a 52 65 73 75 6c 74 28 69 29 2c 20 26  tObjResult(i), &
11f50 72 65 73 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  res);.  return r
11f60 65 73 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74  es;.}.static int
11f70 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 28 0a 20   test_collate(. 
11f80 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
11f90 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
11fa0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
11fb0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
11fc0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
11fd0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
11fe0 20 20 69 6e 74 20 76 61 6c 3b 0a 20 20 73 71 6c    int val;.  sql
11ff0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
12000 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
12010 66 28 20 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74  f( objc!=5 ) got
12020 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 70 54  o bad_args;.  pT
12030 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65 72 70  estCollateInterp
12040 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 69 66 28   = interp;.  if(
12050 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
12060 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
12070 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
12080 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
12090 45 52 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43  ERROR;..  if( TC
120a0 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f  L_OK!=Tcl_GetBoo
120b0 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  leanFromObj(inte
120c0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61  rp, objv[2], &va
120d0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
120e0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
120f0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
12100 6c 61 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74  lation(db, "test
12110 5f 63 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54  _collate", SQLIT
12120 45 5f 55 54 46 38 2c 20 0a 20 20 20 20 20 20 20  E_UTF8, .       
12130 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54     (void *)SQLIT
12140 45 5f 55 54 46 38 2c 20 76 61 6c 3f 74 65 73 74  E_UTF8, val?test
12150 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29  _collate_func:0)
12160 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
12170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e  TE_OK ){.    con
12180 73 74 20 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b  st void *zUtf16;
12190 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  .    if( TCL_OK!
121a0 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
121b0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
121c0 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[3], &val) ) 
121d0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
121e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
121f0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
12200 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 63 6f  ion(db, "test_co
12210 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 55  llate", SQLITE_U
12220 54 46 31 36 4c 45 2c 20 0a 20 20 20 20 20 20 20  TF16LE, .       
12230 20 20 20 20 20 28 76 6f 69 64 20 2a 29 53 51 4c       (void *)SQL
12240 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 76 61 6c  ITE_UTF16LE, val
12250 3f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75  ?test_collate_fu
12260 6e 63 3a 30 29 3b 0a 20 20 20 20 69 66 28 20 54  nc:0);.    if( T
12270 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f  CL_OK!=Tcl_GetBo
12280 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
12290 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76  erp, objv[4], &v
122a0 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
122b0 5f 45 52 52 4f 52 3b 0a 0a 23 69 66 20 30 0a 20  _ERROR;..#if 0. 
122c0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 69     if( sqlite3_i
122d0 4d 61 6c 6c 6f 63 46 61 69 6c 3e 30 20 29 7b 0a  MallocFail>0 ){.
122e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 4d        sqlite3_iM
122f0 61 6c 6c 6f 63 46 61 69 6c 2b 2b 3b 0a 20 20 20  allocFail++;.   
12300 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71   }.#endif.    sq
12310 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
12320 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
12330 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
12340 56 61 6c 75 65 4e 65 77 28 64 62 29 3b 0a 20 20  ValueNew(db);.  
12350 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65    sqlite3ValueSe
12360 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22  tStr(pVal, -1, "
12370 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 53  test_collate", S
12380 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
12390 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
123a0 7a 55 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33  zUtf16 = sqlite3
123b0 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
123c0 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
123d0 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d  VE);.    if( db-
123e0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
123f0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
12400 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65  TE_NOMEM;.    }e
12410 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
12420 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
12430 6f 6c 6c 61 74 69 6f 6e 31 36 28 64 62 2c 20 7a  ollation16(db, z
12440 55 74 66 31 36 2c 20 53 51 4c 49 54 45 5f 55 54  Utf16, SQLITE_UT
12450 46 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20  F16BE, .        
12460 20 20 28 76 6f 69 64 20 2a 29 53 51 4c 49 54 45    (void *)SQLITE
12470 5f 55 54 46 31 36 42 45 2c 20 76 61 6c 3f 74 65  _UTF16BE, val?te
12480 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a  st_collate_func:
12490 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  0);.    }.    sq
124a0 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
124b0 56 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Val);.    sqlite
124c0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
124d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ->mutex);.  }.  
124e0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
124f0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64  rrCode(interp, d
12500 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  b, rc) ) return 
12510 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 0a 20 20  TCL_ERROR;.  .  
12520 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
12530 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  K ){.    Tcl_App
12540 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
12550 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65  , sqlite3ErrName
12560 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20 72 65  (rc), 0);.    re
12570 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
12580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
12590 5f 4f 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a  _OK;..bad_args:.
125a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
125b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
125c0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
125d0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54   be \"",.      T
125e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
125f0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
12600 20 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c   " <DB> <utf8> <
12610 75 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62  utf16le> <utf16b
12620 65 3e 22 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  e>", 0);.  retur
12630 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
12640 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
12650 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f 63  _test_utf16bin_c
12660 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 0a  ollate <db ptr>.
12670 2a 2a 0a 2a 2a 20 41 64 64 20 61 20 75 74 66 2d  **.** Add a utf-
12680 31 36 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  16 collation seq
12690 75 65 6e 63 65 20 6e 61 6d 65 64 20 22 75 74 66  uence named "utf
126a0 31 36 62 69 6e 22 20 74 6f 20 74 68 65 20 64 61  16bin" to the da
126b0 74 61 62 61 73 65 0a 2a 2a 20 68 61 6e 64 6c 65  tabase.** handle
126c0 2e 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e  . This collation
126d0 20 73 65 71 75 65 6e 63 65 20 63 6f 6d 70 61 72   sequence compar
126e0 65 73 20 61 72 67 75 6d 65 6e 74 73 20 69 6e 20  es arguments in 
126f0 74 68 65 20 73 61 6d 65 20 77 61 79 20 61 73 20  the same way as 
12700 74 68 65 0a 2a 2a 20 62 75 69 6c 74 2d 69 6e 20  the.** built-in 
12710 63 6f 6c 6c 61 74 69 6f 6e 20 22 62 69 6e 61 72  collation "binar
12720 79 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  y"..*/.static in
12730 74 20 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f  t test_utf16bin_
12740 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20  collate_func(.  
12750 76 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69  void *pCtx, .  i
12760 6e 74 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69  nt nA, const voi
12770 64 20 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c  d *zA,.  int nB,
12780 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a   const void *zB.
12790 29 7b 0a 20 20 69 6e 74 20 6e 43 6d 70 20 3d 20  ){.  int nCmp = 
127a0 28 6e 41 3e 6e 42 20 3f 20 6e 42 20 3a 20 6e 41  (nA>nB ? nB : nA
127b0 29 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 6d  );.  int res = m
127c0 65 6d 63 6d 70 28 7a 41 2c 20 7a 42 2c 20 6e 43  emcmp(zA, zB, nC
127d0 6d 70 29 3b 0a 20 20 69 66 28 20 72 65 73 3d 3d  mp);.  if( res==
127e0 30 20 29 20 72 65 73 20 3d 20 6e 41 20 2d 20 6e  0 ) res = nA - n
127f0 42 3b 0a 20 20 72 65 74 75 72 6e 20 72 65 73 3b  B;.  return res;
12800 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  .}.static int te
12810 73 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c  st_utf16bin_coll
12820 61 74 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ate(.  void * cl
12830 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
12840 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
12850 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
12860 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
12870 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
12880 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
12890 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
128a0 20 67 6f 74 6f 20 62 61 64 5f 61 72 67 73 3b 0a   goto bad_args;.
128b0 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
128c0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
128d0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
128e0 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ), &db) ) return
128f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
12900 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
12910 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  te_collation(db,
12920 20 22 75 74 66 31 36 62 69 6e 22 2c 20 53 51 4c   "utf16bin", SQL
12930 49 54 45 5f 55 54 46 31 36 2c 20 30 2c 20 0a 20  ITE_UTF16, 0, . 
12940 20 20 20 20 20 74 65 73 74 5f 75 74 66 31 36 62       test_utf16b
12950 69 6e 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 0a  in_collate_func.
12960 20 20 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74    );.  if( sqlit
12970 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
12980 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
12990 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
129a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
129b0 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
129c0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
129d0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
129e0 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72  , "DB");.  retur
129f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
12a00 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 63  /*.** When the c
12a10 6f 6c 6c 61 74 69 6f 6e 20 6e 65 65 64 65 64 20  ollation needed 
12a20 63 61 6c 6c 62 61 63 6b 20 69 73 20 69 6e 76 6f  callback is invo
12a30 6b 65 64 2c 20 72 65 63 6f 72 64 20 74 68 65 20  ked, record the 
12a40 6e 61 6d 65 20 6f 66 20 0a 2a 2a 20 74 68 65 20  name of .** the 
12a50 72 65 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74  requested collat
12a60 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 68 65 72  ing function her
12a70 65 2e 20 20 54 68 65 20 72 65 63 6f 72 64 65 64  e.  The recorded
12a80 20 6e 61 6d 65 20 69 73 20 6c 69 6e 6b 65 64 0a   name is linked.
12a90 2a 2a 20 74 6f 20 61 20 54 43 4c 20 76 61 72 69  ** to a TCL vari
12aa0 61 62 6c 65 20 61 6e 64 20 75 73 65 64 20 74 6f  able and used to
12ab0 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
12ac0 74 68 65 20 72 65 71 75 65 73 74 65 64 20 63 6f  the requested co
12ad0 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 20  llation.** name 
12ae0 69 73 20 63 6f 72 72 65 63 74 2e 0a 2a 2f 0a 73  is correct..*/.s
12af0 74 61 74 69 63 20 63 68 61 72 20 7a 4e 65 65 64  tatic char zNeed
12b00 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 32 30 30 5d  edCollation[200]
12b10 3b 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 70  ;.static char *p
12b20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
12b30 20 3d 20 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74   = zNeededCollat
12b40 69 6f 6e 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  ion;.../*.** Cal
12b50 6c 65 64 20 77 68 65 6e 20 61 20 63 6f 6c 6c 61  led when a colla
12b60 74 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73  ting sequence is
12b70 20 6e 65 65 64 65 64 2e 20 20 52 65 67 69 73 74   needed.  Regist
12b80 65 72 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71  ered using.** sq
12b90 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
12ba0 6e 65 65 64 65 64 31 36 28 29 2e 0a 2a 2f 0a 73  needed16()..*/.s
12bb0 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f  tatic void test_
12bc0 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
12bd0 62 28 0a 20 20 76 6f 69 64 20 2a 70 43 74 78 2c  b(.  void *pCtx,
12be0 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c   .  sqlite3 *db,
12bf0 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
12c00 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  .  const void *p
12c10 4e 61 6d 65 0a 29 7b 0a 20 20 69 6e 74 20 65 6e  Name.){.  int en
12c20 63 20 3d 20 45 4e 43 28 64 62 29 3b 0a 20 20 69  c = ENC(db);.  i
12c30 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  nt i;.  char *z;
12c40 0a 20 20 66 6f 72 28 7a 20 3d 20 28 63 68 61 72  .  for(z = (char
12c50 2a 29 70 4e 61 6d 65 2c 20 69 3d 30 3b 20 2a 7a  *)pName, i=0; *z
12c60 20 7c 7c 20 7a 5b 31 5d 3b 20 7a 2b 2b 29 7b 0a   || z[1]; z++){.
12c70 20 20 20 20 69 66 28 20 2a 7a 20 29 20 7a 4e 65      if( *z ) zNe
12c80 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 69 2b  ededCollation[i+
12c90 2b 5d 20 3d 20 2a 7a 3b 0a 20 20 7d 0a 20 20 7a  +] = *z;.  }.  z
12ca0 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b  NeededCollation[
12cb0 69 5d 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  i] = 0;.  sqlite
12cc0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
12cd0 6f 6e 28 0a 20 20 20 20 20 20 64 62 2c 20 22 74  on(.      db, "t
12ce0 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c 20 45 4e  est_collate", EN
12cf0 43 28 64 62 29 2c 20 53 51 4c 49 54 45 5f 49 4e  C(db), SQLITE_IN
12d00 54 5f 54 4f 5f 50 54 52 28 65 6e 63 29 2c 20 74  T_TO_PTR(enc), t
12d10 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 66 75 6e 63  est_collate_func
12d20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
12d30 65 3a 20 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c  e: add_test_coll
12d40 61 74 65 5f 6e 65 65 64 65 64 20 44 42 0a 2a 2f  ate_needed DB.*/
12d50 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
12d60 5f 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 28  _collate_needed(
12d70 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
12d80 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
12d90 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
12da0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
12db0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
12dc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
12dd0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
12de0 66 28 20 6f 62 6a 63 21 3d 32 20 29 20 67 6f 74  f( objc!=2 ) got
12df0 6f 20 62 61 64 5f 61 72 67 73 3b 0a 20 20 69 66  o bad_args;.  if
12e00 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
12e10 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
12e20 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
12e30 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
12e40 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
12e50 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
12e60 5f 6e 65 65 64 65 64 31 36 28 64 62 2c 20 30 2c  _needed16(db, 0,
12e70 20 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65   test_collate_ne
12e80 65 64 65 64 5f 63 62 29 3b 0a 20 20 7a 4e 65 65  eded_cb);.  zNee
12e90 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 5b 30 5d 20  dedCollation[0] 
12ea0 3d 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  = 0;.  if( sqlit
12eb0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
12ec0 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
12ed0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12ee0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
12ef0 4b 3b 0a 0a 62 61 64 5f 61 72 67 73 3a 0a 20 20  K;..bad_args:.  
12f00 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
12f10 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
12f20 2c 20 22 44 42 22 29 3b 0a 20 20 72 65 74 75 72  , "DB");.  retur
12f30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a  n TCL_ERROR;.}..
12f40 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
12f50 61 64 64 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65  add_alignment_te
12f60 73 74 5f 63 6f 6c 6c 61 74 69 6f 6e 73 20 20 44  st_collations  D
12f70 42 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 77 6f 20  B.**.** Add two 
12f80 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  new collating se
12f90 71 75 65 6e 63 65 73 20 74 6f 20 74 68 65 20 64  quences to the d
12fa0 61 74 61 62 61 73 65 20 44 42 0a 2a 2a 0a 2a 2a  atabase DB.**.**
12fb0 20 20 20 20 20 75 74 66 31 36 5f 61 6c 69 67 6e       utf16_align
12fc0 65 64 0a 2a 2a 20 20 20 20 20 75 74 66 31 36 5f  ed.**     utf16_
12fd0 75 6e 61 6c 69 67 6e 65 64 0a 2a 2a 0a 2a 2a 20  unaligned.**.** 
12fe0 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 73  Both collating s
12ff0 65 71 75 65 6e 63 65 73 20 75 73 65 20 74 68 65  equences use the
13000 20 73 61 6d 65 20 73 6f 72 74 20 6f 72 64 65 72   same sort order
13010 20 61 73 20 42 49 4e 41 52 59 2e 0a 2a 2a 20 54   as BINARY..** T
13020 68 65 20 6f 6e 6c 79 20 64 69 66 66 65 72 65 6e  he only differen
13030 63 65 20 69 73 20 74 68 61 74 20 74 68 65 20 75  ce is that the u
13040 74 66 31 36 5f 61 6c 69 67 6e 65 64 20 63 6f 6c  tf16_aligned col
13050 6c 61 74 69 6e 67 0a 2a 2a 20 73 65 71 75 65 6e  lating.** sequen
13060 63 65 20 69 73 20 64 65 63 6c 61 72 65 64 20 77  ce is declared w
13070 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 55  ith the SQLITE_U
13080 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 66 6c 61  TF16_ALIGNED fla
13090 67 2e 0a 2a 2a 20 42 6f 74 68 20 63 6f 6c 6c 61  g..** Both colla
130a0 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 73 20 69  ting functions i
130b0 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 75 6e 61  ncrement the una
130c0 6c 69 67 6e 65 64 20 75 74 66 31 36 20 63 6f 75  ligned utf16 cou
130d0 6e 74 65 72 0a 2a 2a 20 77 68 65 6e 65 76 65 72  nter.** whenever
130e0 20 74 68 65 79 20 73 65 65 20 61 20 73 74 72 69   they see a stri
130f0 6e 67 20 74 68 61 74 20 62 65 67 69 6e 73 20 6f  ng that begins o
13100 6e 20 61 6e 20 6f 64 64 20 62 79 74 65 20 62 6f  n an odd byte bo
13110 75 6e 64 61 72 79 2e 0a 2a 2f 0a 73 74 61 74 69  undary..*/.stati
13120 63 20 69 6e 74 20 75 6e 61 6c 69 67 6e 65 64 5f  c int unaligned_
13130 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 20 3d  string_counter =
13140 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 61   0;.static int a
13150 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63  lignmentCollFunc
13160 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
13170 64 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20  d,.  int nKey1, 
13180 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
13190 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20  1,.  int nKey2, 
131a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79  const void *pKey
131b0 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e  2.){.  int rc, n
131c0 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b  ;.  n = nKey1<nK
131d0 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b  ey2 ? nKey1 : nK
131e0 65 79 32 3b 0a 20 20 69 66 28 20 6e 4b 65 79 31  ey2;.  if( nKey1
131f0 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51 4c  >0 && 1==(1&(SQL
13200 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
13210 4b 65 79 31 29 29 29 20 29 20 75 6e 61 6c 69 67  Key1))) ) unalig
13220 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
13230 65 72 2b 2b 3b 0a 20 20 69 66 28 20 6e 4b 65 79  er++;.  if( nKey
13240 32 3e 30 20 26 26 20 31 3d 3d 28 31 26 28 53 51  2>0 && 1==(1&(SQ
13250 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28  LITE_PTR_TO_INT(
13260 70 4b 65 79 32 29 29 29 20 29 20 75 6e 61 6c 69  pKey2))) ) unali
13270 67 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e  gned_string_coun
13280 74 65 72 2b 2b 3b 0a 20 20 72 63 20 3d 20 6d 65  ter++;.  rc = me
13290 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79  mcmp(pKey1, pKey
132a0 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d  2, n);.  if( rc=
132b0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6e  =0 ){.    rc = n
132c0 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20  Key1 - nKey2;.  
132d0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
132e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64 64 5f  .static int add_
132f0 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63  alignment_test_c
13300 6f 6c 6c 61 74 69 6f 6e 73 28 0a 20 20 76 6f 69  ollations(.  voi
13310 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
13320 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
13330 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
13340 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
13350 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
13360 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66  qlite3 *db;.  if
13370 28 20 6f 62 6a 63 3e 3d 32 20 29 7b 0a 20 20 20  ( objc>=2 ){.   
13380 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
13390 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
133a0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
133b0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
133c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  TCL_ERROR;.    s
133d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
133e0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75 74 66  llation(db, "utf
133f0 31 36 5f 75 6e 61 6c 69 67 6e 65 64 22 2c 20 53  16_unaligned", S
13400 51 4c 49 54 45 5f 55 54 46 31 36 2c 20 0a 20 20  QLITE_UTF16, .  
13410 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e 6d 65        0, alignme
13420 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20 20 20  ntCollFunc);.   
13430 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
13440 63 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 75  collation(db, "u
13450 74 66 31 36 5f 61 6c 69 67 6e 65 64 22 2c 20 53  tf16_aligned", S
13460 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
13470 4e 45 44 2c 20 0a 20 20 20 20 20 20 20 20 30 2c  NED, .        0,
13480 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c 46 75   alignmentCollFu
13490 6e 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  nc);.  }.  retur
134a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
134b0 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
134c0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  d(SQLITE_OMIT_UT
134d0 46 31 36 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 55  F16) */../*.** U
134e0 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 66  sage: add_test_f
134f0 75 6e 63 74 69 6f 6e 20 3c 64 62 20 70 74 72 3e  unction <db ptr>
13500 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65   <utf8> <utf16le
13510 3e 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a  > <utf16be>.**.*
13520 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
13530 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
13540 74 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65  that SQLite sele
13550 63 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20  cts the correct 
13560 75 73 65 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  user.** function
13570 20 63 61 6c 6c 62 61 63 6b 20 77 68 65 6e 20 6d   callback when m
13580 75 6c 74 69 70 6c 65 20 76 65 72 73 69 6f 6e 73  ultiple versions
13590 20 28 66 6f 72 20 64 69 66 66 65 72 65 6e 74 20   (for different 
135a0 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 73 29 0a  text encodings).
135b0 2a 2a 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65  ** are available
135c0 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 69 6e 67 20  ..**.** Calling 
135d0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 67  this routine reg
135e0 69 73 74 65 72 73 20 75 70 20 74 6f 20 74 68 72  isters up to thr
135f0 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
13600 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e  he user function
13610 0a 2a 2a 20 22 74 65 73 74 5f 66 75 6e 63 74 69  .** "test_functi
13620 6f 6e 22 20 77 69 74 68 20 64 61 74 61 62 61 73  on" with databas
13630 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 20  e handle <db>.  
13640 49 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  If the second ar
13650 67 75 6d 65 6e 74 20 69 73 0a 2a 2a 20 74 72 75  gument is.** tru
13660 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69 6f  e, then a versio
13670 6e 20 6f 66 20 74 65 73 74 5f 66 75 6e 63 74 69  n of test_functi
13680 6f 6e 20 69 73 20 72 65 67 69 73 74 65 72 65 64  on is registered
13690 20 66 6f 72 20 55 54 46 2d 38 2c 20 69 66 20 74   for UTF-8, if t
136a0 68 65 0a 2a 2a 20 74 68 69 72 64 20 69 73 20 74  he.** third is t
136b0 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20 69  rue, a version i
136c0 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f 72  s registered for
136d0 20 55 54 46 2d 31 36 6c 65 2c 20 69 66 20 74 68   UTF-16le, if th
136e0 65 20 66 6f 75 72 74 68 20 69 73 0a 2a 2a 20 74  e fourth is.** t
136f0 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
13700 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
13710 61 62 6c 65 2e 20 20 50 72 65 76 69 6f 75 73 20  able.  Previous 
13720 76 65 72 73 69 6f 6e 73 20 6f 66 0a 2a 2a 20 74  versions of.** t
13730 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 61 72 65  est_function are
13740 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
13750 54 68 65 20 75 73 65 72 20 66 75 6e 63 74 69 6f  The user functio
13760 6e 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  n is implemented
13770 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 20   by calling the 
13780 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c 20 73 63  following TCL sc
13790 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 22 74  ript:.**.**   "t
137a0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 3c 65 6e  est_function <en
137b0 63 3e 20 3c 61 72 67 3e 22 0a 2a 2a 0a 2a 2a 20  c> <arg>".**.** 
137c0 57 68 65 72 65 20 3c 65 6e 63 3e 20 69 73 20 6f  Where <enc> is o
137d0 6e 65 20 6f 66 20 55 54 46 2d 38 2c 20 55 54 46  ne of UTF-8, UTF
137e0 2d 31 36 4c 45 20 6f 72 20 55 54 46 31 36 42 45  -16LE or UTF16BE
137f0 2c 20 61 6e 64 20 3c 61 72 67 3e 20 69 73 20 74  , and <arg> is t
13800 68 65 0a 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67  he.** single arg
13810 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f 20  ument passed to 
13820 74 68 65 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e  the SQL function
13830 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
13840 72 6e 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 54  rned by.** the T
13850 43 4c 20 73 63 72 69 70 74 20 69 73 20 75 73 65  CL script is use
13860 64 20 61 73 20 74 68 65 20 72 65 74 75 72 6e 20  d as the return 
13870 76 61 6c 75 65 20 6f 66 20 74 68 65 20 53 51 4c  value of the SQL
13880 20 66 75 6e 63 74 69 6f 6e 2e 20 49 74 0a 2a 2a   function. It.**
13890 20 69 73 20 70 61 73 73 65 64 20 74 6f 20 53 51   is passed to SQ
138a0 4c 69 74 65 20 75 73 69 6e 67 20 55 54 46 2d 31  Lite using UTF-1
138b0 36 42 45 20 66 6f 72 20 61 20 55 54 46 2d 38 20  6BE for a UTF-8 
138c0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  test_function(),
138d0 20 55 54 46 2d 38 0a 2a 2a 20 66 6f 72 20 61 20   UTF-8.** for a 
138e0 55 54 46 2d 31 36 4c 45 20 74 65 73 74 5f 66 75  UTF-16LE test_fu
138f0 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 64 20 55 54  nction(), and UT
13900 46 2d 31 36 4c 45 20 66 6f 72 20 61 6e 20 69 6d  F-16LE for an im
13910 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
13920 74 0a 2a 2a 20 70 72 65 66 65 72 73 20 55 54 46  t.** prefers UTF
13930 2d 31 36 42 45 2e 0a 2a 2f 0a 23 69 66 6e 64 65  -16BE..*/.#ifnde
13940 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
13950 46 31 36 0a 73 74 61 74 69 63 20 76 6f 69 64 20  F16.static void 
13960 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
13970 66 38 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f  f8(.  sqlite3_co
13980 6e 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20  ntext *pCtx, .  
13990 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69  int nArg,.  sqli
139a0 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76  te3_value **argv
139b0 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  .){.  Tcl_Interp
139c0 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f   *interp;.  Tcl_
139d0 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74  Obj *pX;.  sqlit
139e0 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
139f0 20 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f    interp = (Tcl_
13a00 49 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33  Interp *)sqlite3
13a10 5f 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29  _user_data(pCtx)
13a20 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77  ;.  pX = Tcl_New
13a30 53 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f  StringObj("test_
13a40 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a  function", -1);.
13a50 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
13a60 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69  nt(pX);.  Tcl_Li
13a70 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
13a80 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54  nt(interp, pX, T
13a90 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
13aa0 22 55 54 46 2d 38 22 2c 20 2d 31 29 29 3b 0a 20  "UTF-8", -1));. 
13ab0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13ac0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
13ad0 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
13ae0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
13af0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
13b00 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
13b10 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
13b20 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
13b30 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
13b40 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
13b50 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
13b60 5f 74 65 78 74 28 70 43 74 78 2c 20 54 63 6c 5f  _text(pCtx, Tcl_
13b70 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
13b80 69 6e 74 65 72 70 29 2c 20 2d 31 2c 20 53 51 4c  interp), -1, SQL
13b90 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
13ba0 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
13bb0 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
13bc0 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
13bd0 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
13be0 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
13bf0 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
13c00 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
13c10 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
13c20 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
13c30 78 74 31 36 62 65 28 70 43 74 78 2c 20 73 71 6c  xt16be(pCtx, sql
13c40 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
13c50 36 62 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6be(pVal),.     
13c60 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
13c70 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
13c80 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
13c90 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
13ca0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74  test_function_ut
13cb0 66 31 36 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  f16le(.  sqlite3
13cc0 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 20  _context *pCtx, 
13cd0 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 73  .  int nArg,.  s
13ce0 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
13cf0 72 67 76 0a 29 7b 0a 20 20 54 63 6c 5f 49 6e 74  rgv.){.  Tcl_Int
13d00 65 72 70 20 2a 69 6e 74 65 72 70 3b 0a 20 20 54  erp *interp;.  T
13d10 63 6c 5f 4f 62 6a 20 2a 70 58 3b 0a 20 20 73 71  cl_Obj *pX;.  sq
13d20 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
13d30 6c 3b 0a 20 20 69 6e 74 65 72 70 20 3d 20 28 54  l;.  interp = (T
13d40 63 6c 5f 49 6e 74 65 72 70 20 2a 29 73 71 6c 69  cl_Interp *)sqli
13d50 74 65 33 5f 75 73 65 72 5f 64 61 74 61 28 70 43  te3_user_data(pC
13d60 74 78 29 3b 0a 20 20 70 58 20 3d 20 54 63 6c 5f  tx);.  pX = Tcl_
13d70 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 74 65  NewStringObj("te
13d80 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 2d 31  st_function", -1
13d90 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  );.  Tcl_IncrRef
13da0 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54 63 6c  Count(pX);.  Tcl
13db0 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13dc0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
13dd0 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
13de0 62 6a 28 22 55 54 46 2d 31 36 4c 45 22 2c 20 2d  bj("UTF-16LE", -
13df0 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
13e00 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
13e10 69 6e 74 65 72 70 2c 20 70 58 2c 20 0a 20 20 20  interp, pX, .   
13e20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
13e30 4f 62 6a 28 28 63 68 61 72 2a 29 73 71 6c 69 74  Obj((char*)sqlit
13e40 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
13e50 67 76 5b 30 5d 29 2c 20 2d 31 29 29 3b 0a 20 20  gv[0]), -1));.  
13e60 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 69 6e  Tcl_EvalObjEx(in
13e70 74 65 72 70 2c 20 70 58 2c 20 30 29 3b 0a 20 20  terp, pX, 0);.  
13e80 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
13e90 28 70 58 29 3b 0a 20 20 70 56 61 6c 20 3d 20 73  (pX);.  pVal = s
13ea0 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30  qlite3ValueNew(0
13eb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  );.  sqlite3Valu
13ec0 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31  eSetStr(pVal, -1
13ed0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 52  , Tcl_GetStringR
13ee0 65 73 75 6c 74 28 69 6e 74 65 72 70 29 2c 20 0a  esult(interp), .
13ef0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
13f00 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
13f10 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
13f20 75 6c 74 5f 74 65 78 74 28 70 43 74 78 2c 28 63  ult_text(pCtx,(c
13f30 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
13f40 75 65 5f 74 65 78 74 28 70 56 61 6c 29 2c 2d 31  ue_text(pVal),-1
13f50 2c 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  ,SQLITE_TRANSIEN
13f60 54 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  T);.  sqlite3Val
13f70 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a  ueFree(pVal);.}.
13f80 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
13f90 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 62  _function_utf16b
13fa0 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  e(.  sqlite3_con
13fb0 74 65 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69  text *pCtx, .  i
13fc0 6e 74 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74  nt nArg,.  sqlit
13fd0 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
13fe0 29 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  ){.  Tcl_Interp 
13ff0 2a 69 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f  *interp;.  Tcl_O
14000 62 6a 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65  bj *pX;.  sqlite
14010 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
14020 20 69 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49   interp = (Tcl_I
14030 6e 74 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f  nterp *)sqlite3_
14040 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
14050 0a 20 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53  .  pX = Tcl_NewS
14060 74 72 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66  tringObj("test_f
14070 75 6e 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20  unction", -1);. 
14080 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
14090 74 28 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  t(pX);.  Tcl_Lis
140a0 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
140b0 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63  t(interp, pX, Tc
140c0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
140d0 55 54 46 2d 31 36 42 45 22 2c 20 2d 31 29 29 3b  UTF-16BE", -1));
140e0 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
140f0 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
14100 72 70 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54  rp, pX, .      T
14110 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28  cl_NewStringObj(
14120 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
14130 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30  alue_text(argv[0
14140 5d 29 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  ]), -1));.  Tcl_
14150 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70  EvalObjEx(interp
14160 2c 20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  , pX, 0);.  Tcl_
14170 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  DecrRefCount(pX)
14180 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
14190 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
141a0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
141b0 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63  Str(pVal, -1, Tc
141c0 6c 5f 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c  l_GetStringResul
141d0 74 28 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20  t(interp), .    
141e0 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53    SQLITE_UTF8, S
141f0 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
14200 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
14210 74 65 78 74 31 36 28 70 43 74 78 2c 20 73 71 6c  text16(pCtx, sql
14220 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
14230 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6le(pVal),.     
14240 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
14250 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
14260 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62  3_result_text16b
14270 65 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f  e(pCtx, sqlite3_
14280 76 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70  value_text16le(p
14290 56 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20  Val),.      -1, 
142a0 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54  SQLITE_TRANSIENT
142b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
142c0 75 6c 74 5f 74 65 78 74 31 36 6c 65 28 70 43 74  ult_text16le(pCt
142d0 78 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  x, sqlite3_value
142e0 5f 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c  _text16le(pVal),
142f0 0a 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54  .      -1, SQLIT
14300 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
14310 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
14320 28 70 56 61 6c 29 3b 0a 7d 0a 23 65 6e 64 69 66  (pVal);.}.#endif
14330 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
14340 55 54 46 31 36 20 2a 2f 0a 73 74 61 74 69 63 20  UTF16 */.static 
14350 69 6e 74 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  int test_functio
14360 6e 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  n(.  void * clie
14370 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
14380 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
14390 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
143a0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
143b0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
143c0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
143d0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
143e0 69 6e 74 20 76 61 6c 3b 0a 0a 20 20 69 66 28 20  int val;..  if( 
143f0 6f 62 6a 63 21 3d 35 20 29 20 67 6f 74 6f 20 62  objc!=5 ) goto b
14400 61 64 5f 61 72 67 73 3b 0a 20 20 69 66 28 20 67  ad_args;.  if( g
14410 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
14420 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
14430 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
14440 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14450 52 4f 52 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f  ROR;..  if( TCL_
14460 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
14470 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
14480 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76 61 6c 29  , objv[2], &val)
14490 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
144a0 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
144b0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
144c0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
144d0 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
144e0 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
144f0 38 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65  8, .        inte
14500 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  rp, test_functio
14510 6e 5f 75 74 66 38 2c 20 30 2c 20 30 29 3b 0a 20  n_utf8, 0, 0);. 
14520 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21   }.  if( TCL_OK!
14530 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
14540 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
14550 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[3], &val) ) 
14560 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14570 3b 0a 20 20 69 66 28 20 76 61 6c 20 29 7b 0a 20  ;.  if( val ){. 
14580 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
14590 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
145a0 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  test_function", 
145b0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  1, SQLITE_UTF16L
145c0 45 2c 20 0a 20 20 20 20 20 20 20 20 69 6e 74 65  E, .        inte
145d0 72 70 2c 20 74 65 73 74 5f 66 75 6e 63 74 69 6f  rp, test_functio
145e0 6e 5f 75 74 66 31 36 6c 65 2c 20 30 2c 20 30 29  n_utf16le, 0, 0)
145f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 43 4c 5f  ;.  }.  if( TCL_
14600 4f 4b 21 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65  OK!=Tcl_GetBoole
14610 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  anFromObj(interp
14620 2c 20 6f 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29  , objv[4], &val)
14630 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
14640 52 4f 52 3b 0a 20 20 69 66 28 20 76 61 6c 20 29  ROR;.  if( val )
14650 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72  {.    sqlite3_cr
14660 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
14670 2c 20 22 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  , "test_function
14680 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 1, SQLITE_UTF
14690 31 36 42 45 2c 20 0a 20 20 20 20 20 20 20 20 69  16BE, .        i
146a0 6e 74 65 72 70 2c 20 74 65 73 74 5f 66 75 6e 63  nterp, test_func
146b0 74 69 6f 6e 5f 75 74 66 31 36 62 65 2c 20 30 2c  tion_utf16be, 0,
146c0 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75   0);.  }..  retu
146d0 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 62 61 64 5f 61  rn TCL_OK;.bad_a
146e0 72 67 73 3a 0a 20 20 54 63 6c 5f 41 70 70 65 6e  rgs:.  Tcl_Appen
146f0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
14700 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
14710 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
14720 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
14730 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
14740 2c 20 30 29 2c 20 22 20 3c 44 42 3e 20 3c 75 74  , 0), " <DB> <ut
14750 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75  f8> <utf16le> <u
14760 74 66 31 36 62 65 3e 22 2c 20 30 29 3b 0a 23 65  tf16be>", 0);.#e
14770 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
14780 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20 72  MIT_UTF16 */.  r
14790 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
147a0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
147b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
147c0 5f 74 65 73 74 5f 65 72 72 73 74 72 20 3c 65 72  _test_errstr <er
147d0 72 20 63 6f 64 65 3e 0a 2a 2a 0a 2a 2a 20 54 65  r code>.**.** Te
147e0 73 74 20 74 68 61 74 20 74 68 65 20 65 6e 67 6c  st that the engl
147f0 69 73 68 20 6c 61 6e 67 75 61 67 65 20 73 74 72  ish language str
14800 69 6e 67 20 65 71 75 69 76 61 6c 65 6e 74 73 20  ing equivalents 
14810 66 6f 72 20 73 71 6c 69 74 65 20 65 72 72 6f 72  for sqlite error
14820 20 63 6f 64 65 73 0a 2a 2a 20 61 72 65 20 73 61   codes.** are sa
14830 6e 65 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65  ne. The paramete
14840 72 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  r is an integer 
14850 72 65 70 72 65 73 65 6e 74 69 6e 67 20 61 6e 20  representing an 
14860 73 71 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  sqlite error cod
14870 65 2e 0a 2a 2a 20 54 68 65 20 72 65 73 75 6c 74  e..** The result
14880 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 74 77   is a list of tw
14890 6f 20 65 6c 65 6d 65 6e 74 73 2c 20 74 68 65 20  o elements, the 
148a0 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
148b0 61 74 69 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  ation of the.** 
148c0 65 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 74  error code and t
148d0 68 65 20 65 6e 67 6c 69 73 68 20 6c 61 6e 67 75  he english langu
148e0 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e  age explanation.
148f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
14900 65 73 74 5f 65 72 72 73 74 72 28 0a 20 20 76 6f  est_errstr(.  vo
14910 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
14920 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14930 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14940 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14950 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
14960 63 68 61 72 20 2a 7a 43 6f 64 65 3b 0a 20 20 69  char *zCode;.  i
14970 6e 74 20 69 3b 0a 20 20 69 66 28 20 6f 62 6a 63  nt i;.  if( objc
14980 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
14990 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
149a0 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3c 65  rp, 1, objv, "<e
149b0 72 72 6f 72 20 63 6f 64 65 3e 22 29 3b 0a 20 20  rror code>");.  
149c0 7d 0a 0a 20 20 7a 43 6f 64 65 20 3d 20 54 63 6c  }..  zCode = Tcl
149d0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
149e0 31 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  1]);.  for(i=0; 
149f0 69 3c 32 30 30 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<200; i++){.   
14a00 20 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 74   if( 0==strcmp(t
14a10 31 45 72 72 6f 72 4e 61 6d 65 28 69 29 2c 20 7a  1ErrorName(i), z
14a20 43 6f 64 65 29 20 29 20 62 72 65 61 6b 3b 0a 20  Code) ) break;. 
14a30 20 7d 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75   }.  Tcl_SetResu
14a40 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
14a50 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72   *)sqlite3ErrStr
14a60 28 69 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  (i), 0);.  retur
14a70 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
14a80 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 62 72 65  ** Usage:    bre
14a90 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68  akpoint.**.** Th
14aa0 69 73 20 72 6f 75 74 69 6e 65 20 65 78 69 73 74  is routine exist
14ab0 73 20 66 6f 72 20 6f 6e 65 20 70 75 72 70 6f 73  s for one purpos
14ac0 65 20 2d 20 74 6f 20 70 72 6f 76 69 64 65 20 61  e - to provide a
14ad0 20 70 6c 61 63 65 20 74 6f 20 70 75 74 20 61 0a   place to put a.
14ae0 2a 2a 20 62 72 65 61 6b 70 6f 69 6e 74 20 77 69  ** breakpoint wi
14af0 74 68 20 47 44 42 20 74 68 61 74 20 63 61 6e 20  th GDB that can 
14b00 62 65 20 74 72 69 67 67 65 72 65 64 20 75 73 69  be triggered usi
14b10 6e 67 20 54 43 4c 20 63 6f 64 65 2e 20 20 54 68  ng TCL code.  Th
14b20 65 20 75 73 65 0a 2a 2a 20 66 6f 72 20 74 68 69  e use.** for thi
14b30 73 20 69 73 20 77 68 65 6e 20 61 20 70 61 72 74  s is when a part
14b40 69 63 75 6c 61 72 20 74 65 73 74 20 66 61 69 6c  icular test fail
14b50 73 20 6f 6e 20 28 73 61 79 29 20 74 68 65 20 31  s on (say) the 1
14b60 34 38 35 74 68 20 69 74 65 72 61 74 69 6f 6e 2e  485th iteration.
14b70 0a 2a 2a 20 49 6e 20 74 68 65 20 54 43 4c 20 74  .** In the TCL t
14b80 65 73 74 20 73 63 72 69 70 74 2c 20 77 65 20 63  est script, we c
14b90 61 6e 20 61 64 64 20 63 6f 64 65 20 6c 69 6b 65  an add code like
14ba0 20 74 68 69 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20   this:.**.**    
14bb0 20 69 66 20 7b 24 69 3d 3d 31 34 38 35 7d 20 62   if {$i==1485} b
14bc0 72 65 61 6b 70 6f 69 6e 74 0a 2a 2a 0a 2a 2a 20  reakpoint.**.** 
14bd0 54 68 65 6e 20 72 75 6e 20 74 65 73 74 66 69 78  Then run testfix
14be0 74 75 72 65 20 69 6e 20 74 68 65 20 64 65 62 75  ture in the debu
14bf0 67 67 65 72 20 61 6e 64 20 77 61 69 74 20 66 6f  gger and wait fo
14c00 72 20 74 68 65 20 62 72 65 61 6b 70 6f 69 6e 74  r the breakpoint
14c10 20 74 6f 0a 2a 2a 20 66 69 72 65 2e 20 20 54 68   to.** fire.  Th
14c20 65 6e 20 61 64 64 69 74 69 6f 6e 61 6c 20 62 72  en additional br
14c30 65 61 6b 70 6f 69 6e 74 73 20 63 61 6e 20 62 65  eakpoints can be
14c40 20 73 65 74 20 74 6f 20 74 72 61 63 65 20 64 6f   set to trace do
14c50 77 6e 20 74 68 65 20 62 75 67 2e 0a 2a 2f 0a 73  wn the bug..*/.s
14c60 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
14c70 72 65 61 6b 70 6f 69 6e 74 28 0a 20 20 76 6f 69  reakpoint(.  voi
14c80 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
14c90 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
14ca0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
14cb0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
14cc0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
14cd0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
14ce0 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
14cf0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
14d00 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
14d10 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
14d20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
14d30 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
14d40 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .){.  return TCL
14d50 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  _OK;         /* 
14d60 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 7d 0a  Do nothing */.}.
14d70 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
14d80 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72  sqlite3_bind_zer
14d90 6f 62 6c 6f 62 20 20 53 54 4d 54 20 49 44 58 20  oblob  STMT IDX 
14da0 4e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  N.**.** Test the
14db0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65   sqlite3_bind_ze
14dc0 72 6f 62 6c 6f 62 20 69 6e 74 65 72 66 61 63 65  roblob interface
14dd0 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65  .  STMT is a pre
14de0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
14df0 0a 2a 2a 20 49 44 58 20 69 73 20 74 68 65 20 69  .** IDX is the i
14e00 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
14e10 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
14e20 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
14e30 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
14e40 69 6e 64 73 20 61 20 4e 2d 62 79 74 65 20 7a 65  inds a N-byte ze
14e50 72 6f 2d 66 69 6c 6c 65 64 20 42 4c 4f 42 20 74  ro-filled BLOB t
14e60 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a  o the wildcard..
14e70 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
14e80 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
14e90 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
14ea0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
14eb0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
14ec0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
14ed0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
14ee0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
14ef0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
14f00 20 69 64 78 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20   idx;.  int n;. 
14f10 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
14f20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
14f30 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
14f40 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
14f50 20 22 53 54 4d 54 20 49 44 58 20 4e 22 29 3b 0a   "STMT IDX N");.
14f60 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
14f70 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
14f80 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
14f90 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
14fa0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
14fb0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
14fc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
14fd0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
14fe0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14ff0 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
15000 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15010 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
15020 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
15030 62 6a 76 5b 33 5d 2c 20 26 6e 29 20 29 20 72 65  bjv[3], &n) ) re
15040 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15050 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15060 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 28 70 53  bind_zeroblob(pS
15070 74 6d 74 2c 20 69 64 78 2c 20 6e 29 3b 0a 20 20  tmt, idx, n);.  
15080 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
15090 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
150a0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
150b0 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
150c0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
150d0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
150e0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
150f0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
15100 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
15110 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
15120 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 20 20 53  ite3_bind_int  S
15130 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a 2a 0a 2a  TMT N VALUE.**.*
15140 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
15150 65 33 5f 62 69 6e 64 5f 69 6e 74 20 69 6e 74 65  e3_bind_int inte
15160 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
15170 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
15180 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
15190 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
151a0 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
151b0 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
151c0 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
151d0 2a 20 62 69 6e 64 73 20 61 20 33 32 2d 62 69 74  * binds a 32-bit
151e0 20 69 6e 74 65 67 65 72 20 56 41 4c 55 45 20 74   integer VALUE t
151f0 6f 20 74 68 61 74 20 77 69 6c 64 63 61 72 64 2e  o that wildcard.
15200 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
15210 65 73 74 5f 62 69 6e 64 5f 69 6e 74 28 0a 20 20  est_bind_int(.  
15220 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
15230 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
15240 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
15250 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
15260 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
15270 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
15280 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
15290 3b 0a 20 20 69 6e 74 20 76 61 6c 75 65 3b 0a 20  ;.  int value;. 
152a0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
152b0 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
152c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
152d0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
152e0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
152f0 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63   \"",.        Tc
15300 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
15310 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
15320 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22 2c  " STMT N VALUE",
15330 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
15340 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
15350 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
15360 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
15370 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
15380 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
15390 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
153a0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
153b0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
153c0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20   objv[2], &idx) 
153d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
153e0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
153f0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
15400 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61  rp, objv[3], &va
15410 6c 75 65 29 20 29 20 72 65 74 75 72 6e 20 54 43  lue) ) return TC
15420 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
15430 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
15440 74 28 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61  t(pStmt, idx, va
15450 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  lue);.  if( sqli
15460 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
15470 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
15480 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
15490 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
154a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
154b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
154c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
154d0 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ..  return TCL_O
154e0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  K;.}.../*.** Usa
154f0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69  ge:   sqlite3_bi
15500 6e 64 5f 69 6e 74 36 34 20 20 53 54 4d 54 20 4e  nd_int64  STMT N
15510 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73   VALUE.**.** Tes
15520 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69  t the sqlite3_bi
15530 6e 64 5f 69 6e 74 36 34 20 69 6e 74 65 72 66 61  nd_int64 interfa
15540 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
15550 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
15560 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
15570 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
15580 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
15590 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
155a0 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
155b0 69 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e  inds a 64-bit in
155c0 74 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74  teger VALUE to t
155d0 68 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f  hat wildcard..*/
155e0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
155f0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 0a 20 20 76  _bind_int64(.  v
15600 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15610 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15620 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15630 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15640 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15650 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15660 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
15670 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 76  .  Tcl_WideInt v
15680 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  alue;.  int rc;.
15690 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
156a0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
156b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
156c0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
156d0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
156e0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
156f0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
15700 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20  ], 0), " STMT N 
15710 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20  VALUE", 0);.    
15720 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15730 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
15740 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
15750 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
15760 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
15770 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
15780 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
15790 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
157a0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
157b0 20 26 69 64 78 29 20 29 20 72 65 74 75 72 6e 20   &idx) ) return 
157c0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
157d0 20 54 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46   Tcl_GetWideIntF
157e0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
157f0 62 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20  bjv[3], &value) 
15800 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
15810 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  OR;..  rc = sqli
15820 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
15830 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
15840 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
15850 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65  TestErrCode(inte
15860 72 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74  rp, StmtToDb(pSt
15870 6d 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72  mt), rc) ) retur
15880 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
15890 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
158a0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
158b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
158c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
158d0 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
158e0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
158f0 64 6f 75 62 6c 65 20 20 53 54 4d 54 20 4e 20 56  double  STMT N V
15900 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20  ALUE.**.** Test 
15910 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  the sqlite3_bind
15920 5f 64 6f 75 62 6c 65 20 69 6e 74 65 72 66 61 63  _double interfac
15930 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70 72  e.  STMT is a pr
15940 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74  epared statement
15950 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e  ..** N is the in
15960 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72  dex of a wildcar
15970 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72 65  d in the prepare
15980 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68  d statement.  Th
15990 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69  is command.** bi
159a0 6e 64 73 20 61 20 36 34 2d 62 69 74 20 69 6e 74  nds a 64-bit int
159b0 65 67 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68  eger VALUE to th
159c0 61 74 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  at wildcard..*/.
159d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
159e0 62 69 6e 64 5f 64 6f 75 62 6c 65 28 0a 20 20 76  bind_double(.  v
159f0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
15a00 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
15a10 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
15a20 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
15a30 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
15a40 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
15a50 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
15a60 0a 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b  .  double value;
15a70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e  .  int rc;.  con
15a80 73 74 20 63 68 61 72 20 2a 7a 56 61 6c 3b 0a 20  st char *zVal;. 
15a90 20 69 6e 74 20 69 3b 0a 20 20 73 74 61 74 69 63   int i;.  static
15aa0 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
15ab0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
15ac0 7a 4e 61 6d 65 3b 20 20 20 20 20 2f 2a 20 4e 61  zName;     /* Na
15ad0 6d 65 20 6f 66 20 74 68 65 20 73 70 65 63 69 61  me of the specia
15ae0 6c 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  l floating point
15af0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 75 6e   value */.    un
15b00 73 69 67 6e 65 64 20 69 6e 74 20 69 55 70 70 65  signed int iUppe
15b10 72 3b 20 20 20 2f 2a 20 55 70 70 65 72 20 33 32  r;   /* Upper 32
15b20 20 62 69 74 73 20 2a 2f 0a 20 20 20 20 75 6e 73   bits */.    uns
15b30 69 67 6e 65 64 20 69 6e 74 20 69 4c 6f 77 65 72  igned int iLower
15b40 3b 20 20 20 2f 2a 20 4c 6f 77 65 72 20 33 32 20  ;   /* Lower 32 
15b50 62 69 74 73 20 2a 2f 0a 20 20 7d 20 61 53 70 65  bits */.  } aSpe
15b60 63 69 61 6c 46 70 5b 5d 20 3d 20 7b 0a 20 20 20  cialFp[] = {.   
15b70 20 7b 20 20 22 4e 61 4e 22 2c 20 20 20 20 20 20   {  "NaN",      
15b80 30 78 37 66 66 66 66 66 66 66 2c 20 30 78 66 66  0x7fffffff, 0xff
15b90 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20  ffffff },.    { 
15ba0 20 22 53 4e 61 4e 22 2c 20 20 20 20 20 30 78 37   "SNaN",     0x7
15bb0 66 66 37 66 66 66 66 2c 20 30 78 66 66 66 66 66  ff7ffff, 0xfffff
15bc0 66 66 66 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d  fff },.    {  "-
15bd0 4e 61 4e 22 2c 20 20 20 20 20 30 78 66 66 66 66  NaN",     0xffff
15be0 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
15bf0 20 7d 2c 0a 20 20 20 20 7b 20 20 22 2d 53 4e 61   },.    {  "-SNa
15c00 4e 22 2c 20 20 20 20 30 78 66 66 66 37 66 66 66  N",    0xfff7fff
15c10 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
15c20 0a 20 20 20 20 7b 20 20 22 2b 49 6e 66 22 2c 20  .    {  "+Inf", 
15c30 20 20 20 20 30 78 37 66 66 30 30 30 30 30 2c 20      0x7ff00000, 
15c40 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  0x00000000 },.  
15c50 20 20 7b 20 20 22 2d 49 6e 66 22 2c 20 20 20 20    {  "-Inf",    
15c60 20 30 78 66 66 66 30 30 30 30 30 2c 20 30 78 30   0xfff00000, 0x0
15c70 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  0000000 },.    {
15c80 20 20 22 45 70 73 69 6c 6f 6e 22 2c 20 20 30 78    "Epsilon",  0x
15c90 30 30 30 30 30 30 30 30 2c 20 30 78 30 30 30 30  00000000, 0x0000
15ca0 30 30 30 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0001 },.    {  "
15cb0 2d 45 70 73 69 6c 6f 6e 22 2c 20 30 78 38 30 30  -Epsilon", 0x800
15cc0 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
15cd0 31 20 7d 2c 0a 20 20 20 20 7b 20 20 22 4e 61 4e  1 },.    {  "NaN
15ce0 30 22 2c 20 20 20 20 20 30 78 37 66 66 38 30 30  0",     0x7ff800
15cf0 30 30 2c 20 30 78 30 30 30 30 30 30 30 30 20 7d  00, 0x00000000 }
15d00 2c 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 30 22  ,.    {  "-NaN0"
15d10 2c 20 20 20 20 30 78 66 66 66 38 30 30 30 30 2c  ,    0xfff80000,
15d20 20 30 78 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   0x00000000 },. 
15d30 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   };..  if( objc!
15d40 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =4 ){.    Tcl_Ap
15d50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
15d60 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
15d70 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
15d80 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
15d90 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
15da0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
15db0 54 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a  T N VALUE", 0);.
15dc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
15dd0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
15de0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
15df0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
15e00 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
15e10 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
15e20 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
15e30 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
15e40 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
15e50 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
15e60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
15e70 20 20 2f 2a 20 49 6e 74 65 72 63 65 70 74 20 74    /* Intercept t
15e80 68 65 20 73 74 72 69 6e 67 20 22 4e 61 4e 22 20  he string "NaN" 
15e90 61 6e 64 20 67 65 6e 65 72 61 74 65 20 61 20 4e  and generate a N
15ea0 61 4e 20 76 61 6c 75 65 20 66 6f 72 20 69 74 2e  aN value for it.
15eb0 0a 20 20 2a 2a 20 41 6c 6c 20 6f 74 68 65 72 20  .  ** All other 
15ec0 73 74 72 69 6e 67 73 20 61 72 65 20 70 61 73 73  strings are pass
15ed0 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 54 63  ed through to Tc
15ee0 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
15ef0 62 6a 28 29 2e 0a 20 20 2a 2a 20 54 63 6c 5f 47  bj()..  ** Tcl_G
15f00 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28  etDoubleFromObj(
15f10 29 20 73 68 6f 75 6c 64 20 75 6e 64 65 72 73 74  ) should underst
15f20 61 6e 64 20 22 4e 61 4e 22 20 62 75 74 20 73 6f  and "NaN" but so
15f30 6d 65 20 76 65 72 73 69 6f 6e 73 0a 20 20 2a 2a  me versions.  **
15f40 20 63 6f 6e 74 61 69 6e 20 61 20 62 75 67 2e 0a   contain a bug..
15f50 20 20 2a 2f 0a 20 20 7a 56 61 6c 20 3d 20 54 63    */.  zVal = Tc
15f60 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15f70 5b 33 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  [3]);.  for(i=0;
15f80 20 69 3c 73 69 7a 65 6f 66 28 61 53 70 65 63 69   i<sizeof(aSpeci
15f90 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70  alFp)/sizeof(aSp
15fa0 65 63 69 61 6c 46 70 5b 30 5d 29 3b 20 69 2b 2b  ecialFp[0]); i++
15fb0 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
15fc0 70 28 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e  p(aSpecialFp[i].
15fd0 7a 4e 61 6d 65 2c 20 7a 56 61 6c 29 3d 3d 30 20  zName, zVal)==0 
15fe0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
15ff0 5f 75 69 6e 74 36 34 20 78 3b 0a 20 20 20 20 20  _uint64 x;.     
16000 20 78 20 3d 20 61 53 70 65 63 69 61 6c 46 70 5b   x = aSpecialFp[
16010 69 5d 2e 69 55 70 70 65 72 3b 0a 20 20 20 20 20  i].iUpper;.     
16020 20 78 20 3c 3c 3d 20 33 32 3b 0a 20 20 20 20 20   x <<= 32;.     
16030 20 78 20 7c 3d 20 61 53 70 65 63 69 61 6c 46 70   x |= aSpecialFp
16040 5b 69 5d 2e 69 4c 6f 77 65 72 3b 0a 20 20 20 20  [i].iLower;.    
16050 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
16060 28 76 61 6c 75 65 29 3d 3d 38 20 29 3b 0a 20 20  (value)==8 );.  
16070 20 20 20 20 61 73 73 65 72 74 28 20 73 69 7a 65      assert( size
16080 6f 66 28 78 29 3d 3d 38 20 29 3b 0a 20 20 20 20  of(x)==8 );.    
16090 20 20 6d 65 6d 63 70 79 28 26 76 61 6c 75 65 2c    memcpy(&value,
160a0 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 20 20 62   &x, 8);.      b
160b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
160c0 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28    if( i>=sizeof(
160d0 61 53 70 65 63 69 61 6c 46 70 29 2f 73 69 7a 65  aSpecialFp)/size
160e0 6f 66 28 61 53 70 65 63 69 61 6c 46 70 5b 30 5d  of(aSpecialFp[0]
160f0 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 54 63  ) &&.         Tc
16100 6c 5f 47 65 74 44 6f 75 62 6c 65 46 72 6f 6d 4f  l_GetDoubleFromO
16110 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
16120 33 5d 2c 20 26 76 61 6c 75 65 29 20 29 7b 0a 20  3], &value) ){. 
16130 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16140 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
16150 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
16160 62 6c 65 28 70 53 74 6d 74 2c 20 69 64 78 2c 20  ble(pStmt, idx, 
16170 76 61 6c 75 65 29 3b 0a 20 20 69 66 28 20 73 71  value);.  if( sq
16180 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
16190 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
161a0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
161b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
161c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
161d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
161e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
161f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
16200 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
16210 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
16220 69 6e 64 5f 6e 75 6c 6c 20 20 53 54 4d 54 20 4e  ind_null  STMT N
16230 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
16240 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c  sqlite3_bind_nul
16250 6c 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  l interface.  ST
16260 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
16270 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
16280 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
16290 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
162a0 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
162b0 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
162c0 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
162d0 4e 55 4c 4c 20 74 6f 20 74 68 65 20 77 69 6c 64  NULL to the wild
162e0 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  card..*/.static 
162f0 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75  int test_bind_nu
16300 6c 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ll(.  void * cli
16310 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
16320 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
16330 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16340 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
16350 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
16360 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
16370 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 72 63  nt idx;.  int rc
16380 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
16390 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
163a0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
163b0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
163c0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
163d0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
163e0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
163f0 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 20  [0], 0), " STMT 
16400 4e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  N", 0);.    retu
16410 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16420 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
16430 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
16440 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
16450 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
16460 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16470 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
16480 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
16490 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64  rp, objv[2], &id
164a0 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  x) ) return TCL_
164b0 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
164c0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
164d0 28 70 53 74 6d 74 2c 20 69 64 78 29 3b 0a 20 20  (pStmt, idx);.  
164e0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
164f0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
16500 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
16510 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
16520 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
16530 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16540 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
16550 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ROR;.  }..  retu
16560 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
16570 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
16580 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 20  ite3_bind_text  
16590 53 54 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59  STMT N STRING BY
165a0 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  TES.**.** Test t
165b0 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  he sqlite3_bind_
165c0 74 65 78 74 20 69 6e 74 65 72 66 61 63 65 2e 20  text interface. 
165d0 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
165e0 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
165f0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
16600 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
16610 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
16620 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
16630 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
16640 20 61 20 55 54 46 2d 38 20 73 74 72 69 6e 67 20   a UTF-8 string 
16650 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77 69  STRING to the wi
16660 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74 72  ldcard.  The str
16670 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79 74  ing is BYTES byt
16680 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73  es.** long..*/.s
16690 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62  tatic int test_b
166a0 69 6e 64 5f 74 65 78 74 28 0a 20 20 76 6f 69 64  ind_text(.  void
166b0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
166c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
166d0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
166e0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
166f0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
16700 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16710 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20  t;.  int idx;.  
16720 69 6e 74 20 62 79 74 65 73 3b 0a 20 20 63 68 61  int bytes;.  cha
16730 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20  r *value;.  int 
16740 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
16750 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =5 ){.    Tcl_Ap
16760 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
16770 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
16780 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
16790 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74  .        Tcl_Get
167a0 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
167b0 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d  jv[0], 0), " STM
167c0 54 20 4e 20 56 41 4c 55 45 20 42 59 54 45 53 22  T N VALUE BYTES"
167d0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
167e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
167f0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
16800 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
16810 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
16820 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
16830 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16840 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
16850 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
16860 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
16870 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16880 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28  ROR;.  value = (
16890 63 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74  char*)Tcl_GetByt
168a0 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62  eArrayFromObj(ob
168b0 6a 76 5b 33 5d 2c 20 26 62 79 74 65 73 29 3b 0a  jv[3], &bytes);.
168c0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
168d0 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
168e0 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73 29  objv[4], &bytes)
168f0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
16900 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  ROR;..  rc = sql
16910 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
16920 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65  Stmt, idx, value
16930 2c 20 62 79 74 65 73 2c 20 53 51 4c 49 54 45 5f  , bytes, SQLITE_
16940 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 69 66  TRANSIENT);.  if
16950 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  ( sqlite3TestErr
16960 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74 6d  Code(interp, Stm
16970 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72 63  tToDb(pStmt), rc
16980 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
16990 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21 3d  RROR;.  if( rc!=
169a0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
169b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
169c0 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
169d0 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  3ErrName(rc), 0)
169e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
169f0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72  _ERROR;.  }..  r
16a00 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
16a10 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
16a20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
16a30 74 31 36 20 3f 2d 73 74 61 74 69 63 3f 20 53 54  t16 ?-static? ST
16a40 4d 54 20 4e 20 53 54 52 49 4e 47 20 42 59 54 45  MT N STRING BYTE
16a50 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  S.**.** Test the
16a60 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
16a70 78 74 31 36 20 69 6e 74 65 72 66 61 63 65 2e 20  xt16 interface. 
16a80 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70 61   STMT is a prepa
16a90 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a  red statement..*
16aa0 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78  * N is the index
16ab0 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20 69   of a wildcard i
16ac0 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73  n the prepared s
16ad0 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
16ae0 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73  command.** binds
16af0 20 61 20 55 54 46 2d 31 36 20 73 74 72 69 6e 67   a UTF-16 string
16b00 20 53 54 52 49 4e 47 20 74 6f 20 74 68 65 20 77   STRING to the w
16b10 69 6c 64 63 61 72 64 2e 20 20 54 68 65 20 73 74  ildcard.  The st
16b20 72 69 6e 67 20 69 73 20 42 59 54 45 53 20 62 79  ring is BYTES by
16b30 74 65 73 0a 2a 2a 20 6c 6f 6e 67 2e 0a 2a 2f 0a  tes.** long..*/.
16b40 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
16b50 62 69 6e 64 5f 74 65 78 74 31 36 28 0a 20 20 76  bind_text16(.  v
16b60 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
16b70 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
16b80 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
16b90 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
16ba0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
16bb0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16bc0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
16bd0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16be0 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
16bf0 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
16c00 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
16c10 0a 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 6c 29  ..  void (*xDel)
16c20 28 76 6f 69 64 2a 29 20 3d 20 28 6f 62 6a 63 3d  (void*) = (objc=
16c30 3d 36 3f 53 51 4c 49 54 45 5f 53 54 41 54 49 43  =6?SQLITE_STATIC
16c40 3a 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e  :SQLITE_TRANSIEN
16c50 54 29 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  T);.  Tcl_Obj *o
16c60 53 74 6d 74 20 20 20 20 3d 20 6f 62 6a 76 5b 6f  Stmt    = objv[o
16c70 62 6a 63 2d 34 5d 3b 0a 20 20 54 63 6c 5f 4f 62  bjc-4];.  Tcl_Ob
16c80 6a 20 2a 6f 4e 20 20 20 20 20 20 20 3d 20 6f 62  j *oN       = ob
16c90 6a 76 5b 6f 62 6a 63 2d 33 5d 3b 0a 20 20 54 63  jv[objc-3];.  Tc
16ca0 6c 5f 4f 62 6a 20 2a 6f 53 74 72 69 6e 67 20 20  l_Obj *oString  
16cb0 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 32 5d 3b 0a  = objv[objc-2];.
16cc0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 42 79 74 65    Tcl_Obj *oByte
16cd0 73 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d  s   = objv[objc-
16ce0 31 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  1];..  if( objc!
16cf0 3d 35 20 26 26 20 6f 62 6a 63 21 3d 36 29 7b 0a  =5 && objc!=6){.
16d00 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16d10 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
16d20 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
16d30 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
16d40 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
16d50 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
16d60 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
16d70 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  LUE BYTES", 0);.
16d80 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16d90 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
16da0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
16db0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
16dc0 74 72 69 6e 67 28 6f 53 74 6d 74 29 2c 20 26 70  tring(oStmt), &p
16dd0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
16de0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
16df0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16e00 6a 28 69 6e 74 65 72 70 2c 20 6f 4e 2c 20 26 69  j(interp, oN, &i
16e10 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  dx) ) return TCL
16e20 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65 20  _ERROR;.  value 
16e30 3d 20 28 63 68 61 72 2a 29 54 63 6c 5f 47 65 74  = (char*)Tcl_Get
16e40 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62 6a  ByteArrayFromObj
16e50 28 6f 53 74 72 69 6e 67 2c 20 30 29 3b 0a 20 20  (oString, 0);.  
16e60 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
16e70 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 42  omObj(interp, oB
16e80 79 74 65 73 2c 20 26 62 79 74 65 73 29 20 29 20  ytes, &bytes) ) 
16e90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16ea0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
16eb0 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 28 70 53  3_bind_text16(pS
16ec0 74 6d 74 2c 20 69 64 78 2c 20 28 76 6f 69 64 20  tmt, idx, (void 
16ed0 2a 29 76 61 6c 75 65 2c 20 62 79 74 65 73 2c 20  *)value, bytes, 
16ee0 78 44 65 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c  xDel);.  if( sql
16ef0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
16f00 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62  interp, StmtToDb
16f10 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72  (pStmt), rc) ) r
16f20 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16f30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
16f40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f  E_OK ){.    Tcl_
16f50 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16f60 65 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e  erp, sqlite3ErrN
16f70 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20  ame(rc), 0);.   
16f80 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
16f90 52 3b 0a 20 20 7d 0a 0a 23 65 6e 64 69 66 20 2f  R;.  }..#endif /
16fa0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
16fb0 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
16fc0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
16fd0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
16fe0 33 5f 62 69 6e 64 5f 62 6c 6f 62 20 3f 2d 73 74  3_bind_blob ?-st
16ff0 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 44 41 54  atic? STMT N DAT
17000 41 20 42 59 54 45 53 0a 2a 2a 0a 2a 2a 20 54 65  A BYTES.**.** Te
17010 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62  st the sqlite3_b
17020 69 6e 64 5f 62 6c 6f 62 20 69 6e 74 65 72 66 61  ind_blob interfa
17030 63 65 2e 20 20 53 54 4d 54 20 69 73 20 61 20 70  ce.  STMT is a p
17040 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
17050 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68 65 20 69  t..** N is the i
17060 6e 64 65 78 20 6f 66 20 61 20 77 69 6c 64 63 61  ndex of a wildca
17070 72 64 20 69 6e 20 74 68 65 20 70 72 65 70 61 72  rd in the prepar
17080 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 54  ed statement.  T
17090 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62  his command.** b
170a0 69 6e 64 73 20 61 20 42 4c 4f 42 20 74 6f 20 74  inds a BLOB to t
170b0 68 65 20 77 69 6c 64 63 61 72 64 2e 20 20 54 68  he wildcard.  Th
170c0 65 20 42 4c 4f 42 20 69 73 20 42 59 54 45 53 20  e BLOB is BYTES 
170d0 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a  bytes in size..*
170e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
170f0 74 5f 62 69 6e 64 5f 62 6c 6f 62 28 0a 20 20 76  t_bind_blob(.  v
17100 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
17110 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17120 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17130 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17140 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17150 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17160 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b  Stmt;.  int idx;
17170 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 0a 20 20  .  int bytes;.  
17180 63 68 61 72 20 2a 76 61 6c 75 65 3b 0a 20 20 69  char *value;.  i
17190 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
171a0 5f 64 65 73 74 72 75 63 74 6f 72 5f 74 79 70 65  _destructor_type
171b0 20 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 53   xDestructor = S
171c0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 3b  QLITE_TRANSIENT;
171d0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
171e0 26 26 20 6f 62 6a 63 21 3d 36 20 29 7b 0a 20 20  && objc!=6 ){.  
171f0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
17200 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
17210 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
17220 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
17230 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
17240 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
17250 29 2c 20 22 20 53 54 4d 54 20 4e 20 44 41 54 41  ), " STMT N DATA
17260 20 42 59 54 45 53 22 2c 20 30 29 3b 0a 20 20 20   BYTES", 0);.   
17270 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17280 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62  R;.  }..  if( ob
17290 6a 63 3d 3d 36 20 29 7b 0a 20 20 20 20 78 44 65  jc==6 ){.    xDe
172a0 73 74 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54  structor = SQLIT
172b0 45 5f 53 54 41 54 49 43 3b 0a 20 20 20 20 6f 62  E_STATIC;.    ob
172c0 6a 76 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  jv++;.  }..  if(
172d0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
172e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
172f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
17300 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
17310 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17320 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
17330 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
17340 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
17350 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17360 20 76 61 6c 75 65 20 3d 20 54 63 6c 5f 47 65 74   value = Tcl_Get
17370 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b  String(objv[3]);
17380 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
17390 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
173a0 20 6f 62 6a 76 5b 34 5d 2c 20 26 62 79 74 65 73   objv[4], &bytes
173b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
173c0 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71  RROR;..  rc = sq
173d0 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 28  lite3_bind_blob(
173e0 70 53 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75  pStmt, idx, valu
173f0 65 2c 20 62 79 74 65 73 2c 20 78 44 65 73 74 72  e, bytes, xDestr
17400 75 63 74 6f 72 29 3b 0a 20 20 69 66 28 20 73 71  uctor);.  if( sq
17410 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
17420 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
17430 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
17440 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17450 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
17460 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
17470 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17480 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
17490 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
174a0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
174b0 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f  ind_parameter_co
174c0 75 6e 74 20 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20  unt  STMT.**.** 
174d0 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
174e0 72 20 6f 66 20 77 69 6c 64 63 61 72 64 73 20 69  r of wildcards i
174f0 6e 20 74 68 65 20 67 69 76 65 6e 20 73 74 61 74  n the given stat
17500 65 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ement..*/.static
17510 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70   int test_bind_p
17520 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 28 0a  arameter_count(.
17530 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
17540 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17550 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17560 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17570 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17580 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
17590 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
175a0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
175b0 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
175c0 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
175d0 20 22 53 54 4d 54 22 29 3b 0a 20 20 20 20 72 65   "STMT");.    re
175e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
175f0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 53 74 6d    }.  if( getStm
17600 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
17610 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
17620 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
17630 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
17640 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62  ROR;.  Tcl_SetOb
17650 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
17660 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71  Tcl_NewIntObj(sq
17670 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
17680 65 74 65 72 5f 63 6f 75 6e 74 28 70 53 74 6d 74  eter_count(pStmt
17690 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )));.  return TC
176a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
176b0 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f  sage:   sqlite3_
176c0 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 6e  bind_parameter_n
176d0 61 6d 65 20 20 53 54 4d 54 20 20 4e 0a 2a 2a 0a  ame  STMT  N.**.
176e0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61  ** Return the na
176f0 6d 65 20 6f 66 20 74 68 65 20 4e 74 68 20 77 69  me of the Nth wi
17700 6c 64 63 61 72 64 2e 20 20 54 68 65 20 66 69 72  ldcard.  The fir
17710 73 74 20 77 69 6c 64 63 61 72 64 20 69 73 20 31  st wildcard is 1
17720 2e 0a 2a 2a 20 41 6e 20 65 6d 70 74 79 20 73 74  ..** An empty st
17730 72 69 6e 67 20 69 73 20 72 65 74 75 72 6e 65 64  ring is returned
17740 20 69 66 20 4e 20 69 73 20 6f 75 74 20 6f 66 20   if N is out of 
17750 72 61 6e 67 65 20 6f 72 20 69 66 20 74 68 65 20  range or if the 
17760 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 73 20 6e  wildcard.** is n
17770 61 6d 65 6c 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  ameless..*/.stat
17780 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
17790 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
177a0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
177b0 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
177c0 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
177d0 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
177e0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
177f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
17800 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
17810 69 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  i;..  if( objc!=
17820 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  3 ){.    Tcl_Wro
17830 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
17840 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
17850 20 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   N");.    return
17860 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
17870 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
17880 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
17890 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
178a0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
178b0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
178c0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
178d0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
178e0 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 29 20 29 20   objv[2], &i) ) 
178f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17900 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
17910 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20  sult(interp, .  
17920 20 20 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67     Tcl_NewString
17930 4f 62 6a 28 73 71 6c 69 74 65 33 5f 62 69 6e 64  Obj(sqlite3_bind
17940 5f 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 28  _parameter_name(
17950 70 53 74 6d 74 2c 69 29 2c 2d 31 29 0a 20 20 29  pStmt,i),-1).  )
17960 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
17970 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
17980 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  e:   sqlite3_bin
17990 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65  d_parameter_inde
179a0 78 20 20 53 54 4d 54 20 20 4e 41 4d 45 0a 2a 2a  x  STMT  NAME.**
179b0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 69  .** Return the i
179c0 6e 64 65 78 20 6f 66 20 74 68 65 20 77 69 6c 64  ndex of the wild
179d0 63 61 72 64 20 63 61 6c 6c 65 64 20 4e 41 4d 45  card called NAME
179e0 2e 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74  .  Return 0 if t
179f0 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 73 75  here is.** no su
17a00 63 68 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a  ch wildcard..*/.
17a10 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
17a20 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69  bind_parameter_i
17a30 6e 64 65 78 28 0a 20 20 76 6f 69 64 20 2a 20 63  ndex(.  void * c
17a40 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
17a50 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
17a60 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
17a70 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
17a80 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
17a90 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
17aa0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b    if( objc!=3 ){
17ab0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
17ac0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
17ad0 20 6f 62 6a 76 2c 20 22 53 54 4d 54 20 4e 41 4d   objv, "STMT NAM
17ae0 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
17af0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
17b00 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
17b10 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
17b20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17b30 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65  ]), &pStmt) ) re
17b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17b50 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
17b60 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
17b70 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 0a   Tcl_NewIntObj(.
17b80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
17b90 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
17ba0 64 65 78 28 70 53 74 6d 74 2c 54 63 6c 5f 47 65  dex(pStmt,Tcl_Ge
17bb0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29  tString(objv[2])
17bc0 29 0a 20 20 20 20 20 29 0a 20 20 29 3b 0a 20 20  ).     ).  );.  
17bd0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
17be0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
17bf0 20 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62   sqlite3_clear_b
17c00 69 6e 64 69 6e 67 73 20 53 54 4d 54 0a 2a 2a 0a  indings STMT.**.
17c10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
17c20 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  st_clear_binding
17c30 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  s(.  void * clie
17c40 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
17c50 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
17c60 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
17c70 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
17c80 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73  ].){.  sqlite3_s
17c90 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69  tmt *pStmt;..  i
17ca0 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
17cb0 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
17cc0 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
17cd0 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20 20  jv, "STMT");.   
17ce0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
17cf0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
17d00 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
17d10 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
17d20 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
17d30 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
17d40 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65  _ERROR;.  Tcl_Se
17d50 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
17d60 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
17d70 28 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  (sqlite3_clear_b
17d80 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 29 29 29  indings(pStmt)))
17d90 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
17da0 4b 3b 0a 7d 0a 0a 2f 2a 0a 20 2a 2a 20 55 73 61  K;.}../*. ** Usa
17db0 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  ge:   sqlite3_cl
17dc0 65 61 72 5f 62 69 6e 64 69 6e 67 73 20 53 54 4d  ear_bindings STM
17dd0 54 0a 20 2a 2a 0a 20 2a 2f 0a 73 74 61 74 69 63  T. **. */.static
17de0 20 69 6e 74 20 74 65 73 74 5f 63 6c 65 61 72 5f   int test_clear_
17df0 62 69 6e 64 69 6e 67 73 5f 6e 75 6c 6c 28 0a 20  bindings_null(. 
17e00 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
17e10 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
17e20 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
17e30 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
17e40 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
17e50 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31    .  if( objc!=1
17e60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
17e70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
17e80 2f 2a 20 74 65 73 74 20 66 6f 72 20 68 61 6e 64  /* test for hand
17e90 6c 69 6e 67 20 4e 55 4c 4c 20 3c 72 64 61 72 3a  ling NULL <rdar:
17ea0 2f 2f 70 72 6f 62 6c 65 6d 2f 36 36 34 36 33 33  //problem/664633
17eb0 31 3e 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 4f  1> */.  Tcl_SetO
17ec0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
17ed0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
17ee0 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62 69 6e  qlite3_clear_bin
17ef0 64 69 6e 67 73 28 30 29 29 29 3b 0a 20 20 72 65  dings(0)));.  re
17f00 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17f10 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
17f20 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c  qlite3_sleep MIL
17f30 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61  LISECONDS.*/.sta
17f40 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6c 65  tic int test_sle
17f50 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ep(.  void * cli
17f60 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17f70 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17f80 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17f90 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17fa0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a  [].){.  int ms;.
17fb0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
17fc0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
17fd0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
17fe0 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
17ff0 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74  CONDS");.    ret
18000 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18010 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
18020 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
18030 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29  p, objv[1], &ms)
18040 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
18050 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
18060 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
18070 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
18080 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73  IntObj(sqlite3_s
18090 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65  leep(ms)));.  re
180a0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
180b0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
180c0 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
180d0 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rcode DB.**.** R
180e0 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67  eturn the string
180f0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
18100 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
18110 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
18120 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
18130 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52  e.g. "SQLITE_ERR
18140 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  OR"..*/.static i
18150 6e 74 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f  nt test_ex_errco
18160 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  de(.  void * cli
18170 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
18180 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
18190 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
181a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
181b0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
181c0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
181d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
181e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
181f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
18200 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
18210 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
18220 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
18230 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
18240 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
18250 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
18260 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
18270 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
18280 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
18290 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
182a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
182b0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 74 65  c = sqlite3_exte
182c0 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 64 62 29  nded_errcode(db)
182d0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
182e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
182f0 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
18300 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
18310 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
18320 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
18330 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a  te3_errcode DB.*
18340 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18350 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
18360 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
18370 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
18380 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20  _* API.** error 
18390 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49  code. e.g. "SQLI
183a0 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74  TE_ERROR"..*/.st
183b0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
183c0 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20  rcode(.  void * 
183d0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
183e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
183f0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18400 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18410 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18420 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
18430 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
18440 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18450 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18460 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18470 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
18480 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
18490 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
184a0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
184b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
184c0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
184d0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
184e0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
184f0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
18500 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18510 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
18520 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63  rrcode(db);.  Tc
18530 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18540 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
18550 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
18560 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
18570 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
18580 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 65  age:   sqlite3_e
18590 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rrmsg DB.**.** R
185a0 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 38  eturns the UTF-8
185b0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
185c0 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
185d0 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
185e0 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
185f0 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
18600 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
18610 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67   int test_errmsg
18620 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
18630 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
18640 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
18650 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
18660 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
18670 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
18680 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
18690 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62  *zErr;..  if( ob
186a0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
186b0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
186c0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
186d0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
186e0 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
186f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18700 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
18710 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18720 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
18730 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
18740 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18750 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
18760 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
18770 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73  ROR;..  zErr = s
18780 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
18790 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
187a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
187b0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
187c0 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74  Err, -1));.  ret
187d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
187e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65  *.** Usage:   te
187f0 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a 2a  st_errmsg16 DB.*
18800 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
18810 20 55 54 46 2d 31 36 20 72 65 70 72 65 73 65 6e   UTF-16 represen
18820 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72  tation of the er
18830 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
18840 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  ng for the.** mo
18850 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
18860 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54 68  3_* API call. Th
18870 69 73 20 69 73 20 61 20 62 79 74 65 20 61 72 72  is is a byte arr
18880 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ay object at the
18890 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20   TCL .** level, 
188a0 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73 20  and it includes 
188b0 74 68 65 20 30 78 30 30 20 30 78 30 30 20 74 65  the 0x00 0x00 te
188c0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 61  rminator bytes a
188d0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
188e0 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e  .** UTF-16 strin
188f0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
18900 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28 0a   test_errmsg16(.
18910 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18920 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18930 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18940 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18950 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
18960 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
18970 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
18980 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
18990 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20  st void *zErr;. 
189a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
189b0 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30 3b    int bytes = 0;
189c0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
189d0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
189e0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
189f0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
18a00 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
18a10 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
18a20 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
18a30 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
18a40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18a50 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
18a60 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
18a70 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
18a80 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
18a90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
18aa0 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
18ab0 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20  _errmsg16(db);. 
18ac0 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
18ad0 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20 20 66   z = zErr;.    f
18ae0 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b 62 79  or(bytes=0; z[by
18af0 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65 73 2b  tes] || z[bytes+
18b00 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b 7d 0a  1]; bytes+=2){}.
18b10 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
18b20 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18b30 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
18b40 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29 29  bj(zErr, bytes))
18b50 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
18b60 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
18b70 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
18b80 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
18b90 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
18ba0 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  e DB sql bytes ?
18bb0 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43  tailvar?.**.** C
18bc0 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
18bd0 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
18be0 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
18bf0 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
18c00 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
18c10 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
18c20 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
18c30 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
18c40 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
18c50 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
18c60 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
18c70 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
18c80 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
18c90 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
18ca0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
18cb0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
18cc0 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  pare(.  void * c
18cd0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
18ce0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18cf0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18d00 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18d10 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
18d20 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
18d30 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
18d40 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20   bytes;.  const 
18d50 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  char *zTail = 0;
18d60 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
18d70 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
18d80 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
18d90 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
18da0 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
18db0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18dc0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18dd0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18de0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
18df0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
18e00 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
18e10 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
18e20 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20  ailvar?", 0);.  
18e30 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18e40 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
18e50 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
18e60 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
18e70 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
18e80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18e90 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
18ea0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18eb0 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
18ec0 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
18ed0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
18ee0 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
18ef0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
18f00 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
18f10 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  e(db, zSql, byte
18f20 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
18f30 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
18f40 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
18f50 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  ult(interp);.  i
18f60 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
18f70 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
18f80 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
18f90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
18fa0 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35  zTail && objc>=5
18fb0 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
18fc0 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
18fd0 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69  tes = bytes - (i
18fe0 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b  nt)(zTail-zSql);
18ff0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
19000 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c  int)strlen(zTail
19010 29 3c 62 79 74 65 73 20 29 7b 0a 20 20 20 20 20  )<bytes ){.     
19020 20 62 79 74 65 73 20 3d 20 28 69 6e 74 29 73 74   bytes = (int)st
19030 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20 20  rlen(zTail);.   
19040 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65   }.    Tcl_ObjSe
19050 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62  tVar2(interp, ob
19060 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65  jv[4], 0, Tcl_Ne
19070 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c  wStringObj(zTail
19080 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20  , bytes), 0);.  
19090 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
190a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
190b0 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
190c0 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
190d0 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
190e0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
190f0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
19100 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
19110 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
19120 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19130 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
19140 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
19150 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
19160 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
19170 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
19180 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19190 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
191a0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
191b0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
191c0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
191d0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
191e0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
191f0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
19200 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ilvar?.**.** Com
19210 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
19220 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
19230 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
19240 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
19250 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
19260 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
19270 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
19280 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
19290 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
192a0 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
192b0 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
192c0 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
192d0 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
192e0 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
192f0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
19300 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
19310 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  re_v2(.  void * 
19320 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
19330 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
19340 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
19350 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
19360 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
19370 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
19380 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
19390 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74  t bytes;.  const
193a0 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
193b0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
193c0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
193d0 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
193e0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
193f0 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
19400 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
19410 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19420 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19430 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19440 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19450 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
19460 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
19470 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
19480 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19490 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
194a0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
194b0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
194c0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
194d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
194e0 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
194f0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
19500 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
19510 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
19520 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
19530 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
19540 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
19550 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
19560 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  _v2(db, zSql, by
19570 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
19580 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
19590 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d  0);.  assert(rc=
195a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
195b0 74 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52  tmt==0);.  Tcl_R
195c0 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
195d0 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  p);.  if( sqlite
195e0 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
195f0 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
19600 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19610 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20  .  if( zTail && 
19620 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69  objc>=5 ){.    i
19630 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20  f( bytes>=0 ){. 
19640 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74       bytes = byt
19650 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c  es - (int)(zTail
19660 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  -zSql);.    }.  
19670 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
19680 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
19690 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  , 0, Tcl_NewStri
196a0 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74  ngObj(zTail, byt
196b0 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  es), 0);.  }.  i
196c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
196d0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
196e0 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
196f0 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
19700 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
19710 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19720 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
19730 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
19740 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
19750 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19760 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
19770 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19780 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
19790 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
197a0 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
197b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
197c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
197d0 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
197e0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
197f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19800 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
19810 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 20  prepare_tkt3134 
19820 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  DB.**.** Generat
19830 65 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  e a prepared sta
19840 74 65 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65 72  tement for a zer
19850 6f 2d 62 79 74 65 20 73 74 72 69 6e 67 20 61 73  o-byte string as
19860 20 61 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74   a test.** for t
19870 69 63 6b 65 74 20 23 33 31 33 34 2e 20 20 54 68  icket #3134.  Th
19880 65 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20  e string should 
19890 62 65 20 70 72 65 63 65 64 65 64 20 62 79 20 61  be preceded by a
198a0 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a 73   zero byte..*/.s
198b0 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
198c0 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 28 0a  repare_tkt3134(.
198d0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
198e0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
198f0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
19900 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
19910 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
19920 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
19930 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
19940 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22 5c  char zSql[] = "\
19950 30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a 20 20  000SELECT 1";.  
19960 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
19970 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
19980 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74 20  zBuf[50];.  int 
19990 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
199a0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
199b0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
199c0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
199d0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
199e0 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
199f0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
19a00 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20   " DB sql bytes 
19a10 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20  tailvar", 0);.  
19a20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
19a30 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
19a40 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
19a50 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
19a60 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
19a70 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
19a80 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  OR;.  rc = sqlit
19a90 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
19aa0 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20 26  , &zSql[1], 0, &
19ab0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73 73  pStmt, 0);.  ass
19ac0 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  ert(rc==SQLITE_O
19ad0 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b 0a  K || pStmt==0);.
19ae0 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
19af0 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
19b00 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
19b10 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
19b20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19b30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19b40 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
19b50 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
19b60 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
19b70 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19b80 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
19b90 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
19ba0 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
19bb0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
19bc0 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
19bd0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19be0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
19bf0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
19c00 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
19c10 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
19c20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19c30 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
19c40 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19c50 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19c60 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
19c70 70 72 65 70 61 72 65 31 36 20 44 42 20 73 71 6c  prepare16 DB sql
19c80 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a 2a   bytes tailvar.*
19c90 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20  *.** Compile up 
19ca0 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65 73  to <bytes> bytes
19cb0 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65 64   of the supplied
19cc0 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c   SQL string <sql
19cd0 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62  > using.** datab
19ce0 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e  ase handle <DB>.
19cf0 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20 3c   The parameter <
19d00 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65 20  tailval> is the 
19d10 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c  name of a global
19d20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68 61  .** variable tha
19d30 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
19d40 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f  unused portion o
19d50 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79 29  f <sql> (if any)
19d60 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64  . A.** STMT hand
19d70 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  le is returned..
19d80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
19d90 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20 20  st_prepare16(.  
19da0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
19db0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
19dc0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
19dd0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
19de0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
19df0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
19e00 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
19e10 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
19e20 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63   void *zSql;.  c
19e30 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c  onst void *zTail
19e40 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   = 0;.  Tcl_Obj 
19e50 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *pTail = 0;.  sq
19e60 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
19e70 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
19e80 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72  uf[50]; .  int r
19e90 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20  c;.  int bytes; 
19ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19eb0 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70  * The integer sp
19ec0 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33  ecified as arg 3
19ed0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e   */.  int objlen
19ee0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19ef0 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61  /* The byte-arra
19f00 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20  y length of arg 
19f10 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  2 */..  if( objc
19f20 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
19f30 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
19f40 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
19f50 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
19f60 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
19f70 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
19f80 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
19f90 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
19fa0 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20  lvar?", 0);.    
19fb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
19fc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
19fd0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
19fe0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
19ff0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1a000 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a010 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
1a020 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
1a030 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
1a040 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
1a050 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1a060 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
1a070 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
1a080 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
1a090 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1a0a0 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20 62  re16(db, zSql, b
1a0b0 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62  ytes, &pStmt, ob
1a0c0 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a  jc>=5 ? &zTail :
1a0d0 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
1a0e0 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
1a0f0 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
1a100 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a110 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1a120 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1a130 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 6f  OR;.  }..  if( o
1a140 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69 66  bjc>=5 ){.    if
1a150 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20 20  ( zTail ){.     
1a160 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65 6e   objlen = objlen
1a170 20 2d 20 28 69 6e 74 29 28 28 75 38 20 2a 29 7a   - (int)((u8 *)z
1a180 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c 29  Tail-(u8 *)zSql)
1a190 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
1a1a0 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a 20     objlen = 0;. 
1a1b0 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20 3d     }.    pTail =
1a1c0 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61   Tcl_NewByteArra
1a1d0 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69 6c  yObj((u8 *)zTail
1a1e0 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20 54  , objlen);.    T
1a1f0 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1a200 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  pTail);.    Tcl_
1a210 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65 72  ObjSetVar2(inter
1a220 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20 70  p, objv[4], 0, p
1a230 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54 63  Tail, 0);.    Tc
1a240 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
1a250 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  Tail);.  }..  if
1a260 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69  ( pStmt ){.    i
1a270 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1a280 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1a290 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74  erp, zBuf, pStmt
1a2a0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1a2b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
1a2c0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
1a2d0 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 23  erp, zBuf, 0);.#
1a2e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1a2f0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20 20  OMIT_UTF16 */.  
1a300 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1a310 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1a320 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31 36  qlite3_prepare16
1a330 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65 73  _v2 DB sql bytes
1a340 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a   ?tailvar?.**.**
1a350 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c   Compile up to <
1a360 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20  bytes> bytes of 
1a370 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c  the supplied SQL
1a380 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73   string <sql> us
1a390 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
1a3a0 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65  handle <DB>. The
1a3b0 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c   parameter <tail
1a3c0 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65  val> is the name
1a3d0 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20   of a global.** 
1a3e0 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69 73  variable that is
1a3f0 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73   set to the unus
1a400 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73  ed portion of <s
1a410 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a  ql> (if any). A.
1a420 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69  ** STMT handle i
1a430 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
1a440 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70  tatic int test_p
1a450 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20 20 76  repare16_v2(.  v
1a460 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1a470 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1a480 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1a490 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1a4a0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
1a4b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1a4c0 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
1a4d0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
1a4e0 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63 6f  void *zSql;.  co
1a4f0 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c 20  nst void *zTail 
1a500 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  = 0;.  Tcl_Obj *
1a510 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  pTail = 0;.  sql
1a520 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
1a530 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42 75   = 0;.  char zBu
1a540 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72 63  f[50]; .  int rc
1a550 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20 20  ;.  int bytes;  
1a560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a570 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70 65   The integer spe
1a580 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33 20  cified as arg 3 
1a590 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e 3b  */.  int objlen;
1a5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a5b0 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61 79  * The byte-array
1a5c0 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20 32   length of arg 2
1a5d0 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   */..  if( objc!
1a5e0 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =5 && objc!=4 ){
1a5f0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
1a600 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
1a610 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
1a620 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
1a630 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
1a640 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
1a650 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69 6c   sql bytes ?tail
1a660 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72  var?", 0);.    r
1a670 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a680 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
1a690 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1a6a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1a6b0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
1a6c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1a6d0 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47 65  .  zSql = Tcl_Ge
1a6e0 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f 62  tByteArrayFromOb
1a6f0 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a 6c  j(objv[2], &objl
1a700 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  en);.  if( Tcl_G
1a710 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1a720 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
1a730 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
1a740 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
1a750 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1a760 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  e16_v2(db, zSql,
1a770 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20   bytes, &pStmt, 
1a780 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c  objc>=5 ? &zTail
1a790 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c   : 0);.  if( sql
1a7a0 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
1a7b0 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
1a7c0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a7d0 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  OR;.  if( rc ){.
1a7e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1a7f0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
1a800 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20   objc>=5 ){.    
1a810 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20  if( zTail ){.   
1a820 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c     objlen = objl
1a830 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20 2a  en - (int)((u8 *
1a840 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71  )zTail-(u8 *)zSq
1a850 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  l);.    }else{. 
1a860 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b       objlen = 0;
1a870 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c  .    }.    pTail
1a880 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72   = Tcl_NewByteAr
1a890 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61  rayObj((u8 *)zTa
1a8a0 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20  il, objlen);.   
1a8b0 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
1a8c0 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63  t(pTail);.    Tc
1a8d0 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74  l_ObjSetVar2(int
1a8e0 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c  erp, objv[4], 0,
1a8f0 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20   pTail, 0);.    
1a900 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
1a910 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20  (pTail);.  }..  
1a920 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20  if( pStmt ){.   
1a930 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
1a940 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69  MakePointerStr(i
1a950 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74  nterp, zBuf, pSt
1a960 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1a970 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
1a980 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1a990 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1a9a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1a9b0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1a9c0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1a9d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1a9e0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66 69   sqlite3_open fi
1a9f0 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73 2d  lename ?options-
1aa00 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63 20  list?.*/.static 
1aa10 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a 20  int test_open(. 
1aa20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1aa30 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1aa40 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1aa50 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1aa60 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1aa70 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1aa80 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69  Filename;.  sqli
1aa90 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20  te3 *db;.  char 
1aaa0 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66  zBuf[100];..  if
1aab0 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a  ( objc!=3 && obj
1aac0 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31 20  c!=2 && objc!=1 
1aad0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1aae0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1aaf0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1ab00 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1ab10 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1ab20 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1ab30 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e 73  filename options
1ab40 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20  -list", 0);.    
1ab50 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ab60 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e 61  ;.  }..  zFilena
1ab70 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f 20 54 63  me = objc>1 ? Tc
1ab80 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1ab90 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 73 71 6c 69  [1]) : 0;.  sqli
1aba0 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e 61  te3_open(zFilena
1abb0 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20 69  me, &db);.  .  i
1abc0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  f( sqlite3TestMa
1abd0 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74  kePointerStr(int
1abe0 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29  erp, zBuf, db) )
1abf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1ac00 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  R;.  Tcl_AppendR
1ac10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
1ac20 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  uf, 0);.  return
1ac30 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1ac40 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1ac50 5f 6f 70 65 6e 5f 76 32 20 46 49 4c 45 4e 41 4d  _open_v2 FILENAM
1ac60 45 20 46 4c 41 47 53 20 56 46 53 0a 2a 2f 0a 73  E FLAGS VFS.*/.s
1ac70 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6f  tatic int test_o
1ac80 70 65 6e 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a  pen_v2(.  void *
1ac90 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1aca0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1acb0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1acc0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1acd0 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e 73  objv[].){.  cons
1ace0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
1acf0 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
1ad00 2a 7a 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61  *zVfs;.  int fla
1ad10 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  gs = 0;.  sqlite
1ad20 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
1ad30 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1ad40 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c 61 67 3b  ];..  int nFlag;
1ad50 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70 46  .  Tcl_Obj **apF
1ad60 6c 61 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  lag;.  int i;.. 
1ad70 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
1ad80 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1ad90 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1ada0 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20  objv, "FILENAME 
1adb0 46 4c 41 47 53 20 56 46 53 22 29 3b 0a 20 20 20  FLAGS VFS");.   
1adc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1add0 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e 61  R;.  }.  zFilena
1ade0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
1adf0 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 7a  ng(objv[1]);.  z
1ae00 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Vfs = Tcl_GetStr
1ae10 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
1ae20 69 66 28 20 7a 56 66 73 5b 30 5d 3d 3d 30 78 30  if( zVfs[0]==0x0
1ae30 30 20 29 20 7a 56 66 73 20 3d 20 30 3b 0a 0a 20  0 ) zVfs = 0;.. 
1ae40 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f 62   rc = Tcl_ListOb
1ae50 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74  jGetElements(int
1ae60 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 6e  erp, objv[2], &n
1ae70 46 6c 61 67 2c 20 26 61 70 46 6c 61 67 29 3b 0a  Flag, &apFlag);.
1ae80 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f 4b    if( rc!=TCL_OK
1ae90 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1aea0 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 6c 61 67  for(i=0; i<nFlag
1aeb0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
1aec0 69 46 6c 61 67 3b 0a 20 20 20 20 73 74 72 75 63  iFlag;.    struc
1aed0 74 20 4f 70 65 6e 46 6c 61 67 20 7b 0a 20 20 20  t OpenFlag {.   
1aee0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1aef0 46 6c 61 67 3b 0a 20 20 20 20 20 20 69 6e 74 20  Flag;.      int 
1af00 66 6c 61 67 3b 0a 20 20 20 20 7d 20 61 46 6c 61  flag;.    } aFla
1af10 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  g[] = {.      { 
1af20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  "SQLITE_OPEN_REA
1af30 44 4f 4e 4c 59 22 2c 20 53 51 4c 49 54 45 5f 4f  DONLY", SQLITE_O
1af40 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a  PEN_READONLY },.
1af50 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1af60 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 22 2c  OPEN_READWRITE",
1af70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
1af80 44 57 52 49 54 45 20 7d 2c 0a 20 20 20 20 20 20  DWRITE },.      
1af90 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  { "SQLITE_OPEN_C
1afa0 52 45 41 54 45 22 2c 20 53 51 4c 49 54 45 5f 4f  REATE", SQLITE_O
1afb0 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
1afc0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1afd0 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
1afe0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ", SQLITE_OPEN_D
1aff0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c 0a  ELETEONCLOSE },.
1b000 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b010 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 22 2c  OPEN_EXCLUSIVE",
1b020 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43   SQLITE_OPEN_EXC
1b030 4c 55 53 49 56 45 20 7d 2c 0a 20 20 20 20 20 20  LUSIVE },.      
1b040 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 41  { "SQLITE_OPEN_A
1b050 55 54 4f 50 52 4f 58 59 22 2c 20 53 51 4c 49 54  UTOPROXY", SQLIT
1b060 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58 59  E_OPEN_AUTOPROXY
1b070 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51 4c   },.      { "SQL
1b080 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
1b090 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
1b0a0 41 49 4e 5f 44 42 20 7d 2c 0a 20 20 20 20 20 20  AIN_DB },.      
1b0b0 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54  { "SQLITE_OPEN_T
1b0c0 45 4d 50 5f 44 42 22 2c 20 53 51 4c 49 54 45 5f  EMP_DB", SQLITE_
1b0d0 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c 0a  OPEN_TEMP_DB },.
1b0e0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b0f0 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
1b100 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  B", SQLITE_OPEN_
1b110 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7d 2c 0a  TRANSIENT_DB },.
1b120 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b130 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
1b140 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L", SQLITE_OPEN_
1b150 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a  MAIN_JOURNAL },.
1b160 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b170 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41  OPEN_TEMP_JOURNA
1b180 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  L", SQLITE_OPEN_
1b190 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a  TEMP_JOURNAL },.
1b1a0 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b1b0 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 22  OPEN_SUBJOURNAL"
1b1c0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55  , SQLITE_OPEN_SU
1b1d0 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20 20  BJOURNAL },.    
1b1e0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b1f0 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 22  _MASTER_JOURNAL"
1b200 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  , SQLITE_OPEN_MA
1b210 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c 0a  STER_JOURNAL },.
1b220 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b230 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20 53  OPEN_NOMUTEX", S
1b240 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
1b250 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53  EX },.      { "S
1b260 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
1b270 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f 50  UTEX", SQLITE_OP
1b280 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7d 2c 0a  EN_FULLMUTEX },.
1b290 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f        { "SQLITE_
1b2a0 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
1b2b0 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ", SQLITE_OPEN_S
1b2c0 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20  HAREDCACHE },.  
1b2d0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1b2e0 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 22  EN_PRIVATECACHE"
1b2f0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  , SQLITE_OPEN_PR
1b300 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20  IVATECACHE },.  
1b310 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50      { "SQLITE_OP
1b320 45 4e 5f 57 41 4c 22 2c 20 53 51 4c 49 54 45 5f  EN_WAL", SQLITE_
1b330 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20 20  OPEN_WAL },.    
1b340 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e    { "SQLITE_OPEN
1b350 5f 55 52 49 22 2c 20 53 51 4c 49 54 45 5f 4f 50  _URI", SQLITE_OP
1b360 45 4e 5f 55 52 49 20 7d 2c 0a 20 20 20 20 20 20  EN_URI },.      
1b370 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b 0a  { 0, 0 }.    };.
1b380 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74      rc = Tcl_Get
1b390 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75  IndexFromObjStru
1b3a0 63 74 28 69 6e 74 65 72 70 2c 20 61 70 46 6c 61  ct(interp, apFla
1b3b0 67 5b 69 5d 2c 20 61 46 6c 61 67 2c 20 73 69 7a  g[i], aFlag, siz
1b3c0 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29 2c 20 0a  eof(aFlag[0]), .
1b3d0 20 20 20 20 20 20 20 20 22 66 6c 61 67 22 2c 20          "flag", 
1b3e0 30 2c 20 26 69 46 6c 61 67 0a 20 20 20 20 29 3b  0, &iFlag.    );
1b3f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43 4c  .    if( rc!=TCL
1b400 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1b410 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 61 46  .    flags |= aF
1b420 6c 61 67 5b 69 46 6c 61 67 5d 2e 66 6c 61 67 3b  lag[iFlag].flag;
1b430 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
1b440 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46 69  ite3_open_v2(zFi
1b450 6c 65 6e 61 6d 65 2c 20 26 64 62 2c 20 66 6c 61  lename, &db, fla
1b460 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 69 66 28  gs, zVfs);.  if(
1b470 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65   sqlite3TestMake
1b480 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72  PointerStr(inter
1b490 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20 72  p, zBuf, db) ) r
1b4a0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1b4b0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
1b4c0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  ult(interp, zBuf
1b4d0 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
1b4e0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b4f0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 6f  Usage: sqlite3_o
1b500 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20 6f  pen16 filename o
1b510 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69 63  ptions.*/.static
1b520 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31 36   int test_open16
1b530 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1b540 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1b550 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1b560 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1b570 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1b580 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
1b590 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
1b5a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
1b5b0 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33  ename;.  sqlite3
1b5c0 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42 75   *db;.  char zBu
1b5d0 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f  f[100];..  if( o
1b5e0 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1b5f0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b600 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1b610 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1b620 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1b630 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1b640 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65 20  0]), " filename 
1b650 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20 30  options-list", 0
1b660 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1b670 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1b680 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f  zFilename = Tcl_
1b690 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
1b6a0 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29 3b  Obj(objv[1], 0);
1b6b0 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  .  sqlite3_open1
1b6c0 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64 62  6(zFilename, &db
1b6d0 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c 69  );.  .  if( sqli
1b6e0 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74  te3TestMakePoint
1b6f0 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42  erStr(interp, zB
1b700 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72 6e  uf, db) ) return
1b710 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1b720 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1b730 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b  nterp, zBuf, 0);
1b740 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1b750 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
1b760 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1b770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1b780 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74   sqlite3_complet
1b790 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72 69  e16 <UTF-16 stri
1b7a0 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ng>.**.** Return
1b7b0 20 31 20 69 66 20 74 68 65 20 73 75 70 70 6c 69   1 if the suppli
1b7c0 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  ed argument is a
1b7d0 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74   complete SQL st
1b7e0 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72 6f  atement, or zero
1b7f0 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  .** otherwise..*
1b800 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1b810 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20 20  t_complete16(.  
1b820 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1b830 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1b840 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1b850 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1b860 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1b870 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
1b880 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54  ITE_OMIT_COMPLET
1b890 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
1b8a0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
1b8b0 29 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b 0a  ).  char *zBuf;.
1b8c0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1b8d0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1b8e0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1b8f0 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31 36  , objv, "<utf-16
1b900 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65 74   sql>");.    ret
1b910 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1b920 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63 68   }..  zBuf = (ch
1b930 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41  ar*)Tcl_GetByteA
1b940 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  rrayFromObj(objv
1b950 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53  [1], 0);.  Tcl_S
1b960 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1b970 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1b980 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  j(sqlite3_comple
1b990 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23 65  te16(zBuf)));.#e
1b9a0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1b9b0 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26 20  MIT_COMPLETE && 
1b9c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1b9d0 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54 43  6 */.  return TC
1b9e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1b9f0 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73 74  sage: sqlite3_st
1ba00 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41 64  ep STMT.**.** Ad
1ba10 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65 6d  vance the statem
1ba20 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ent to the next 
1ba30 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  row..*/.static i
1ba40 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20 20  nt test_step(.  
1ba50 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1ba60 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1ba70 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1ba80 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1ba90 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1baa0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1bab0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
1bac0 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1bad0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1bae0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1baf0 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1bb00 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1bb10 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1bb20 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1bb30 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72  STMT", 0);.    r
1bb40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bb50 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1bb60 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1bb70 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1bb80 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1bb90 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1bba0 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1bbb0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1bbc0 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63 21  );..  /* if( rc!
1bbd0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26 20  =SQLITE_DONE && 
1bbe0 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc!=SQLITE_ROW )
1bbf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1bc00 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74 52  R; */.  Tcl_SetR
1bc10 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1bc20 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1bc30 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74  e(rc), 0);.  ret
1bc40 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73  urn TCL_OK;.}..s
1bc50 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
1bc60 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ql(.  void * cli
1bc70 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
1bc80 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
1bc90 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
1bca0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
1bcb0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
1bcc0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20  stmt *pStmt;..  
1bcd0 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
1bce0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1bcf0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1bd00 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20 20  bjv, "STMT");.  
1bd10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1bd20 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1bd30 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1bd40 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1bd50 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1bd60 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1bd70 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
1bd80 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1bd90 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
1bda0 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20 54 43  3_sql(pStmt), TC
1bdb0 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 72  L_VOLATILE);.  r
1bdc0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1bdd0 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1bde0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
1bdf0 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52  nt STMT .**.** R
1be00 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
1be10 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75   of columns retu
1be20 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c 20  rned by the sql 
1be30 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a  statement STMT..
1be40 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1be50 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  st_column_count(
1be60 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1be70 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1be80 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1be90 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1bea0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1beb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1bec0 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28  t *pStmt;..  if(
1bed0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
1bee0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1bef0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1bf00 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1bf10 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1bf20 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1bf30 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1bf40 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1bf50 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1bf60 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1bf70 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1bf80 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1bf90 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1bfa0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1bfb0 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
1bfc0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1bfd0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1bfe0 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
1bff0 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a  count(pStmt)));.
1c000 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1c010 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1c020 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1c030 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  type STMT column
1c040 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  .**.** Return th
1c050 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 64 61  e type of the da
1c060 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f  ta in column 'co
1c070 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75 72  lumn' of the cur
1c080 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61  rent row..*/.sta
1c090 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1c0a0 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69 64  umn_type(.  void
1c0b0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c0c0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c0d0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1c0e0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1c0f0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1c100 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1c110 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1c120 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20 6f  int tp;..  if( o
1c130 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1c140 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1c150 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1c160 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1c170 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1c180 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1c190 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1c1a0 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1c1b0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c1c0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1c1d0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1c1e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1c1f0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1c200 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1c210 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1c220 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1c230 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1c240 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1c250 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d 20  _ERROR;..  tp = 
1c260 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1c270 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29 3b  ype(pStmt, col);
1c280 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29 7b  .  switch( tp ){
1c290 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1c2a0 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20 20  _INTEGER: .     
1c2b0 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69   Tcl_SetResult(i
1c2c0 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52 22  nterp, "INTEGER"
1c2d0 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a  , TCL_STATIC); .
1c2e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1c2f0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c   case SQLITE_NUL
1c300 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74  L:.      Tcl_Set
1c310 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1c320 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54 49  NULL", TCL_STATI
1c330 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61 6b  C); .      break
1c340 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
1c350 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 54  E_FLOAT:.      T
1c360 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1c370 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54 43  erp, "FLOAT", TC
1c380 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20 20  L_STATIC); .    
1c390 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1c3a0 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a 20  e SQLITE_TEXT:. 
1c3b0 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
1c3c0 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58 54  lt(interp, "TEXT
1c3d0 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1c3e0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1c3f0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
1c400 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  OB:.      Tcl_Se
1c410 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1c420 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41 54  "BLOB", TCL_STAT
1c430 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1c440 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  k;.    default:.
1c450 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29 3b        assert(0);
1c460 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54  .  }..  return T
1c470 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1c480 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1c490 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d 54  olumn_int64 STMT
1c4a0 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
1c4b0 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
1c4c0 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
1c4d0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1c4e0 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a 2a  row cast as an.*
1c4f0 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29 20  * wide (64-bit) 
1c500 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74  integer..*/.stat
1c510 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75  ic int test_colu
1c520 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69 64  mn_int64(.  void
1c530 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1c540 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1c550 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1c560 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1c570 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
1c580 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1c590 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20  t;.  int col;.  
1c5a0 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66 28  i64 iVal;..  if(
1c5b0 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1c5c0 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1c5d0 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1c5e0 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1c5f0 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1c600 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1c610 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1c620 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1c630 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c640 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1c650 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1c660 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1c670 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1c680 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1c690 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1c6a0 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1c6b0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1c6c0 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1c6d0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56 61  CL_ERROR;..  iVa
1c6e0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1c6f0 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  mn_int64(pStmt, 
1c700 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  col);.  Tcl_SetO
1c710 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1c720 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f   Tcl_NewWideIntO
1c730 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(iVal));.  ret
1c740 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1c750 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1c760 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  te3_column_blob 
1c770 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73  STMT column.*/.s
1c780 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
1c790 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76 6f  olumn_blob(.  vo
1c7a0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c7b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c7c0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c7d0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c7e0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1c7f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1c800 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1c810 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63 6f  .  int len;.  co
1c820 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 3b  nst void *pBlob;
1c830 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20  ..  if( objc!=3 
1c840 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1c850 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1c860 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1c870 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
1c880 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
1c890 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
1c8a0 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29  STMT column", 0)
1c8b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1c8c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
1c8d0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
1c8e0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
1c8f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
1c900 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
1c910 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1c920 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
1c930 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
1c940 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72  jv[2], &col) ) r
1c950 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1c960 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74 65  ..  len = sqlite
1c970 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
1c980 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70 42  Stmt, col);.  pB
1c990 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
1c9a0 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  lumn_blob(pStmt,
1c9b0 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
1c9c0 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1c9d0 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  , Tcl_NewByteArr
1c9e0 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65 6e  ayObj(pBlob, len
1c9f0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1ca00 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1ca10 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1ca20 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54 20  umn_double STMT 
1ca30 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65 74  column.**.** Ret
1ca40 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e 20  urn the data in 
1ca50 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27 20  column 'column' 
1ca60 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 72  of the current r
1ca70 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f 75  ow cast as a dou
1ca80 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
1ca90 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64  nt test_column_d
1caa0 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
1cab0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1cac0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1cad0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1cae0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1caf0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1cb00 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
1cb10 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f 75    int col;.  dou
1cb20 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66 28  ble rVal;..  if(
1cb30 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
1cb40 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1cb50 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
1cb60 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
1cb70 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54  e \"", .       T
1cb80 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1cb90 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f  v[0]), " STMT co
1cba0 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72  lumn", 0);.    r
1cbb0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1cbc0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
1cbd0 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
1cbe0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
1cbf0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
1cc00 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
1cc10 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c  ERROR;.  if( Tcl
1cc20 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
1cc30 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20  nterp, objv[2], 
1cc40 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54  &col) ) return T
1cc50 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56 61  CL_ERROR;..  rVa
1cc60 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  l = sqlite3_colu
1cc70 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74 2c  mn_double(pStmt,
1cc80 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
1cc90 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1cca0 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65 4f  , Tcl_NewDoubleO
1ccb0 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65 74  bj(rVal));.  ret
1ccc0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1ccd0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
1cce0 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20 53  te3_data_count S
1ccf0 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  TMT .**.** Retur
1cd00 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
1cd10 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65 64  columns returned
1cd20 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61 74   by the sql stat
1cd30 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a 73  ement STMT..*/.s
1cd40 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 64  tatic int test_d
1cd50 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69  ata_count(.  voi
1cd60 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1cd70 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1cd80 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1cd90 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1cda0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1cdb0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1cdc0 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  mt;..  if( objc!
1cdd0 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1cde0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1cdf0 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1ce00 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1ce10 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1ce20 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1ce30 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1ce40 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1ce50 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1ce60 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1ce70 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1ce80 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1ce90 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1cea0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1ceb0 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ..  Tcl_SetObjRe
1cec0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
1ced0 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
1cee0 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70 53  e3_data_count(pS
1cef0 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72 6e  tmt)));.  return
1cf00 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1cf10 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1cf20 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54 4d  _column_text STM
1cf30 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1cf40 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1cf50 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53 54  lumn_decltype ST
1cf60 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1cf70 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1cf80 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54 20  olumn_name STMT 
1cf90 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69 63  column.*/.static
1cfa0 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 75   int test_stmt_u
1cfb0 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tf8(.  void * cl
1cfc0 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20 20  ientData,       
1cfd0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
1cfe0 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74 69  QLite API functi
1cff0 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 20  on to be invoke 
1d000 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
1d010 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1d020 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1d030 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1d040 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1d050 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c  pStmt;.  int col
1d060 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1d070 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
1d080 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20 20  _stmt*, int);.  
1d090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65 74  const char *zRet
1d0a0 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63 6f  ;..  xFunc = (co
1d0b0 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28 73 71  nst char *(*)(sq
1d0c0 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e 74  lite3_stmt*, int
1d0d0 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20  ))clientData;.  
1d0e0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1d0f0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1d100 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1d110 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d120 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20  d be \"", .     
1d130 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28    Tcl_GetString(
1d140 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54  objv[0]), " STMT
1d150 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20   column", 0);.  
1d160 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1d170 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67  OR;.  }..  if( g
1d180 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
1d190 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
1d1a0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
1d1b0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
1d1c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
1d1d0 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
1d1e0 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32  j(interp, objv[2
1d1f0 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72  ], &col) ) retur
1d200 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
1d210 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74 6d  Ret = xFunc(pStm
1d220 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20 7a  t, col);.  if( z
1d230 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53  Ret ){.    Tcl_S
1d240 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1d250 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20 30   (char *)zRet, 0
1d260 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d270 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69  TCL_OK;.}..stati
1d280 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62 61  c int test_globa
1d290 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f 69  l_recover(.  voi
1d2a0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1d2b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1d2c0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1d2d0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1d2e0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1d2f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d300 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 69 6e  _DEPRECATED.  in
1d310 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a 63  t rc;.  if( objc
1d320 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=1 ){.    Tcl_W
1d330 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
1d340 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22 29  rp, 1, objv, "")
1d350 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1d360 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63  _ERROR;.  }.  rc
1d370 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61   = sqlite3_globa
1d380 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20 54  l_recover();.  T
1d390 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
1d3a0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
1d3b0 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
1d3c0 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64 69  L_STATIC);.#endi
1d3d0 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
1d3e0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1d3f0 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d400 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c 75  n_text STMT colu
1d410 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  mn.**.** Usage: 
1d420 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
1d430 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f 6c  ecltype STMT col
1d440 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1d450 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d460 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d 6e  name STMT column
1d470 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1d480 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28 0a  est_stmt_utf16(.
1d490 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1d4a0 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69 6e  ata,     /* Poin
1d4b0 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41 50  ter to SQLite AP
1d4c0 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65  I function to be
1d4d0 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54 63   invoked */.  Tc
1d4e0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d4f0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1d500 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1d510 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
1d520 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1d530 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  16.  sqlite3_stm
1d540 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
1d550 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  col;.  Tcl_Obj *
1d560 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76 6f  pRet;.  const vo
1d570 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20 63  id *zName16;.  c
1d580 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46 75  onst void *(*xFu
1d590 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d 74  nc)(sqlite3_stmt
1d5a0 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75 6e  *, int);..  xFun
1d5b0 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 20  c = (const void 
1d5c0 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  *(*)(sqlite3_stm
1d5d0 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74 44  t*, int))clientD
1d5e0 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  ata;.  if( objc!
1d5f0 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
1d600 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1d610 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1d620 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1d630 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74   .       Tcl_Get
1d640 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c  String(objv[0]),
1d650 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c   " STMT column",
1d660 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1d670 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
1d680 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
1d690 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
1d6a0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d6b0 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
1d6c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1d6d0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
1d6e0 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
1d6f0 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20   objv[2], &col) 
1d700 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d710 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20 3d  OR;..  zName16 =
1d720 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f   xFunc(pStmt, co
1d730 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 31  l);.  if( zName1
1d740 36 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a  6 ){.    int n;.
1d750 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1d760 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20 20 20  z = zName16;.   
1d770 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20 7c   for(n=0; z[n] |
1d780 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29 7b  | z[n+1]; n+=2){
1d790 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63 6c  }.    pRet = Tcl
1d7a0 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62 6a  _NewByteArrayObj
1d7b0 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32 29 3b 0a  (zName16, n+2);.
1d7c0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
1d7d0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52 65  sult(interp, pRe
1d7e0 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f  t);.  }.#endif /
1d7f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
1d800 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e  F16 */..  return
1d810 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
1d820 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
1d830 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d 54  _column_int STMT
1d840 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73   column.**.** Us
1d850 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c  age: sqlite3_col
1d860 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20 63  umn_bytes STMT c
1d870 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67  olumn.**.** Usag
1d880 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  e: sqlite3_colum
1d890 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20 63  n_bytes16 STMT c
1d8a0 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  olumn.**.*/.stat
1d8b0 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74  ic int test_stmt
1d8c0 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20 63  _int(.  void * c
1d8d0 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f 2a  lientData,    /*
1d8e0 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c 69   Pointer to SQLi
1d8f0 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 20  te API function 
1d900 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a 2f  to be invoked */
1d910 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1d920 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1d930 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1d940 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1d950 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1d960 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a  tmt;.  int col;.
1d970 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 73    int (*xFunc)(s
1d980 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1d990 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28  t);..  xFunc = (
1d9a0 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65 33 5f  int (*)(sqlite3_
1d9b0 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65  stmt*, int))clie
1d9c0 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62  ntData;.  if( ob
1d9d0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1d9e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1d9f0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1da00 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1da10 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
1da20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
1da30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d  ]), " STMT colum
1da40 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  n", 0);.    retu
1da50 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1da60 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74  }..  if( getStmt
1da70 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
1da80 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1da90 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20  jv[1]), &pStmt) 
1daa0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1dab0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
1dac0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
1dad0 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f  rp, objv[2], &co
1dae0 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  l) ) return TCL_
1daf0 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53 65  ERROR;..  Tcl_Se
1db00 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1db10 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
1db20 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63 6f  (xFunc(pStmt, co
1db30 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  l)));.  return T
1db40 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1db50 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f 73  Usage:  sqlite_s
1db60 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d 41  et_magic  DB  MA
1db70 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a 2a  GIC-NUMBER.**.**
1db80 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61 67   Set the db->mag
1db90 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73 20  ic value.  This 
1dba0 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20  is used to test 
1dbb0 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20 6c  error recovery l
1dbc0 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ogic..*/.static 
1dbd0 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f 6d  int sqlite_set_m
1dbe0 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20 63  agic(.  void * c
1dbf0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1dc00 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1dc10 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63  .  int argc,.  c
1dc20 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  har **argv.){.  
1dc30 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1dc40 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
1dc50 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1dc60 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1dc70 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1dc80 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1dc90 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42 20  ,.         " DB 
1dca0 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20 20  MAGIC", 0);.    
1dcb0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1dcc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1dcd0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1dce0 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
1dcf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1dd00 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  R;.  if( strcmp(
1dd10 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54 45  argv[2], "SQLITE
1dd20 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d 30  _MAGIC_OPEN")==0
1dd30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
1dd40 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
1dd50 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20 69  _OPEN;.  }else i
1dd60 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32  f( strcmp(argv[2
1dd70 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43  ], "SQLITE_MAGIC
1dd80 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b 0a  _CLOSED")==0 ){.
1dd90 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
1dda0 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f  SQLITE_MAGIC_CLO
1ddb0 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  SED;.  }else if(
1ddc0 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d 2c   strcmp(argv[2],
1ddd0 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42   "SQLITE_MAGIC_B
1dde0 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  USY")==0 ){.    
1ddf0 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
1de00 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20  TE_MAGIC_BUSY;. 
1de10 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
1de20 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49  p(argv[2], "SQLI
1de30 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22 29  TE_MAGIC_ERROR")
1de40 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  ==0 ){.    db->m
1de50 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
1de60 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65 6c  GIC_ERROR;.  }el
1de70 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  se if( Tcl_GetIn
1de80 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
1de90 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d 61  ], (int*)&db->ma
1dea0 67 69 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gic) ){.    retu
1deb0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1dec0 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  }.  return TCL_O
1ded0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1dee0 65 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  e:  sqlite3_inte
1def0 72 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a 2a  rrupt  DB .**.**
1df00 20 54 72 69 67 67 65 72 20 61 6e 20 69 6e 74 65   Trigger an inte
1df10 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a 73  rrupt on DB.*/.s
1df20 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 69  tatic int test_i
1df30 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69 64  nterrupt(.  void
1df40 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1df50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1df60 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1df70 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1df80 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1df90 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1dfa0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1dfb0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1dfc0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1dfd0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1dfe0 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29 3b  v[0], " DB", 0);
1dff0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1e000 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
1e010 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
1e020 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
1e030 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
1e040 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65  _ERROR;.  sqlite
1e050 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29 3b  3_interrupt(db);
1e060 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1e070 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20 2a  ;.}..static u8 *
1e080 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1e090 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a 0a  seline = 0;../*.
1e0a0 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73 74 61 63  ** Fill the stac
1e0b0 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20 62  k with a known b
1e0c0 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73 74  itpattern..*/.st
1e0d0 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 53 74  atic void prepSt
1e0e0 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e 74  ack(void){.  int
1e0f0 20 69 3b 0a 20 20 75 33 32 20 62 69 67 42 75 66   i;.  u32 bigBuf
1e100 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28 69  [65536];.  for(i
1e110 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69 67  =0; i<sizeof(big
1e120 42 75 66 29 2f 73 69 7a 65 6f 66 28 62 69 67 42  Buf)/sizeof(bigB
1e130 75 66 5b 30 5d 29 3b 20 69 2b 2b 29 20 62 69 67  uf[0]); i++) big
1e140 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61 64 62  Buf[i] = 0xdeadb
1e150 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  eef;.  sqlite3_s
1e160 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d 20  tack_baseline = 
1e170 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36 35 35  (u8*)&bigBuf[655
1e180 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  36];.}../*.** Ge
1e190 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  t the current st
1e1a0 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73 65 64  ack depth.  Used
1e1b0 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20 6f   for debugging o
1e1c0 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c 69  nly..*/.u64 sqli
1e1d0 74 65 33 53 74 61 63 6b 44 65 70 74 68 28 76 6f  te3StackDepth(vo
1e1e0 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20 72  id){.  u8 x;.  r
1e1f0 65 74 75 72 6e 20 28 75 36 34 29 28 73 71 6c 69  eturn (u64)(sqli
1e200 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c 69  te3_stack_baseli
1e210 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a 0a  ne - &x);.}../*.
1e220 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
1e230 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20 44 42  e3_stack_used DB
1e240 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74   SQL.**.** Try t
1e250 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 61 6d  o measure the am
1e260 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73 70  ount of stack sp
1e270 61 63 65 20 75 73 65 64 20 62 79 20 61 20 63 61  ace used by a ca
1e280 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
1e290 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ec.*/.static int
1e2a0 20 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65 64   test_stack_used
1e2b0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1e2c0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1e2d0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1e2e0 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72 20  nt argc,.  char 
1e2f0 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c 69  **argv.){.  sqli
1e300 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 69  te3 *db;.  int i
1e310 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
1e320 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1e330 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1e340 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1e350 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1e360 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 20  gv[0], .        
1e370 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20  " DB SQL", 0);. 
1e380 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e390 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1e3a0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1e3b0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1e3c0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e3d0 52 52 4f 52 3b 0a 20 20 70 72 65 70 53 74 61 63  RROR;.  prepStac
1e3e0 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  k();.  (void)sql
1e3f0 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72  ite3_exec(db, ar
1e400 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29 3b  gv[2], 0, 0, 0);
1e410 0a 20 20 66 6f 72 28 69 3d 36 35 35 33 35 3b 20  .  for(i=65535; 
1e420 69 3e 3d 30 20 26 26 20 28 28 75 33 32 2a 29 73  i>=0 && ((u32*)s
1e430 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73  qlite3_stack_bas
1e440 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64 65  eline)[-i]==0xde
1e450 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a 20  adbeef; i--){}. 
1e460 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1e470 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1e480 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a 20  wIntObj(i*4));. 
1e490 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1e4a0 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1e4b0 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75  sqlite_delete_fu
1e4c0 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e 63 74 69  nction DB functi
1e4d0 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44 65  on-name.**.** De
1e4e0 6c 65 74 65 20 74 68 65 20 75 73 65 72 20 66 75  lete the user fu
1e4f0 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f 6e  nction 'function
1e500 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74 61  -name' from data
1e510 62 61 73 65 20 68 61 6e 64 6c 65 20 44 42 2e 20  base handle DB. 
1e520 49 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65 64  It.** is assumed
1e530 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20 66   that the user f
1e540 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65 61  unction was crea
1e550 74 65 64 20 61 73 20 55 54 46 38 2c 20 61 6e 79  ted as UTF8, any
1e560 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61 72   number of.** ar
1e570 67 75 6d 65 6e 74 73 20 28 74 68 65 20 77 61 79  guments (the way
1e580 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61   the TCL interfa
1e590 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f 0a  ce does it)..*/.
1e5a0 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65 74  static int delet
1e5b0 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76 6f  e_function(.  vo
1e5c0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1e5d0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1e5e0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67  nterp,.  int arg
1e5f0 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  c,.  char **argv
1e600 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
1e610 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1e620 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
1e630 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
1e640 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
1e650 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
1e660 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
1e670 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42 20  , .        " DB 
1e680 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20  function-name", 
1e690 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1e6a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1e6b0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1e6c0 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
1e6d0 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
1e6e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
1e6f0 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
1e700 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72  _function(db, ar
1e710 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[2], -1, SQLIT
1e720 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30 2c  E_UTF8, 0, 0, 0,
1e730 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65   0);.  Tcl_SetRe
1e740 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
1e750 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
1e760 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
1e770 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1e780 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1e790 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65 74  ge: sqlite_delet
1e7a0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20 63  e_collation DB c
1e7b0 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a  ollation-name.**
1e7c0 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 63  .** Delete the c
1e7d0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1e7e0 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d  e 'collation-nam
1e7f0 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73 65  e' from database
1e800 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e 20   handle .** DB. 
1e810 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74 68  It is assumed th
1e820 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e  at the collation
1e830 20 73 65 71 75 65 6e 63 65 20 77 61 73 20 63 72   sequence was cr
1e840 65 61 74 65 64 20 61 73 20 55 54 46 38 20 28 74  eated as UTF8 (t
1e850 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65 20 54  he .** way the T
1e860 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f 65  CL interface doe
1e870 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  s it)..*/.static
1e880 20 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c 6c   int delete_coll
1e890 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 20  ation(.  void * 
1e8a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1e8b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1e8c0 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1e8d0 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1e8e0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
1e8f0 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72  e3 *db;.  if( ar
1e900 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=3 ){.    Tcl
1e910 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1e920 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1e930 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1e940 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20  "", argv[0], .  
1e950 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63 74        " DB funct
1e960 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a 20  ion-name", 0);. 
1e970 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e980 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1e990 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1e9a0 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1e9b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e9c0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1e9d0 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
1e9e0 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b 32  ation(db, argv[2
1e9f0 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ], SQLITE_UTF8, 
1ea00 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74  0, 0);.  Tcl_Set
1ea10 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1ea20 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
1ea30 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54  me(rc), TCL_STAT
1ea40 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  IC);.  return TC
1ea50 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1ea60 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67 65  sage: sqlite3_ge
1ea70 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42 0a  t_autocommit DB.
1ea80 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  **.** Return tru
1ea90 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73  e if the databas
1eaa0 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74 6c  e DB is currentl
1eab0 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69 74  y in auto-commit
1eac0 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72 6e   mode..** Return
1ead0 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a 2a   false if not..*
1eae0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65 74  /.static int get
1eaf0 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20 76  _autocommit(.  v
1eb00 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1eb10 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1eb20 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1eb30 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1eb40 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75 66  v.){.  char zBuf
1eb50 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 20  [30];.  sqlite3 
1eb60 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21  *db;.  if( argc!
1eb70 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =2 ){.    Tcl_Ap
1eb80 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1eb90 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
1eba0 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
1ebb0 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20   argv[0], .     
1ebc0 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20     " DB", 0);.  
1ebd0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1ebe0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
1ebf0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
1ec00 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
1ec10 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1ec20 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ROR;.  sprintf(z
1ec30 42 75 66 2c 20 22 25 64 22 2c 20 73 71 6c 69 74  Buf, "%d", sqlit
1ec40 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  e3_get_autocommi
1ec50 74 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41 70  t(db));.  Tcl_Ap
1ec60 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
1ec70 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20 72  p, zBuf, 0);.  r
1ec80 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
1ec90 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
1eca0 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f  lite3_busy_timeo
1ecb0 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20 53  ut DB MS.**.** S
1ecc0 65 74 20 74 68 65 20 62 75 73 79 20 74 69 6d 65  et the busy time
1ecd0 6f 75 74 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  out.  This is mo
1ece0 72 65 20 65 61 73 69 6c 79 20 64 6f 6e 65 20 75  re easily done u
1ecf0 73 69 6e 67 20 74 68 65 20 74 69 6d 65 6f 75 74  sing the timeout
1ed00 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74 68  .** method of th
1ed10 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65 2e  e TCL interface.
1ed20 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 61 20    But we need a 
1ed30 77 61 79 20 74 6f 20 74 65 73 74 20 74 68 65 20  way to test the 
1ed40 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 69 74  case.** where it
1ed50 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1ed60 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74 69  MISUSE..*/.stati
1ed70 63 20 69 6e 74 20 74 65 73 74 5f 62 75 73 79 5f  c int test_busy_
1ed80 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f 69 64 20  timeout(.  void 
1ed90 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1eda0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1edb0 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a  rp,.  int argc,.
1edc0 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b    char **argv.){
1edd0 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73 3b 0a 20  .  int rc, ms;. 
1ede0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1edf0 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1ee00 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1ee10 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1ee20 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1ee30 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1ee40 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1ee50 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
1ee60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1ee70 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
1ee80 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
1ee90 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
1eea0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1eeb0 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69  if( Tcl_GetInt(i
1eec0 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c 20  nterp, argv[2], 
1eed0 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  &ms) ) return TC
1eee0 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
1eef0 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
1ef00 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b 0a 20 20  eout(db, ms);.  
1ef10 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1ef20 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
1ef30 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29 3b  ErrName(rc), 0);
1ef40 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1ef50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1ef60 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f  :  tcl_variable_
1ef70 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41 4d  type VARIABLENAM
1ef80 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  E.**.** Return t
1ef90 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 69  he name of the i
1efa0 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e  nternal represen
1efb0 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a 2a  tation for the.*
1efc0 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 67  * value of the g
1efd0 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a 2a  iven variable..*
1efe0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63 6c  /.static int tcl
1eff0 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28 0a  _variable_type(.
1f000 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f010 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f020 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1f030 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1f040 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1f050 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56 61  {.  Tcl_Obj *pVa
1f060 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  r;.  if( objc!=2
1f070 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1f080 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1f090 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49 41   1, objv, "VARIA
1f0a0 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  BLE");.    retur
1f0b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f0c0 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47 65  .  pVar = Tcl_Ge
1f0d0 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c 20  tVar2Ex(interp, 
1f0e0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1f0f0 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f 4c  jv[1]), 0, TCL_L
1f100 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a 20  EAVE_ERR_MSG);. 
1f110 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20 72   if( pVar==0 ) r
1f120 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
1f130 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79 70  .  if( pVar->typ
1f140 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ePtr ){.    Tcl_
1f150 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1f160 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  erp, Tcl_NewStri
1f170 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70 65  ngObj(pVar->type
1f180 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29 3b  Ptr->name, -1));
1f190 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
1f1a0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1f1b0 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 72  sage:  sqlite3_r
1f1c0 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f 4e  elease_memory ?N
1f1d0 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ?.**.** Attempt 
1f1e0 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
1f1f0 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64  y currently held
1f200 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c 6c   but not actuall
1f210 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20 54  y required..** T
1f220 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73 20  he integer N is 
1f230 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1f240 74 65 73 20 77 65 20 61 72 65 20 74 72 79 69 6e  tes we are tryin
1f250 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20 54  g to release.  T
1f260 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76 61  he .** return va
1f270 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75 6e  lue is the amoun
1f280 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74 75  t of memory actu
1f290 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a 2a  ally released..*
1f2a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1f2b0 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  t_release_memory
1f2c0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1f2d0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1f2e0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1f2f0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1f300 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1f310 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .){.#if defined(
1f320 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1f330 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 29  MORY_MANAGEMENT)
1f340 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
1f350 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 29  ITE_OMIT_DISKIO)
1f360 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74 20  .  int N;.  int 
1f370 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21  amt;.  if( objc!
1f380 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =1 && objc!=2 ){
1f390 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1f3a0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1f3b0 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a 20   objv, "?N?");. 
1f3c0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1f3d0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
1f3e0 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69 66  bjc==2 ){.    if
1f3f0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
1f400 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
1f410 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75 72  [1], &N) ) retur
1f420 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
1f430 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d 31  else{.    N = -1
1f440 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73 71  ;.  }.  amt = sq
1f450 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
1f460 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f 53  mory(N);.  Tcl_S
1f470 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1f480 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1f490 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66 0a  j(amt));.#endif.
1f4a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1f4b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
1f4c0 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  :  sqlite3_db_re
1f4d0 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42 0a  lease_memory DB.
1f4e0 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  **.** Attempt to
1f4f0 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   release memory 
1f500 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 62  currently held b
1f510 79 20 64 61 74 61 62 61 73 65 20 44 42 2e 20 20  y database DB.  
1f520 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72 65  Return the.** re
1f530 73 75 6c 74 20 63 6f 64 65 20 28 77 68 69 63 68  sult code (which
1f540 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
1f550 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 69  implementation i
1f560 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e 0a  s always zero)..
1f570 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1f580 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d 65  st_db_release_me
1f590 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20 63  mory(.  void * c
1f5a0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1f5b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1f5c0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1f5d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1f5e0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1f5f0 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
1f600 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
1f610 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1f620 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1f630 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a 20  , objv, "DB");. 
1f640 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1f650 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1f660 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1f670 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1f680 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
1f690 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1f6a0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
1f6b0 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
1f6c0 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 54 63 6c  emory(db);.  Tcl
1f6d0 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1f6e0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
1f6f0 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75  Obj(rc));.  retu
1f700 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
1f710 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1f720 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 20  te3_db_filename 
1f730 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20  DB DBNAME.**.** 
1f740 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65 20  Return the name 
1f750 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63 69  of a file associ
1f760 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
1f770 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
1f780 69 6e 74 20 74 65 73 74 5f 64 62 5f 66 69 6c 65  int test_db_file
1f790 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  name(.  void * c
1f7a0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
1f7b0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
1f7c0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
1f7d0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
1f7e0 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
1f7f0 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
1f800 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20 20  har *zDbName;.  
1f810 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
1f820 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
1f830 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
1f840 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 22  bjv, "DB DBNAME"
1f850 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1f860 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1f870 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
1f880 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
1f890 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
1f8a0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1f8b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e 61  L_ERROR;.  zDbNa
1f8c0 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
1f8d0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 54  ng(objv[2]);.  T
1f8e0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1f8f0 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f  interp, sqlite3_
1f900 64 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c 20  db_filename(db, 
1f910 7a 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64 2a  zDbName), (void*
1f920 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  )0);.  return TC
1f930 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1f940 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 64  sage:  sqlite3_d
1f950 62 5f 72 65 61 64 6f 6e 6c 79 20 44 42 20 44 42  b_readonly DB DB
1f960 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  NAME.**.** Retur
1f970 6e 20 31 20 6f 72 20 30 20 69 66 20 44 42 4e 41  n 1 or 0 if DBNA
1f980 4d 45 20 69 73 20 72 65 61 64 6f 6e 6c 79 20 6f  ME is readonly o
1f990 72 20 6e 6f 74 2e 20 20 52 65 74 75 72 6e 20 2d  r not.  Return -
1f9a0 31 20 69 66 20 44 42 4e 41 4d 45 20 64 6f 65 73  1 if DBNAME does
1f9b0 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a  .** not exist..*
1f9c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
1f9d0 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 0a 20  t_db_readonly(. 
1f9e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1f9f0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1fa00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1fa10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1fa20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1fa30 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
1fa40 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
1fa50 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62 6a  bName;.  if( obj
1fa60 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
1fa70 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1fa80 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
1fa90 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20 20  B DBNAME");.    
1faa0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1fab0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1fac0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1fad0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1fae0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1faf0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1fb00 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63  ;.  zDbName = Tc
1fb10 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1fb20 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  [2]);.  Tcl_SetO
1fb30 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
1fb40 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
1fb50 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e  qlite3_db_readon
1fb60 6c 79 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 29  ly(db, zDbName))
1fb70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1fb80 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1fb90 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f 66  ge:  sqlite3_sof
1fba0 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e 3f  t_heap_limit ?N?
1fbb0 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72 20  .**.** Query or 
1fbc0 73 65 74 20 74 68 65 20 73 6f 66 74 20 68 65 61  set the soft hea
1fbd0 70 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65 20  p limit for the 
1fbe0 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e 20  current thread. 
1fbf0 20 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69 73   The.** limit is
1fc00 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69 66   only changed if
1fc10 20 74 68 65 20 4e 20 69 73 20 70 72 65 73 65 6e   the N is presen
1fc20 74 2e 20 20 54 68 65 20 70 72 65 76 69 6f 75 73  t.  The previous
1fc30 20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65 74   limit.** is ret
1fc40 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
1fc50 20 69 6e 74 20 74 65 73 74 5f 73 6f 66 74 5f 68   int test_soft_h
1fc60 65 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f 69  eap_limit(.  voi
1fc70 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1fc80 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1fc90 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1fca0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1fcb0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1fcc0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6d 74  qlite3_int64 amt
1fcd0 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20  ;.  Tcl_WideInt 
1fce0 4e 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 6f 62  N = -1;.  if( ob
1fcf0 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32  jc!=1 && objc!=2
1fd00 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
1fd10 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
1fd20 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29   1, objv, "?N?")
1fd30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1fd40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1fd50 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20  ( objc==2 ){.   
1fd60 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64 65   if( Tcl_GetWide
1fd70 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
1fd80 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29 20  p, objv[1], &N) 
1fd90 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1fda0 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20  OR;.  }.  amt = 
1fdb0 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65 61  sqlite3_soft_hea
1fdc0 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20 20  p_limit64(N);.  
1fdd0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
1fde0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
1fdf0 57 69 64 65 49 6e 74 4f 62 6a 28 61 6d 74 29 29  WideIntObj(amt))
1fe00 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1fe10 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1fe20 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 74 68 72  e:   sqlite3_thr
1fe30 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a 2a 0a 2a  ead_cleanup.**.*
1fe40 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69 74  * Call the sqlit
1fe50 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
1fe60 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63  p API..*/.static
1fe70 20 69 6e 74 20 74 65 73 74 5f 74 68 72 65 61 64   int test_thread
1fe80 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76 6f 69 64  _cleanup(.  void
1fe90 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1fea0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1feb0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
1fec0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
1fed0 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e  T objv[].){.#ifn
1fee0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1fef0 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71 6c  DEPRECATED.  sql
1ff00 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
1ff10 6e 75 70 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  nup();.#endif.  
1ff20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ff30 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
1ff40 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72   sqlite3_pager_r
1ff50 65 66 63 6f 75 6e 74 73 20 20 44 42 0a 2a 2a 0a  efcounts  DB.**.
1ff60 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74  ** Return a list
1ff70 20 6f 66 20 6e 75 6d 62 65 72 73 20 77 68 69 63   of numbers whic
1ff80 68 20 61 72 65 20 74 68 65 20 50 61 67 65 72 52  h are the PagerR
1ff90 65 66 63 6f 75 6e 74 20 66 6f 72 20 61 6c 6c 0a  efcount for all.
1ffa0 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20 65 61 63  ** pagers on eac
1ffb0 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  h database conne
1ffc0 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ction..*/.static
1ffd0 20 69 6e 74 20 74 65 73 74 5f 70 61 67 65 72 5f   int test_pager_
1ffe0 72 65 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f 69  refcounts(.  voi
1fff0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
20000 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
20010 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
20020 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
20030 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
20040 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
20050 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a 61  t i;.  int v, *a
20060 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65  ;.  Tcl_Obj *pRe
20070 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  sult;..  if( obj
20080 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
20090 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
200a0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
200b0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
200c0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
200d0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
200e0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
200f0 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
20100 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20110 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
20120 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
20130 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
20140 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
20150 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
20160 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e 65  pResult = Tcl_Ne
20170 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69 3d  wObj();.  for(i=
20180 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
20190 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
201a0 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29 7b  aDb[i].pBt==0 ){
201b0 0a 20 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a 20  .      v = -1;. 
201c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
201d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
201e0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
201f0 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65        a = sqlite
20200 33 50 61 67 65 72 53 74 61 74 73 28 73 71 6c 69  3PagerStats(sqli
20210 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
20220 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b 0a  ->aDb[i].pBt));.
20230 20 20 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b 0a        v = a[0];.
20240 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
20250 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
20260 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tex);.    }.    
20270 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
20280 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65 73  dElement(0, pRes
20290 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  ult, Tcl_NewIntO
202a0 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20 20 54 63  bj(v));.  }.  Tc
202b0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
202c0 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74 29 3b  nterp, pResult);
202d0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
202e0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  ;.}.../*.** tclc
202f0 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67 5f 36 34  md:   working_64
20300 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20 53 6f  bit_int.**.** So
20310 6d 65 20 54 43 4c 20 62 75 69 6c 64 73 20 28 65  me TCL builds (e
20320 78 3a 20 63 79 67 77 69 6e 29 20 64 6f 20 6e 6f  x: cygwin) do no
20330 74 20 73 75 70 70 6f 72 74 20 36 34 2d 62 69 74  t support 64-bit
20340 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 69 73   integers.  This
20350 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20 61 20 6e  .** leads to a n
20360 75 6d 62 65 72 20 6f 66 20 74 65 73 74 20 66 61  umber of test fa
20370 69 6c 75 72 65 73 2e 20 20 54 68 65 20 70 72 65  ilures.  The pre
20380 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20 63 68 65  sent command che
20390 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43 4c 20 62  cks the.** TCL b
203a0 75 69 6c 64 20 74 6f 20 73 65 65 20 77 68 65 74  uild to see whet
203b0 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 73 75  her or not it su
203c0 70 70 6f 72 74 73 20 36 34 2d 62 69 74 20 69 6e  pports 64-bit in
203d0 74 65 67 65 72 73 2e 20 20 49 74 0a 2a 2a 20 72  tegers.  It.** r
203e0 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20 69  eturns TRUE if i
203f0 74 20 64 6f 65 73 20 61 6e 64 20 46 41 4c 53 45  t does and FALSE
20400 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 54   if not..**.** T
20410 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
20420 73 65 64 20 74 6f 20 77 61 72 6e 20 75 73 65 72  sed to warn user
20430 73 20 74 68 61 74 20 74 68 65 69 72 20 54 43 4c  s that their TCL
20440 20 62 75 69 6c 64 20 69 73 20 64 65 66 65 63 74   build is defect
20450 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68 61 74 20  ive.** and that 
20460 74 68 65 20 65 72 72 6f 72 73 20 74 68 65 79 20  the errors they 
20470 61 72 65 20 73 65 65 69 6e 67 20 69 6e 20 74 68  are seeing in th
20480 65 20 74 65 73 74 20 73 63 72 69 70 74 73 20 6d  e test scripts m
20490 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 72 65 73  ight be.** a res
204a0 75 6c 74 20 6f 66 20 74 68 65 69 72 20 64 65 66  ult of their def
204b0 65 63 74 69 76 65 20 54 43 4c 20 72 61 74 68 65  ective TCL rathe
204c0 72 20 74 68 61 6e 20 70 72 6f 62 6c 65 6d 73 20  r than problems 
204d0 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73 74  in SQLite..*/.st
204e0 61 74 69 63 20 69 6e 74 20 77 6f 72 6b 69 6e 67  atic int working
204f0 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20 20 43 6c  _64bit_int(.  Cl
20500 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
20510 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
20520 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
20530 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
20540 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
20550 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
20560 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
20570 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
20580 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
20590 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
205a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
205b0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
205c0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
205d0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
205e0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
205f0 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20  */.){.  Tcl_Obj 
20600 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20 69 6e 74  *pTestObj;.  int
20610 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a 0a 20   working = 0;.. 
20620 20 70 54 65 73 74 4f 62 6a 20 3d 20 54 63 6c 5f   pTestObj = Tcl_
20630 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 31 30  NewWideIntObj(10
20640 30 30 30 30 30 2a 28 69 36 34 29 31 32 33 34 35  00000*(i64)12345
20650 36 37 38 39 30 29 3b 0a 20 20 77 6f 72 6b 69 6e  67890);.  workin
20660 67 20 3d 20 73 74 72 63 6d 70 28 54 63 6c 5f 47  g = strcmp(Tcl_G
20670 65 74 53 74 72 69 6e 67 28 70 54 65 73 74 4f 62  etString(pTestOb
20680 6a 29 2c 20 22 31 32 33 34 35 36 37 38 39 30 30  j), "12345678900
20690 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20 20 54 63  00000")==0;.  Tc
206a0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70  l_DecrRefCount(p
206b0 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f  TestObj);.  Tcl_
206c0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
206d0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c  erp, Tcl_NewBool
206e0 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67 29 29  eanObj(working))
206f0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
20700 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  K;.}.../*.** tcl
20710 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 6c 69 6e  cmd:   vfs_unlin
20720 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69  k_test.**.** Thi
20730 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75 6e  s TCL command un
20740 72 65 67 69 73 74 65 72 73 20 74 68 65 20 70 72  registers the pr
20750 69 6d 61 72 79 20 56 46 53 20 61 6e 64 20 74 68  imary VFS and th
20760 65 6e 20 72 65 67 69 73 74 65 72 73 0a 2a 2a 20  en registers.** 
20770 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 20 20  it back again.  
20780 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20  This is used to 
20790 74 65 73 74 20 74 68 65 20 61 62 69 6c 69 74 79  test the ability
207a0 20 74 6f 20 72 65 67 69 73 74 65 72 20 61 0a 2a   to register a.*
207b0 2a 20 56 46 53 20 77 68 65 6e 20 6e 6f 6e 65 20  * VFS when none 
207c0 61 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  are previously r
207d0 65 67 69 73 74 65 72 65 64 2c 20 61 6e 64 20 74  egistered, and t
207e0 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 0a 2a  he ability to .*
207f0 2a 20 75 6e 72 65 67 69 73 74 65 72 20 74 68 65  * unregister the
20800 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20   only available 
20810 56 46 53 2e 20 20 54 69 63 6b 65 74 20 23 32 37  VFS.  Ticket #27
20820 33 38 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  38.*/.static int
20830 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74   vfs_unlink_test
20840 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
20850 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
20860 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
20870 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
20880 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
20890 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
208a0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
208b0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
208c0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
208d0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
208e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
208f0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
20900 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
20910 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
20920 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
20930 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
20940 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  t i;.  sqlite3_v
20950 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20 73 71 6c  fs *pMain;.  sql
20960 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73 5b  ite3_vfs *apVfs[
20970 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  20];.  sqlite3_v
20980 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a 20 20  fs one, two;..  
20990 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
209a0 67 69 73 74 65 72 28 30 29 3b 20 20 20 2f 2a 20  gister(0);   /* 
209b0 55 6e 72 65 67 69 73 74 65 72 20 6f 66 20 4e 55  Unregister of NU
209c0 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73 73 20 2a  LL is harmless *
209d0 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20  /.  one.zName = 
209e0 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f 2e 7a  "__one";.  two.z
209f0 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f 22 3b 0a  Name = "__two";.
20a00 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71  .  /* Calling sq
20a10 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
20a20 65 72 20 77 69 74 68 20 32 6e 64 20 61 72 67 75  er with 2nd argu
20a30 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65 73 20 6e  ment of 0 does n
20a40 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20 74  ot.  ** change t
20a50 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 0a 20  he default VFS. 
20a60 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d 20 73 71   */.  pMain = sq
20a70 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
20a80 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  );.  sqlite3_vfs
20a90 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20  _register(&one, 
20aa0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4d  0);.  assert( pM
20ab0 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e 3d  ain==0 || pMain=
20ac0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
20ad0 64 28 30 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  d(0) );.  sqlite
20ae0 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
20af0 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65 72  two, 0);.  asser
20b00 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70  t( pMain==0 || p
20b10 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76 66  Main==sqlite3_vf
20b20 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20 20  s_find(0) );..  
20b30 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e 64 20 61  /* We can find a
20b40 20 56 46 53 20 62 79 20 69 74 73 20 6e 61 6d 65   VFS by its name
20b50 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73 71   */.  assert( sq
20b60 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
20b70 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29 3b  __one")==&one );
20b80 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20b90 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74  e3_vfs_find("__t
20ba0 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 0a 20  wo")==&two );.. 
20bb0 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c 69   /* Calling sqli
20bc0 74 65 5f 76 66 73 5f 72 65 67 69 73 74 65 72 20  te_vfs_register 
20bd0 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73 65  with non-zero se
20be0 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 63  cond parameter c
20bf0 68 61 6e 67 65 73 20 74 68 65 0a 20 20 2a 2a 20  hanges the.  ** 
20c00 64 65 66 61 75 6c 74 20 56 46 53 2c 20 65 76 65  default VFS, eve
20c10 6e 20 69 66 20 74 68 65 20 31 73 74 20 70 61 72  n if the 1st par
20c20 61 6d 65 74 65 72 20 69 73 20 61 6e 20 65 78 69  ameter is an exi
20c30 73 74 69 67 20 56 46 53 20 74 68 61 74 20 69 73  stig VFS that is
20c40 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79  .  ** previously
20c50 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20 74   registered as t
20c60 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e 0a  he non-default..
20c70 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76    */.  sqlite3_v
20c80 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65  fs_register(&one
20c90 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 1);.  assert( 
20ca0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20cb0 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20  ("__one")==&one 
20cc0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
20cd0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f  ite3_vfs_find("_
20ce0 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a  _two")==&two );.
20cf0 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20d00 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d 26  3_vfs_find(0)==&
20d10 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  one );.  sqlite3
20d20 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 74  _vfs_register(&t
20d30 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74  wo, 1);.  assert
20d40 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
20d50 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e  nd("__one")==&on
20d60 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73  e );.  assert( s
20d70 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
20d80 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29  "__two")==&two )
20d90 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
20da0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d  te3_vfs_find(0)=
20db0 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66 28 20 70  =&two );.  if( p
20dc0 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Main ){.    sqli
20dd0 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
20de0 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20  (pMain, 1);.    
20df0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20e00 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
20e10 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 20 20 61  )==&one );.    a
20e20 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
20e30 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22 29  fs_find("__two")
20e40 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20 20 61 73  ==&two );.    as
20e50 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76 66  sert( sqlite3_vf
20e60 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69 6e  s_find(0)==pMain
20e70 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20   );.  }.  .  /* 
20e80 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65 66 61 75  Unlink the defau
20e90 6c 74 20 56 46 53 2e 20 20 52 65 70 65 61 74 20  lt VFS.  Repeat 
20ea0 75 6e 74 69 6c 20 74 68 65 72 65 20 61 72 65 20  until there are 
20eb0 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73 0a 20 20  no more VFSes.  
20ec0 2a 2a 20 72 65 67 69 73 74 65 72 65 64 2e 0a 20  ** registered.. 
20ed0 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
20ee0 3c 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f 73  <sizeof(apVfs)/s
20ef0 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29 3b  izeof(apVfs[0]);
20f00 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66 73   i++){.    apVfs
20f10 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  [i] = sqlite3_vf
20f20 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20 69  s_find(0);.    i
20f30 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a 20  f( apVfs[i] ){. 
20f40 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70 56       assert( apV
20f50 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f 76  fs[i]==sqlite3_v
20f60 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d  fs_find(apVfs[i]
20f70 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20  ->zName) );.    
20f80 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
20f90 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b 69  register(apVfs[i
20fa0 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ]);.      assert
20fb0 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73  ( 0==sqlite3_vfs
20fc0 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d 3e  _find(apVfs[i]->
20fd0 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d 0a  zName) );.    }.
20fe0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30 3d    }.  assert( 0=
20ff0 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
21000 64 28 30 29 20 29 3b 0a 20 20 0a 20 20 2f 2a 20  d(0) );.  .  /* 
21010 52 65 67 69 73 74 65 72 20 74 68 65 20 6d 61 69  Register the mai
21020 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d 64 65 66  n VFS as non-def
21030 61 75 6c 74 20 28 77 69 6c 6c 20 62 65 20 6d 61  ault (will be ma
21040 64 65 20 64 65 66 61 75 6c 74 2c 20 73 69 6e 63  de default, sinc
21050 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20 62 65 20  e.  ** it'll be 
21060 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e 20  the only one in 
21070 65 78 69 73 74 65 6e 63 65 29 2e 0a 20 20 2a 2f  existence)..  */
21080 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72  .  sqlite3_vfs_r
21090 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20 30  egister(pMain, 0
210a0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
210b0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
210c0 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20 20  ==pMain );.  .  
210d0 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65 72 20 74  /* Un-register t
210e0 68 65 20 6d 61 69 6e 20 56 46 53 20 61 67 61 69  he main VFS agai
210f0 6e 20 74 6f 20 72 65 73 74 6f 72 65 20 61 6e 20  n to restore an 
21100 65 6d 70 74 79 20 56 46 53 20 6c 69 73 74 20 2a  empty VFS list *
21110 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  /.  sqlite3_vfs_
21120 75 6e 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e  unregister(pMain
21130 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d 3d  );.  assert( 0==
21140 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21150 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65 6c  (0) );..  /* Rel
21160 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73 20 69 6e  ink all VFSes in
21170 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e 20   reverse order. 
21180 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 73 69 7a  */  .  for(i=siz
21190 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65 6f  eof(apVfs)/sizeo
211a0 66 28 61 70 56 66 73 5b 30 5d 29 2d 31 3b 20 69  f(apVfs[0])-1; i
211b0 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 69  >=0; i--){.    i
211c0 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a 20  f( apVfs[i] ){. 
211d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73       sqlite3_vfs
211e0 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  _register(apVfs[
211f0 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73  i], 1);.      as
21200 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d  sert( apVfs[i]==
21210 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21220 28 30 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73  (0) );.      ass
21230 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d 73  ert( apVfs[i]==s
21240 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21250 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65 29  apVfs[i]->zName)
21260 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
21270 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20 6f   /* Unregister o
21280 75 74 20 73 61 6d 70 6c 65 20 56 46 53 65 73 2e  ut sample VFSes.
21290 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66   */.  sqlite3_vf
212a0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f 6e  s_unregister(&on
212b0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  e);.  sqlite3_vf
212c0 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74 77  s_unregister(&tw
212d0 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65 67 69  o);..  /* Unregi
212e0 73 74 65 72 69 6e 67 20 61 20 56 46 53 20 74 68  stering a VFS th
212f0 61 74 20 69 73 20 6e 6f 74 20 63 75 72 72 65 6e  at is not curren
21300 74 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 69  tly registered i
21310 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20 20  s harmless */.  
21320 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
21330 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20 20  gister(&one);.  
21340 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65  sqlite3_vfs_unre
21350 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 20 20  gister(&two);.  
21360 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
21370 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65 22  vfs_find("__one"
21380 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  )==0 );.  assert
21390 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ( sqlite3_vfs_fi
213a0 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 30 20 29  nd("__two")==0 )
213b0 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c  ;..  /* We shoul
213c0 64 20 62 65 20 6c 65 66 74 20 77 69 74 68 20 74  d be left with t
213d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 66 61  he original defa
213e0 75 6c 74 20 56 46 53 20 62 61 63 6b 20 61 73 20  ult VFS back as 
213f0 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e 61  the.  ** origina
21400 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  l */.  assert( s
21410 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
21420 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a 20 20  0)==pMain );..  
21430 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
21440 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
21450 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74    vfs_initfail_t
21460 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54  est.**.** This T
21470 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74 74 65 6d  CL command attem
21480 70 74 73 20 74 6f 20 76 66 73 5f 66 69 6e 64 20  pts to vfs_find 
21490 61 6e 64 20 76 66 73 5f 72 65 67 69 73 74 65 72  and vfs_register
214a0 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71 6c   when the.** sql
214b0 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
214c0 29 20 69 6e 74 65 72 66 61 63 65 20 69 73 20 66  ) interface is f
214d0 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20 63 61 6c  ailing.  All cal
214e0 6c 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2e 0a  ls should fail..
214f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
21500 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 28  s_initfail_test(
21510 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
21520 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
21530 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
21540 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
21550 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
21560 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
21570 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
21580 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
21590 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
215a0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
215b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
215c0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
215d0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
215e0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
215f0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
21600 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
21610 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20 20  ite3_vfs one;.  
21620 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f 6f  one.zName = "__o
21630 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69  ne";..  if( sqli
21640 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
21650 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
21660 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  OR;.  sqlite3_vf
21670 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
21680 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   0);.  if( sqlit
21690 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
216a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
216b0 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  R;.  sqlite3_vfs
216c0 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c 20  _register(&one, 
216d0 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  1);.  if( sqlite
216e0 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29 20  3_vfs_find(0) ) 
216f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
21700 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
21710 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76 65  K;.}../*.** Save
21720 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74 69  d VFSes.*/.stati
21730 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 61  c sqlite3_vfs *a
21740 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69 63  pVfs[20];.static
21750 20 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a 0a   int nVfs = 0;..
21760 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
21770 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
21780 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69 73  ll.**.** Unregis
21790 74 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a 2a  ter all VFSes..*
217a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66 73  /.static int vfs
217b0 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 28  _unregister_all(
217c0 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
217d0 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
217e0 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
217f0 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
21800 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
21810 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
21820 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
21830 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
21840 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
21850 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
21860 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21870 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
21880 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
21890 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
218a0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
218b0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
218c0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
218d0 3c 41 72 72 61 79 53 69 7a 65 28 61 70 56 66 73  <ArraySize(apVfs
218e0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56  ); i++){.    apV
218f0 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f  fs[i] = sqlite3_
21900 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20  vfs_find(0);.   
21910 20 69 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d 30   if( apVfs[i]==0
21920 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
21930 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
21940 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b 0a  ster(apVfs[i]);.
21950 20 20 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b 0a    }.  nVfs = i;.
21960 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
21970 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
21980 20 20 20 76 66 73 5f 72 65 72 65 67 69 73 74 65     vfs_reregiste
21990 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73 74  r_all.**.** Rest
219a0 6f 72 65 20 61 6c 6c 20 56 46 53 65 73 20 74 68  ore all VFSes th
219b0 61 74 20 77 65 72 65 20 72 65 6d 6f 76 65 64 20  at were removed 
219c0 75 73 69 6e 67 20 76 66 73 5f 75 6e 72 65 67 69  using vfs_unregi
219d0 73 74 65 72 5f 61 6c 6c 0a 2a 2f 0a 73 74 61 74  ster_all.*/.stat
219e0 69 63 20 69 6e 74 20 76 66 73 5f 72 65 72 65 67  ic int vfs_rereg
219f0 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c 69  ister_all(.  Cli
21a00 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
21a10 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
21a20 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
21a30 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
21a40 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
21a50 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
21a60 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
21a70 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
21a80 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
21a90 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
21aa0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
21ab0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
21ac0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
21ad0 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
21ae0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
21af0 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  /.){.  int i;.  
21b00 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 66 73 3b  for(i=0; i<nVfs;
21b10 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
21b20 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
21b30 61 70 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29 3b  apVfs[i], i==0);
21b40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
21b50 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
21b60 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
21b70 6f 6e 74 72 6f 6c 5f 74 65 73 74 20 44 42 0a 2a  ontrol_test DB.*
21b80 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
21b90 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
21ba0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
21bb0 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61 6e  rol interface an
21bc0 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f  d.** verifies co
21bd0 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20  rrect operation 
21be0 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a  of the same..*/.
21bf0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
21c00 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28 0a 20 20  control_test(.  
21c10 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
21c20 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
21c30 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
21c40 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
21c50 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
21c60 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
21c70 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
21c80 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
21c90 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
21ca0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
21cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
21cc0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
21cd0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
21ce0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
21cf0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
21d00 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 41  s */.){.  int iA
21d10 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  rg = 0;.  sqlite
21d20 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
21d30 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
21d40 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
21d50 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
21d60 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
21d70 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
21d80 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
21d90 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
21da0 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20 30  0], 0), " DB", 0
21db0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
21dc0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
21dd0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
21de0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
21df0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
21e00 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
21e10 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20  L_ERROR;.  rc = 
21e20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
21e30 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30 2c 20 26  trol(db, 0, 0, &
21e40 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74 28  iArg);.  assert(
21e50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54 46   rc==SQLITE_NOTF
21e60 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d 20 73  OUND );.  rc = s
21e70 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
21e80 72 6f 6c 28 64 62 2c 20 22 6e 6f 74 61 64 61 74  rol(db, "notadat
21e90 61 62 61 73 65 22 2c 20 53 51 4c 49 54 45 5f 46  abase", SQLITE_F
21ea0 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c 20  CNTL_LOCKSTATE, 
21eb0 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
21ec0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52  ( rc==SQLITE_ERR
21ed0 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  OR );.  rc = sql
21ee0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
21ef0 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 2d 31  l(db, "main", -1
21f00 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65  , &iArg);.  asse
21f10 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  rt( rc==SQLITE_N
21f20 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20  OTFOUND );.  rc 
21f30 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  = sqlite3_file_c
21f40 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74 65 6d 70  ontrol(db, "temp
21f50 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a 20  ", -1, &iArg);. 
21f60 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
21f70 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 7c 7c 20  ITE_NOTFOUND || 
21f80 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f 52  rc==SQLITE_ERROR
21f90 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54 43   );..  return TC
21fa0 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  L_OK;.}.../*.** 
21fb0 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
21fc0 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f  ontrol_lasterrno
21fd0 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54  _test DB.**.** T
21fe0 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
21ff0 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
22000 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
22010 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
22020 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
22030 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
22040 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52   SQLITE_LAST_ERR
22050 4e 4f 20 76 65 72 62 2e 0a 2a 2f 0a 73 74 61 74  NO verb..*/.stat
22060 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
22070 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74 65  rol_lasterrno_te
22080 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  st(.  ClientData
22090 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
220a0 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
220b0 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
220c0 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
220d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
220e0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
220f0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
22100 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
22110 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
22120 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
22130 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
22140 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
22150 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
22160 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
22170 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
22180 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20 20  int iArg = 0;.  
22190 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
221a0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
221b0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
221c0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
221d0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
221e0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
221f0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
22200 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
22210 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
22220 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
22230 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
22240 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
22250 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
22260 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
22270 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
22280 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22290 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OR;.  }.  rc = s
222a0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
222b0 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
222c0 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f 2c  LITE_LAST_ERRNO,
222d0 20 26 69 41 72 67 29 3b 0a 20 20 69 66 28 20 72   &iArg);.  if( r
222e0 63 20 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65  c ){ .    Tcl_Se
222f0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
22300 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
22310 28 72 63 29 29 3b 20 0a 20 20 20 20 72 65 74 75  (rc)); .    retu
22320 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20  rn TCL_ERROR; . 
22330 20 7d 0a 20 20 69 66 28 20 69 41 72 67 21 3d 30   }.  if( iArg!=0
22340 20 29 20 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70   ) {.    Tcl_App
22350 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
22360 2c 20 22 55 6e 65 78 70 65 63 74 65 64 20 6e 6f  , "Unexpected no
22370 6e 2d 7a 65 72 6f 20 65 72 72 6e 6f 3a 20 22 2c  n-zero errno: ",
22380 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22390 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
223a0 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f 4e  ingFromObj(Tcl_N
223b0 65 77 49 6e 74 4f 62 6a 28 69 41 72 67 29 2c 20  ewIntObj(iArg), 
223c0 30 29 2c 20 22 20 22 2c 20 30 29 3b 0a 20 20 20  0), " ", 0);.   
223d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
223e0 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  R;.  }.  return 
223f0 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66  TCL_OK;  .}..#if
22400 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a 2f 2a  def __APPLE__./*
22410 20 46 72 6f 6d 20 73 71 6c 69 74 65 33 5f 70 72   From sqlite3_pr
22420 69 61 76 65 74 2e 68 20 2a 2f 0a 23 20 69 66 6e  iavet.h */.# ifn
22430 64 65 66 20 53 51 4c 49 54 45 5f 54 52 55 4e 43  def SQLITE_TRUNC
22440 41 54 45 5f 44 41 54 41 42 41 53 45 0a 23 20 64  ATE_DATABASE.# d
22450 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55  efine SQLITE_TRU
22460 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 20 20  NCATE_DATABASE  
22470 20 20 20 20 31 30 31 0a 23 20 64 65 66 69 6e 65      101.# define
22480 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
22490 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c  _JOURNALMODE_WAL
224a0 20 20 20 20 20 20 20 20 20 20 20 28 30 78 31 3c             (0x1<
224b0 3c 30 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  <0).# define SQL
224c0 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 41 55 54  ITE_TRUNCATE_AUT
224d0 4f 56 41 43 55 55 4d 5f 4d 41 53 4b 20 20 20 20  OVACUUM_MASK    
224e0 20 20 20 20 20 20 20 28 30 78 33 3c 3c 32 29 0a         (0x3<<2).
224f0 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
22500 54 52 55 4e 43 41 54 45 5f 41 55 54 4f 56 41 43  TRUNCATE_AUTOVAC
22510 55 55 4d 5f 4f 46 46 20 20 20 20 20 20 20 20 20  UUM_OFF         
22520 20 20 20 28 30 78 31 3c 3c 32 29 0a 23 20 64 65     (0x1<<2).# de
22530 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e  fine SQLITE_TRUN
22540 43 41 54 45 5f 41 55 54 4f 56 41 43 55 55 4d 5f  CATE_AUTOVACUUM_
22550 46 55 4c 4c 20 20 20 20 20 20 20 20 20 20 20 28  FULL           (
22560 30 78 32 3c 3c 32 29 0a 23 20 64 65 66 69 6e 65  0x2<<2).# define
22570 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
22580 5f 41 55 54 4f 56 41 43 55 55 4d 5f 49 4e 43 52  _AUTOVACUUM_INCR
22590 45 4d 45 4e 54 41 4c 20 20 20 20 28 30 78 33 3c  EMENTAL    (0x3<
225a0 3c 32 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  <2).# define SQL
225b0 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41 47  ITE_TRUNCATE_PAG
225c0 45 53 49 5a 45 5f 4d 41 53 4b 20 20 20 20 20 20  ESIZE_MASK      
225d0 20 20 20 20 20 20 20 28 30 78 37 3c 3c 34 29 0a         (0x7<<4).
225e0 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  # define SQLITE_
225f0 54 52 55 4e 43 41 54 45 5f 50 41 47 45 53 49 5a  TRUNCATE_PAGESIZ
22600 45 5f 31 30 32 34 20 20 20 20 20 20 20 20 20 20  E_1024          
22610 20 20 20 28 30 78 31 3c 3c 34 29 0a 23 20 64 65     (0x1<<4).# de
22620 66 69 6e 65 20 53 51 4c 49 54 45 5f 54 52 55 4e  fine SQLITE_TRUN
22630 43 41 54 45 5f 50 41 47 45 53 49 5a 45 5f 32 30  CATE_PAGESIZE_20
22640 34 38 20 20 20 20 20 20 20 20 20 20 20 20 20 28  48             (
22650 30 78 32 3c 3c 34 29 0a 23 20 64 65 66 69 6e 65  0x2<<4).# define
22660 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41 54 45   SQLITE_TRUNCATE
22670 5f 50 41 47 45 53 49 5a 45 5f 34 30 39 36 20 20  _PAGESIZE_4096  
22680 20 20 20 20 20 20 20 20 20 20 20 28 30 78 33 3c             (0x3<
22690 3c 34 29 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  <4).# define SQL
226a0 49 54 45 5f 54 52 55 4e 43 41 54 45 5f 50 41 47  ITE_TRUNCATE_PAG
226b0 45 53 49 5a 45 5f 38 31 39 32 20 20 20 20 20 20  ESIZE_8192      
226c0 20 20 20 20 20 20 20 28 30 78 34 3c 3c 34 29 0a         (0x4<<4).
226d0 23 20 65 6e 64 69 66 0a 23 20 69 66 6e 64 65 66  # endif.# ifndef
226e0 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 5f   SQLITE_REPLACE_
226f0 44 41 54 41 42 41 53 45 0a 23 20 64 65 66 69 6e  DATABASE.# defin
22700 65 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45  e SQLITE_REPLACE
22710 5f 44 41 54 41 42 41 53 45 20 20 20 20 20 20 20  _DATABASE       
22720 31 30 32 0a 23 20 65 6e 64 69 66 0a 0a 2f 2a 0a  102.# endif../*.
22730 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
22740 65 5f 63 6f 6e 74 72 6f 6c 5f 74 72 75 6e 63 61  e_control_trunca
22750 74 65 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a  te_test DB.**.**
22760 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
22770 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
22780 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
22790 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a  interface and.**
227a0 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63   verifies correc
227b0 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74  t operation of t
227c0 68 65 20 53 51 4c 49 54 45 5f 54 52 55 4e 43 41  he SQLITE_TRUNCA
227d0 54 45 5f 44 41 54 41 42 41 53 45 20 76 65 72 62  TE_DATABASE verb
227e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
227f0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 72 75  file_control_tru
22800 6e 63 61 74 65 5f 74 65 73 74 28 0a 20 20 43 6c  ncate_test(.  Cl
22810 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
22820 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
22830 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
22840 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
22850 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
22860 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
22870 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
22880 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
22890 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
228a0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
228b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
228c0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
228d0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
228e0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
228f0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
22900 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
22910 2a 64 62 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  *db;.  int flags
22920 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a 20  ;.  int rc;.  . 
22930 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
22940 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
22950 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
22960 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
22970 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
22980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22990 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
229a0 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29  mObj(objv[0], 0)
229b0 2c 20 22 20 44 42 20 46 4c 41 47 53 22 2c 20 30  , " DB FLAGS", 0
229c0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
229d0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
229e0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
229f0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
22a00 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
22a10 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
22a20 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
22a30 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
22a40 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
22a50 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 66 6c 61 67  , objv[2], &flag
22a60 73 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  s) ){.    return
22a70 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22a80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
22a90 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20  ile_control(db, 
22aa0 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 54 52 55  NULL, SQLITE_TRU
22ab0 4e 43 41 54 45 5f 44 41 54 41 42 41 53 45 2c 20  NCATE_DATABASE, 
22ac0 26 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 72  &flags);.  if( r
22ad0 63 20 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53 65  c ){ .    Tcl_Se
22ae0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
22af0 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
22b00 28 72 63 29 29 3b 20 0a 20 20 20 20 72 65 74 75  (rc)); .    retu
22b10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a 20  rn TCL_ERROR; . 
22b20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
22b30 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
22b40 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
22b50 6e 74 72 6f 6c 5f 72 65 70 6c 61 63 65 5f 74 65  ntrol_replace_te
22b60 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20 54 68 69 73  st DB.**.** This
22b70 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e   TCL command run
22b80 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69  s the sqlite3_fi
22b90 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72  le_control inter
22ba0 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69  face and.** veri
22bb0 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65  fies correct ope
22bc0 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51  ration of the SQ
22bd0 4c 49 54 45 5f 52 45 50 4c 41 43 45 5f 44 41 54  LITE_REPLACE_DAT
22be0 41 42 41 53 45 20 76 65 72 62 2e 0a 2a 2f 0a 73  ABASE verb..*/.s
22bf0 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
22c00 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63 65 5f 74  ontrol_replace_t
22c10 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
22c20 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
22c30 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
22c40 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
22c50 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
22c60 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
22c70 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
22c80 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
22c90 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
22ca0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
22cb0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
22cc0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
22cd0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
22ce0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
22cf0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
22d00 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
22d10 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20   int iArg = 0;. 
22d20 20 73 71 6c 69 74 65 33 20 2a 73 72 63 5f 64 62   sqlite3 *src_db
22d30 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 73 74  ;.  sqlite3 *dst
22d40 5f 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  _db;.  int rc;. 
22d50 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20   .  if( objc!=3 
22d60 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
22d70 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
22d80 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
22d90 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22db0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
22dc0 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
22dd0 20 30 29 2c 20 22 20 44 53 54 5f 44 42 20 53 52   0), " DST_DB SR
22de0 43 5f 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  C_DB", 0);.    r
22df0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22e00 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
22e10 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
22e20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
22e30 6a 76 5b 31 5d 29 2c 20 26 64 73 74 5f 64 62 29  jv[1]), &dst_db)
22e40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
22e50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
22e60 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
22e70 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
22e80 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c  String(objv[2]),
22e90 20 26 73 72 63 5f 64 62 29 20 29 7b 0a 20 20 20   &src_db) ){.   
22ea0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22eb0 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  R;.  }.  rc = sq
22ec0 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22ed0 6f 6c 28 64 73 74 5f 64 62 2c 20 4e 55 4c 4c 2c  ol(dst_db, NULL,
22ee0 20 53 51 4c 49 54 45 5f 52 45 50 4c 41 43 45 5f   SQLITE_REPLACE_
22ef0 44 41 54 41 42 41 53 45 2c 20 73 72 63 5f 64 62  DATABASE, src_db
22f00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 20 0a  );.  if( rc ){ .
22f10 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
22f20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
22f30 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b  _NewIntObj(rc));
22f40 20 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c   .    return TCL
22f50 5f 45 52 52 4f 52 3b 20 0a 20 20 7d 0a 20 20 72  _ERROR; .  }.  r
22f60 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
22f70 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 5f 5f 41 50  }.#endif /* __AP
22f80 50 4c 45 5f 5f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PLE__ */../*.** 
22f90 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
22fa0 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
22fb0 5f 74 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20  _test DB DBNAME 
22fc0 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SIZE.**.** This 
22fd0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
22fe0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c   the sqlite3_fil
22ff0 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66  e_control interf
23000 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66  ace and.** verif
23010 69 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72  ies correct oper
23020 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 53 51 4c  ation of the SQL
23030 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_GET_LOCKPROX
23040 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20 53 51 4c  YFILE and.** SQL
23050 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
23060 59 46 49 4c 45 20 76 65 72 62 73 2e 0a 2a 2f 0a  YFILE verbs..*/.
23070 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
23080 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a  control_chunksiz
23090 65 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  e_test(.  Client
230a0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
230b0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
230c0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
230d0 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
230e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
230f0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
23100 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
23110 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
23120 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
23130 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
23140 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23150 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
23160 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23170 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
23180 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
23190 7b 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 20 20  {.  int nSize;  
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
231b0 20 20 20 20 2f 2a 20 4e 65 77 20 63 68 75 6e 6b      /* New chunk
231c0 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20   size */.  char 
231d0 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  *zDb;           
231e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 62             /* Db
231f0 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22   name ("main", "
23200 74 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20  temp" etc.) */. 
23210 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
23220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23230 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
23240 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  dle */.  int rc;
23250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23260 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c 65           /* file
23270 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75 72  _control() retur
23280 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28  n code */..  if(
23290 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
232a0 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
232b0 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
232c0 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49 5a  , "DB DBNAME SIZ
232d0 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  E");.    return 
232e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
232f0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
23300 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
23310 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
23320 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54 63  , &db) .   || Tc
23330 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
23340 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
23350 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20 20   &nSize).  ){.  
23360 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23370 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54  R;.  }.  zDb = T
23380 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
23390 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44 62  v[2]);.  if( zDb
233a0 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62 20  [0]=='\0' ) zDb 
233b0 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d 20  = NULL;..  rc = 
233c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
233d0 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53 51  trol(db, zDb, SQ
233e0 4c 49 54 45 5f 46 43 4e 54 4c 5f 43 48 55 4e 4b  LITE_FCNTL_CHUNK
233f0 5f 53 49 5a 45 2c 20 28 76 6f 69 64 20 2a 29 26  _SIZE, (void *)&
23400 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  nSize);.  if( rc
23410 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
23420 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
23430 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
23440 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
23450 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72  ATIC);.    retur
23460 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23470 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
23480 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
23490 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
234a0 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 20  l_sizehint_test 
234b0 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 0a 2a  DB DBNAME SIZE.*
234c0 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f  *.** This TCL co
234d0 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73  mmand runs the s
234e0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
234f0 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 0a 2a  rol interface .*
23500 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 46 43  * with SQLITE_FC
23510 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 0a 2a 2f  NTL_SIZE_HINT.*/
23520 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
23530 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e  _control_sizehin
23540 74 5f 74 65 73 74 28 0a 20 20 43 6c 69 65 6e 74  t_test(.  Client
23550 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
23560 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
23570 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
23580 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
23590 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
235a0 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
235b0 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
235c0 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
235d0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
235e0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
235f0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
23600 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
23610 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
23620 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
23630 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
23640 7b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20  {.  Tcl_WideInt 
23650 6e 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  nSize;          
23660 20 20 20 20 2f 2a 20 48 69 6e 74 65 64 20 73 69      /* Hinted si
23670 7a 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  ze */.  char *zD
23680 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
23690 20 20 20 20 20 20 20 20 2f 2a 20 44 62 20 6e 61          /* Db na
236a0 6d 65 20 28 22 6d 61 69 6e 22 2c 20 22 74 65 6d  me ("main", "tem
236b0 70 22 20 65 74 63 2e 29 20 2a 2f 0a 20 20 73 71  p" etc.) */.  sq
236c0 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20  lite3 *db;      
236d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
236e0 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
236f0 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
23700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23710 20 20 20 20 20 20 2f 2a 20 66 69 6c 65 5f 63 6f        /* file_co
23720 6e 74 72 6f 6c 28 29 20 72 65 74 75 72 6e 20 63  ntrol() return c
23730 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62  ode */..  if( ob
23740 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=4 ){.    Tcl
23750 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
23760 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
23770 44 42 20 44 42 4e 41 4d 45 20 53 49 5a 45 22 29  DB DBNAME SIZE")
23780 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
23790 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
237a0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
237b0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
237c0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
237d0 64 62 29 20 0a 20 20 20 7c 7c 20 54 63 6c 5f 47  db) .   || Tcl_G
237e0 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
237f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
23800 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29 7b 0a 20  , &nSize).  ){. 
23810 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
23820 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62 20 3d 20  OR;.  }.  zDb = 
23830 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
23840 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28 20 7a 44  jv[2]);.  if( zD
23850 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20 7a 44 62  b[0]=='\0' ) zDb
23860 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72 63 20 3d   = NULL;..  rc =
23870 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
23880 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 2c 20 53  ntrol(db, zDb, S
23890 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 53 49 5a 45  QLITE_FCNTL_SIZE
238a0 5f 48 49 4e 54 2c 20 28 76 6f 69 64 20 2a 29 26  _HINT, (void *)&
238b0 6e 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  nSize);.  if( rc
238c0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52   ){.    Tcl_SetR
238d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
238e0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
238f0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
23900 41 54 49 43 29 3b 0a 20 20 20 20 72 65 74 75 72  ATIC);.    retur
23910 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23920 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
23930 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  ;.}../*.** tclcm
23940 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f  d:   file_contro
23950 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74  l_lockproxy_test
23960 20 44 42 20 50 57 44 0a 2a 2a 0a 2a 2a 20 54 68   DB PWD.**.** Th
23970 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
23980 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
23990 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
239a0 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76 65  erface and.** ve
239b0 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20 6f  rifies correct o
239c0 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  peration of the 
239d0 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b 50  SQLITE_GET_LOCKP
239e0 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a 20  ROXYFILE and.** 
239f0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
23a00 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e 0a  ROXYFILE verbs..
23a10 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69  */.static int fi
23a20 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70  le_control_lockp
23a30 72 6f 78 79 5f 74 65 73 74 28 0a 20 20 43 6c 69  roxy_test(.  Cli
23a40 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
23a50 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
23a60 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
23a70 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
23a80 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
23a90 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
23aa0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
23ab0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
23ac0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
23ad0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
23ae0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23af0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
23b00 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
23b10 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
23b20 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
23b30 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23b40 64 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a  db;.  .  if( obj
23b50 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
23b60 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
23b70 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
23b80 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
23b90 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
23ba0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
23bb0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
23bc0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 50  v[0], 0), " DB P
23bd0 57 44 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  WD", 0);.    ret
23be0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
23bf0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
23c00 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
23c10 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
23c20 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
23c30 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23c40 52 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 20 21 64  R;.  }.  .#if !d
23c50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
23c60 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59  ABLE_LOCKING_STY
23c70 4c 45 29 0a 23 20 20 69 66 20 64 65 66 69 6e 65  LE).#  if define
23c80 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 23 20 20  d(__APPLE__).#  
23c90 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
23ca0 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53  ENABLE_LOCKING_S
23cb0 54 59 4c 45 20 31 0a 23 20 20 65 6c 73 65 0a 23  TYLE 1.#  else.#
23cc0 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54      define SQLIT
23cd0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
23ce0 5f 53 54 59 4c 45 20 30 0a 23 20 20 65 6e 64 69  _STYLE 0.#  endi
23cf0 66 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  f.#endif.#if SQL
23d00 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
23d10 4e 47 5f 53 54 59 4c 45 20 26 26 20 64 65 66 69  NG_STYLE && defi
23d20 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
23d30 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 74 65 73   {.    char *tes
23d40 74 50 61 74 68 3b 0a 20 20 20 20 69 6e 74 20 72  tPath;.    int r
23d50 63 3b 0a 20 20 20 20 69 6e 74 20 6e 50 77 64 3b  c;.    int nPwd;
23d60 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
23d70 2a 7a 50 77 64 3b 0a 20 20 20 20 63 68 61 72 20  *zPwd;.    char 
23d80 70 72 6f 78 79 50 61 74 68 5b 34 30 30 5d 3b 0a  proxyPath[400];.
23d90 20 20 20 20 0a 20 20 20 20 7a 50 77 64 20 3d 20      .    zPwd = 
23da0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f  Tcl_GetStringFro
23db0 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6e  mObj(objv[2], &n
23dc0 50 77 64 29 3b 0a 20 20 20 20 69 66 28 20 73 69  Pwd);.    if( si
23dd0 7a 65 6f 66 28 70 72 6f 78 79 50 61 74 68 29 3c  zeof(proxyPath)<
23de0 6e 50 77 64 2b 32 30 20 29 7b 0a 20 20 20 20 20  nPwd+20 ){.     
23df0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
23e00 74 28 69 6e 74 65 72 70 2c 20 22 50 57 44 20 74  t(interp, "PWD t
23e10 6f 6f 20 62 69 67 22 2c 20 28 76 6f 69 64 2a 29  oo big", (void*)
23e20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  0);.      return
23e30 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
23e40 7d 0a 20 20 20 20 73 70 72 69 6e 74 66 28 70 72  }.    sprintf(pr
23e50 6f 78 79 50 61 74 68 2c 20 22 25 73 2f 74 65 73  oxyPath, "%s/tes
23e60 74 2e 70 72 6f 78 79 22 2c 20 7a 50 77 64 29 3b  t.proxy", zPwd);
23e70 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
23e80 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
23e90 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f  b, NULL, SQLITE_
23ea0 53 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c  SET_LOCKPROXYFIL
23eb0 45 2c 20 70 72 6f 78 79 50 61 74 68 29 3b 0a 20  E, proxyPath);. 
23ec0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
23ed0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
23ee0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
23ef0 4e 65 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 20  NewIntObj(rc)); 
23f00 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43  .      return TC
23f10 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  L_ERROR;.    }. 
23f20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
23f30 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c  file_control(db,
23f40 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45 5f 47 45   NULL, SQLITE_GE
23f50 54 5f 4c 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c  T_LOCKPROXYFILE,
23f60 20 26 74 65 73 74 50 61 74 68 29 3b 0a 20 20 20   &testPath);.   
23f70 20 69 66 28 20 73 74 72 6e 63 6d 70 28 70 72 6f   if( strncmp(pro
23f80 78 79 50 61 74 68 2c 74 65 73 74 50 61 74 68 2c  xyPath,testPath,
23f90 31 31 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c  11) ){.      Tcl
23fa0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
23fb0 74 65 72 70 2c 20 22 4c 6f 63 6b 20 70 72 6f 78  terp, "Lock prox
23fc0 79 20 66 69 6c 65 20 64 69 64 20 6e 6f 74 20 6d  y file did not m
23fd0 61 74 63 68 20 74 68 65 20 22 0a 20 20 20 20 20  atch the ".     
23fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23ff0 20 20 20 20 20 20 20 20 20 20 22 70 72 65 76 69            "previ
24000 6f 75 73 6c 79 20 61 73 73 69 67 6e 65 64 20 76  ously assigned v
24010 61 6c 75 65 22 2c 20 30 29 3b 0a 20 20 20 20 20  alue", 0);.     
24020 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
24030 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  R;.    }.    if(
24040 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63 6c   rc ){.      Tcl
24050 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
24060 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
24070 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20 20  Obj(rc));.      
24080 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
24090 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
240a0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
240b0 6e 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20  ntrol(db, NULL, 
240c0 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50  SQLITE_SET_LOCKP
240d0 52 4f 58 59 46 49 4c 45 2c 20 70 72 6f 78 79 50  ROXYFILE, proxyP
240e0 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ath);.    if( rc
240f0 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 53 65   ){.      Tcl_Se
24100 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
24110 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  p, Tcl_NewIntObj
24120 28 72 63 29 29 3b 0a 20 20 20 20 20 20 72 65 74  (rc));.      ret
24130 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
24140 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a     }.  }.#endif.
24150 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
24160 20 20 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 41    .}..#ifdef __A
24170 50 50 4c 45 5f 5f 0a 23 69 6e 63 6c 75 64 65 20  PPLE__.#include 
24180 3c 73 79 73 2f 70 61 72 61 6d 2e 68 3e 0a 23 69  <sys/param.h>.#i
24190 6e 63 6c 75 64 65 20 3c 73 79 73 2f 6d 6f 75 6e  nclude <sys/moun
241a0 74 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  t.h>.#include <s
241b0 79 73 2f 65 72 72 6e 6f 2e 68 3e 0a 23 65 6e 64  ys/errno.h>.#end
241c0 69 66 0a 0a 2f 2a 0a 20 2a 2a 20 74 63 6c 63 6d  if../*. ** tclcm
241d0 64 3a 20 20 20 70 61 74 68 5f 69 73 5f 6c 6f 63  d:   path_is_loc
241e0 61 6c 20 50 57 44 0a 20 2a 2f 0a 73 74 61 74 69  al PWD. */.stati
241f0 63 20 69 6e 74 20 70 61 74 68 5f 69 73 5f 6c 6f  c int path_is_lo
24200 63 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  cal(.  ClientDat
24210 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
24220 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
24230 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
24240 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
24250 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
24260 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
24270 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
24280 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
24290 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
242a0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
242b0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
242c0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
242d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
242e0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
242f0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 23  rguments */.){.#
24300 69 66 64 65 66 20 5f 5f 41 50 50 4c 45 5f 5f 0a  ifdef __APPLE__.
24310 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
24320 61 74 68 3b 0a 20 20 69 6e 74 20 6e 50 61 74 68  ath;.  int nPath
24330 3b 0a 20 20 73 74 72 75 63 74 20 73 74 61 74 66  ;.  struct statf
24340 73 20 66 73 49 6e 66 6f 3b 0a 20 20 0a 20 20 69  s fsInfo;.  .  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 20 20 20 20 20 20 20 20 20 20 20 20 20 54 63                Tc
243b0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
243c0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
243d0 22 20 50 41 54 48 22 2c 20 30 29 3b 0a 20 20 20  " PATH", 0);.   
243e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
243f0 52 3b 0a 20 20 7d 0a 20 20 7a 50 61 74 68 20 3d  R;.  }.  zPath =
24400 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
24410 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26  omObj(objv[1], &
24420 6e 50 61 74 68 29 3b 0a 20 20 69 66 28 20 73 74  nPath);.  if( st
24430 61 74 66 73 28 7a 50 61 74 68 2c 20 26 66 73 49  atfs(zPath, &fsI
24440 6e 66 6f 29 20 3d 3d 20 2d 31 20 29 7b 0a 20 20  nfo) == -1 ){.  
24450 20 20 69 6e 74 20 65 72 72 20 3d 20 65 72 72 6e    int err = errn
24460 6f 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  o;.    Tcl_Appen
24470 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
24480 22 45 72 72 6f 72 20 63 61 6c 6c 69 6e 67 20 73  "Error calling s
24490 74 61 74 66 73 20 6f 6e 20 70 61 74 68 22 2c 0a  tatfs on path",.
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
244b0 20 20 20 20 20 54 63 6c 5f 4e 65 77 49 6e 74 4f       Tcl_NewIntO
244c0 62 6a 28 65 72 72 29 2c 20 30 29 3b 0a 20 20 20  bj(err), 0);.   
244d0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
244e0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 73 49  R;.  }.  if( fsI
244f0 6e 66 6f 2e 66 5f 66 6c 61 67 73 26 4d 4e 54 5f  nfo.f_flags&MNT_
24500 4c 4f 43 41 4c 20 29 7b 0a 20 20 20 20 54 63 6c  LOCAL ){.    Tcl
24510 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
24520 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
24530 4f 62 6a 28 31 29 29 3b 20 0a 20 20 7d 20 65 6c  Obj(1)); .  } el
24540 73 65 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  se {.    Tcl_Set
24550 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
24560 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
24570 30 29 29 3b 20 0a 20 20 7d 0a 23 65 6c 73 65 0a  0)); .  }.#else.
24580 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
24590 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
245a0 65 77 49 6e 74 4f 62 6a 28 31 29 29 3b 20 0a 23  ewIntObj(1)); .#
245b0 65 6e 64 69 66 0a 20 20 0a 20 20 72 65 74 75 72  endif.  .  retur
245c0 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f  n TCL_OK;  .}../
245d0 2a 0a 20 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  *. ** tclcmd:   
245e0 70 61 74 68 5f 69 73 5f 64 6f 73 20 50 57 44 0a  path_is_dos PWD.
245f0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
24600 61 74 68 5f 69 73 5f 64 6f 73 28 0a 20 20 43 6c  ath_is_dos(.  Cl
24610 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
24620 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
24630 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
24640 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
24650 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
24660 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
24670 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
24680 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
24690 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
246a0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
246b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
246c0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
246d0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
246e0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
246f0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
24700 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 5f 5f 41  */.){.#ifdef __A
24710 50 50 4c 45 5f 5f 0a 20 20 63 6f 6e 73 74 20 63  PPLE__.  const c
24720 68 61 72 20 2a 7a 50 61 74 68 3b 0a 20 20 69 6e  har *zPath;.  in
24730 74 20 6e 50 61 74 68 3b 0a 20 20 73 74 72 75 63  t nPath;.  struc
24740 74 20 73 74 61 74 66 73 20 66 73 49 6e 66 6f 3b  t statfs fsInfo;
24750 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
24760 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
24770 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
24780 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
24790 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
247a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247b0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
247c0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
247d0 5d 2c 20 30 29 2c 20 22 20 50 41 54 48 22 2c 20  ], 0), " PATH", 
247e0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
247f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
24800 7a 50 61 74 68 20 3d 20 54 63 6c 5f 47 65 74 53  zPath = Tcl_GetS
24810 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
24820 76 5b 31 5d 2c 20 26 6e 50 61 74 68 29 3b 0a 20  v[1], &nPath);. 
24830 20 69 66 28 20 73 74 61 74 66 73 28 7a 50 61 74   if( statfs(zPat
24840 68 2c 20 26 66 73 49 6e 66 6f 29 20 3d 3d 20 2d  h, &fsInfo) == -
24850 31 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 72 72  1 ){.    int err
24860 20 3d 20 65 72 72 6e 6f 3b 0a 20 20 20 20 54 63   = errno;.    Tc
24870 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
24880 6e 74 65 72 70 2c 20 22 45 72 72 6f 72 20 63 61  nterp, "Error ca
24890 6c 6c 69 6e 67 20 73 74 61 74 66 73 20 6f 6e 20  lling statfs on 
248a0 70 61 74 68 22 2c 0a 20 20 20 20 20 20 20 20 20  path",.         
248b0 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
248c0 4e 65 77 49 6e 74 4f 62 6a 28 65 72 72 29 2c 20  NewIntObj(err), 
248d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
248e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
248f0 69 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70  if (0 == strncmp
24900 28 22 6d 73 64 6f 73 22 2c 20 66 73 49 6e 66 6f  ("msdos", fsInfo
24910 2e 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35  .f_fstypename, 5
24920 29 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  )) {.    Tcl_Set
24930 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
24940 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
24950 31 29 29 3b 20 0a 20 20 7d 20 65 6c 73 65 20 69  1)); .  } else i
24960 66 20 28 30 20 3d 3d 20 73 74 72 6e 63 6d 70 28  f (0 == strncmp(
24970 22 65 78 66 61 74 22 2c 20 66 73 49 6e 66 6f 2e  "exfat", fsInfo.
24980 66 5f 66 73 74 79 70 65 6e 61 6d 65 2c 20 35 29  f_fstypename, 5)
24990 29 20 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f  ) {.    Tcl_SetO
249a0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
249b0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 31   Tcl_NewIntObj(1
249c0 29 29 3b 20 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  )); .  } else {.
249d0 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
249e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
249f0 5f 4e 65 77 49 6e 74 4f 62 6a 28 30 29 29 3b 20  _NewIntObj(0)); 
24a00 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 54 63 6c  .  }.#else.  Tcl
24a10 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
24a20 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  terp, Tcl_NewInt
24a30 4f 62 6a 28 30 29 29 3b 20 0a 23 65 6e 64 69 66  Obj(0)); .#endif
24a40 0a 20 20 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  .  .  return TCL
24a50 5f 4f 4b 3b 20 20 0a 7d 0a 0a 23 69 66 20 53 51  _OK;  .}..#if SQ
24a60 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
24a70 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65  * tclcmd:   file
24a80 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61  _control_win32_a
24a90 76 5f 72 65 74 72 79 20 44 42 20 20 4e 52 45 54  v_retry DB  NRET
24aa0 52 59 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a 2a 20  RY  DELAY.**.** 
24ab0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
24ac0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
24ad0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
24ae0 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a  nterface with.**
24af0 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
24b00 4c 5f 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59  L_WIN32_AV_RETRY
24b10 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74   opcode..*/.stat
24b20 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
24b30 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74  rol_win32_av_ret
24b40 72 79 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  ry(.  ClientData
24b50 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
24b60 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74  Pointer to sqlit
24b70 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75  e3_enable_XXX fu
24b80 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f  nction */.  Tcl_
24b90 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
24ba0 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
24bb0 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
24bc0 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
24bd0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
24be0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
24bf0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
24c00 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
24c10 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
24c20 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
24c30 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
24c40 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
24c50 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b 32  nt rc;.  int a[2
24c60 5d 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  ];.  char z[100]
24c70 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34  ;..  if( objc!=4
24c80 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
24c90 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
24ca0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
24cb0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
24cc0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
24cd0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
24ce0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e 52  [0], 0), " DB NR
24cf0 45 54 52 59 20 44 45 4c 41 59 22 2c 20 30 29 3b  ETRY DELAY", 0);
24d00 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
24d10 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
24d20 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
24d30 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
24d40 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
24d50 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
24d60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24d70 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74    if( Tcl_GetInt
24d80 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
24d90 6f 62 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29 20  objv[2], &a[0]) 
24da0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
24db0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
24dc0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
24dd0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61 5b  rp, objv[3], &a[
24de0 31 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  1]) ) return TCL
24df0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
24e00 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
24e10 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51  rol(db, NULL, SQ
24e20 4c 49 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32  LITE_FCNTL_WIN32
24e30 5f 41 56 5f 52 45 54 52 59 2c 20 28 76 6f 69 64  _AV_RETRY, (void
24e40 2a 29 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  *)a);.  sqlite3_
24e50 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
24e60 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 20 25 64  z), z, "%d %d %d
24e70 22 2c 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b 31  ", rc, a[0], a[1
24e80 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  ]);.  Tcl_Append
24e90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
24ea0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72  , (char*)0);.  r
24eb0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
24ec0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
24ed0 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f     file_control_
24ee0 77 69 6e 33 32 5f 73 65 74 5f 68 61 6e 64 6c 65  win32_set_handle
24ef0 20 44 42 20 48 41 4e 44 4c 45 0a 2a 2a 0a 2a 2a   DB HANDLE.**.**
24f00 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
24f10 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
24f20 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20  e3_file_control 
24f30 69 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a  interface with.*
24f40 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e  * the SQLITE_FCN
24f50 54 4c 5f 57 49 4e 33 32 5f 53 45 54 5f 48 41 4e  TL_WIN32_SET_HAN
24f60 44 4c 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73  DLE opcode..*/.s
24f70 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63  tatic int file_c
24f80 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 73 65 74  ontrol_win32_set
24f90 5f 68 61 6e 64 6c 65 28 0a 20 20 43 6c 69 65 6e  _handle(.  Clien
24fa0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
24fb0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
24fc0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
24fd0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
24fe0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
24ff0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
25000 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
25010 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
25020 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25030 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
25040 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25050 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25060 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25070 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
25080 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
25090 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
250a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 48 41  ;.  int rc;.  HA
250b0 4e 44 4c 45 20 68 46 69 6c 65 20 3d 20 4e 55 4c  NDLE hFile = NUL
250c0 4c 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d  L;.  char z[100]
250d0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
250e0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
250f0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
25100 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
25110 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
25120 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
25130 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
25140 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 48 41  [0], 0), " DB HA
25150 4e 44 4c 45 22 2c 20 30 29 3b 0a 20 20 20 20 72  NDLE", 0);.    r
25160 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25170 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
25180 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
25190 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
251a0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
251b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
251c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
251d0 67 65 74 57 69 6e 33 32 48 61 6e 64 6c 65 28 69  getWin32Handle(i
251e0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
251f0 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26  ring(objv[2]), &
25200 68 46 69 6c 65 29 20 29 7b 0a 20 20 20 20 72 65  hFile) ){.    re
25210 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
25220 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
25230 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
25240 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54 45  db, NULL, SQLITE
25250 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 53 45 54  _FCNTL_WIN32_SET
25260 5f 48 41 4e 44 4c 45 2c 0a 20 20 20 20 20 20 20  _HANDLE,.       
25270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25280 20 20 20 20 20 28 76 6f 69 64 2a 29 26 68 46 69       (void*)&hFi
25290 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  le);.  sqlite3_s
252a0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
252b0 29 2c 20 7a 2c 20 22 25 64 20 25 70 22 2c 20 72  ), z, "%d %p", r
252c0 63 2c 20 28 76 6f 69 64 2a 29 68 46 69 6c 65 29  c, (void*)hFile)
252d0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
252e0 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
252f0 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
25300 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
25310 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 74 63  #endif../*.** tc
25320 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e  lcmd:   file_con
25330 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c  trol_persist_wal
25340 20 44 42 20 50 45 52 53 49 53 54 2d 46 4c 41 47   DB PERSIST-FLAG
25350 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20  .**.** This TCL 
25360 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65  command runs the
25370 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
25380 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20  ntrol interface 
25390 77 69 74 68 0a 2a 2a 20 74 68 65 20 53 51 4c 49  with.** the SQLI
253a0 54 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54  TE_FCNTL_PERSIST
253b0 5f 57 41 4c 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a  _WAL opcode..*/.
253c0 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f  static int file_
253d0 63 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f  control_persist_
253e0 77 61 6c 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  wal(.  ClientDat
253f0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
25400 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
25410 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
25420 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
25430 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25440 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25450 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25460 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25470 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25480 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25490 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
254a0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
254b0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
254c0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
254d0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
254e0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
254f0 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 62 50  int rc;.  int bP
25500 65 72 73 69 73 74 3b 0a 20 20 63 68 61 72 20 7a  ersist;.  char z
25510 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62  [100];..  if( ob
25520 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
25530 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
25540 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
25550 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
25560 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
25570 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
25580 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
25590 44 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20  DB FLAG", 0);.  
255a0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
255b0 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
255c0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
255d0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
255e0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
255f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
25600 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
25610 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
25620 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
25630 76 5b 32 5d 2c 20 26 62 50 65 72 73 69 73 74 29  v[2], &bPersist)
25640 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
25650 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
25660 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
25670 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
25680 45 5f 46 43 4e 54 4c 5f 50 45 52 53 49 53 54 5f  E_FCNTL_PERSIST_
25690 57 41 4c 2c 20 28 76 6f 69 64 2a 29 26 62 50 65  WAL, (void*)&bPe
256a0 72 73 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  rsist);.  sqlite
256b0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
256c0 66 28 7a 29 2c 20 7a 2c 20 22 25 64 20 25 64 22  f(z), z, "%d %d"
256d0 2c 20 72 63 2c 20 62 50 65 72 73 69 73 74 29 3b  , rc, bPersist);
256e0 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
256f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28  ult(interp, z, (
25700 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75  char*)0);.  retu
25710 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 2f  rn TCL_OK;  .}./
25720 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66  *.** tclcmd:   f
25730 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65  ile_control_powe
25740 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 20  rsafe_overwrite 
25750 44 42 20 50 53 4f 57 2d 46 4c 41 47 0a 2a 2a 0a  DB PSOW-FLAG.**.
25760 2a 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d  ** This TCL comm
25770 61 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c  and runs the sql
25780 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
25790 6c 20 69 6e 74 65 72 66 61 63 65 20 77 69 74 68  l interface with
257a0 0a 2a 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 46  .** the SQLITE_F
257b0 43 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f  CNTL_POWERSAFE_O
257c0 56 45 52 57 52 49 54 45 20 6f 70 63 6f 64 65 2e  VERWRITE opcode.
257d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
257e0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65  ile_control_powe
257f0 72 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 28  rsafe_overwrite(
25800 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
25810 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
25820 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
25830 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
25840 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
25850 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
25860 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
25870 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
25880 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
25890 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
258a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
258b0 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
258c0 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
258d0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
258e0 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
258f0 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
25900 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
25910 72 63 3b 0a 20 20 69 6e 74 20 62 3b 0a 20 20 63  rc;.  int b;.  c
25920 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 0a 20 20 69  har z[100];..  i
25930 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
25940 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
25950 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
25960 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
25970 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
25980 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
25990 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
259a0 29 2c 20 22 20 44 42 20 46 4c 41 47 22 2c 20 30  ), " DB FLAG", 0
259b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
259c0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
259d0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
259e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
259f0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
25a00 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  &db) ){.    retu
25a10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
25a20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  }.  if( Tcl_GetI
25a30 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
25a40 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 62 29 20 29  , objv[2], &b) )
25a50 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
25a60 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
25a70 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64  3_file_control(d
25a80 62 2c 4e 55 4c 4c 2c 53 51 4c 49 54 45 5f 46 43  b,NULL,SQLITE_FC
25a90 4e 54 4c 5f 50 4f 57 45 52 53 41 46 45 5f 4f 56  NTL_POWERSAFE_OV
25aa0 45 52 57 52 49 54 45 2c 28 76 6f 69 64 2a 29 26  ERWRITE,(void*)&
25ab0 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  b);.  sqlite3_sn
25ac0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
25ad0 2c 20 7a 2c 20 22 25 64 20 25 64 22 2c 20 72 63  , z, "%d %d", rc
25ae0 2c 20 62 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65  , b);.  Tcl_Appe
25af0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
25b00 20 7a 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20   z, (char*)0);. 
25b10 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20   return TCL_OK; 
25b20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63   .}.../*.** tclc
25b30 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72  md:   file_contr
25b40 6f 6c 5f 76 66 73 6e 61 6d 65 20 44 42 20 3f 41  ol_vfsname DB ?A
25b50 55 58 44 42 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75  UXDB?.**.** Retu
25b60 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  rn a string that
25b70 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 73   describes the s
25b80 74 61 63 6b 20 6f 66 20 56 46 53 65 73 2e 0a 2a  tack of VFSes..*
25b90 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
25ba0 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d  e_control_vfsnam
25bb0 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  e(.  ClientData 
25bc0 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
25bd0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
25be0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
25bf0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
25c00 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
25c10 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
25c20 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
25c30 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
25c40 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
25c50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
25c60 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
25c70 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
25c80 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
25c90 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
25ca0 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73  uments */.){.  s
25cb0 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f  qlite3 *db;.  co
25cc0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
25cd0 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 63 68  e = "main";.  ch
25ce0 61 72 20 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30  ar *zVfsName = 0
25cf0 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
25d00 20 26 26 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20   && objc!=3 ){. 
25d10 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
25d20 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
25d30 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
25d40 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
25d50 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
25d60 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
25d70 30 29 2c 20 22 20 44 42 20 3f 41 55 58 44 42 3f  0), " DB ?AUXDB?
25d80 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
25d90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
25da0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
25db0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
25dc0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
25dd0 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
25de0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25df0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63  ;.  }.  if( objc
25e00 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 4e 61  ==3 ){.    zDbNa
25e10 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
25e20 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d  ng(objv[2]);.  }
25e30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  .  sqlite3_file_
25e40 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62 4e  control(db, zDbN
25e50 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54  ame, SQLITE_FCNT
25e60 4c 5f 56 46 53 4e 41 4d 45 2c 28 76 6f 69 64 2a  L_VFSNAME,(void*
25e70 29 26 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 54  )&zVfsName);.  T
25e80 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
25e90 69 6e 74 65 72 70 2c 20 7a 56 66 73 4e 61 6d 65  interp, zVfsName
25ea0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 73  , (char*)0);.  s
25eb0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 56 66 73  qlite3_free(zVfs
25ec0 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
25ed0 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a  TCL_OK;  .}../*.
25ee0 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c  ** tclcmd:   fil
25ef0 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69  e_control_tempfi
25f00 6c 65 6e 61 6d 65 20 44 42 20 3f 41 55 58 44 42  lename DB ?AUXDB
25f10 3f 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ?.**.** Return a
25f20 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
25f30 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
25f40 6e 61 6d 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  name.*/.static i
25f50 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  nt file_control_
25f60 74 65 6d 70 66 69 6c 65 6e 61 6d 65 28 0a 20 20  tempfilename(.  
25f70 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
25f80 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
25f90 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
25fa0 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
25fb0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
25fc0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
25fd0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
25fe0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
25ff0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
26000 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
26010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26020 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
26030 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
26040 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
26050 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
26060 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
26070 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
26080 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22  har *zDbName = "
26090 6d 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a  main";.  char *z
260a0 54 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69 66  TName = 0;..  if
260b0 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62 6a  ( objc!=2 && obj
260c0 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
260d0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
260e0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
260f0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
26100 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
26110 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
26120 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
26130 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b 0a  B ?AUXDB?", 0);.
26140 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
26150 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
26160 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
26170 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
26180 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
26190 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
261a0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
261b0 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b 0a   if( objc==3 ){.
261c0 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54 63      zDbName = Tc
261d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
261e0 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [2]);.  }.  sqli
261f0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
26200 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53 51  (db, zDbName, SQ
26210 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46  LITE_FCNTL_TEMPF
26220 49 4c 45 4e 41 4d 45 2c 20 28 76 6f 69 64 2a 29  ILENAME, (void*)
26230 26 7a 54 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f  &zTName);.  Tcl_
26240 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
26250 65 72 70 2c 20 7a 54 4e 61 6d 65 2c 20 28 63 68  erp, zTName, (ch
26260 61 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65  ar*)0);.  sqlite
26270 33 5f 66 72 65 65 28 7a 54 4e 61 6d 65 29 3b 0a  3_free(zTName);.
26280 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
26290 20 20 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c    .}.../*.** tcl
262a0 63 6d 64 3a 20 20 20 73 71 6c 69 74 65 33 5f 76  cmd:   sqlite3_v
262b0 66 73 5f 6c 69 73 74 0a 2a 2a 0a 2a 2a 20 20 20  fs_list.**.**   
262c0 52 65 74 75 72 6e 20 61 20 74 63 6c 20 6c 69 73  Return a tcl lis
262d0 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  t containing the
262e0 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 72 65   names of all re
262f0 67 69 73 74 65 72 65 64 20 76 66 73 27 73 2e 0a  gistered vfs's..
26300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
26310 73 5f 6c 69 73 74 28 0a 20 20 43 6c 69 65 6e 74  s_list(.  Client
26320 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
26330 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
26340 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
26350 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
26360 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
26370 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
26380 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
26390 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
263a0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
263b0 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
263c0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
263d0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
263e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
263f0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
26400 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
26410 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
26420 2a 70 56 66 73 3b 0a 20 20 54 63 6c 5f 4f 62 6a  *pVfs;.  Tcl_Obj
26430 20 2a 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77   *pRet = Tcl_New
26440 4f 62 6a 28 29 3b 0a 20 20 69 66 28 20 6f 62 6a  Obj();.  if( obj
26450 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
26460 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
26470 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
26480 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
26490 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66  L_ERROR;.  }.  f
264a0 6f 72 28 70 56 66 73 3d 73 71 6c 69 74 65 33 5f  or(pVfs=sqlite3_
264b0 76 66 73 5f 66 69 6e 64 28 30 29 3b 20 70 56 66  vfs_find(0); pVf
264c0 73 3b 20 70 56 66 73 3d 70 56 66 73 2d 3e 70 4e  s; pVfs=pVfs->pN
264d0 65 78 74 29 7b 0a 20 20 20 20 54 63 6c 5f 4c 69  ext){.    Tcl_Li
264e0 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
264f0 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
26500 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
26510 6a 28 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c 20 2d  j(pVfs->zName, -
26520 31 29 29 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 53  1));.  }.  Tcl_S
26530 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
26540 72 70 2c 20 70 52 65 74 29 3b 0a 20 20 72 65 74  rp, pRet);.  ret
26550 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
26560 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
26570 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 20 44   sqlite3_limit D
26580 42 20 49 44 20 56 41 4c 55 45 0a 2a 2a 0a 2a 2a  B ID VALUE.**.**
26590 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e   This TCL comman
265a0 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74  d runs the sqlit
265b0 65 33 5f 6c 69 6d 69 74 20 69 6e 74 65 72 66 61  e3_limit interfa
265c0 63 65 20 61 6e 64 0a 2a 2a 20 76 65 72 69 66 69  ce and.** verifi
265d0 65 73 20 63 6f 72 72 65 63 74 20 6f 70 65 72 61  es correct opera
265e0 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 61 6d 65  tion of the same
265f0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26600 74 65 73 74 5f 6c 69 6d 69 74 28 0a 20 20 43 6c  test_limit(.  Cl
26610 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
26620 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
26630 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
26640 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
26650 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
26660 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
26670 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
26680 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
26690 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
266a0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
266b0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
266c0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
266d0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
266e0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
266f0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
26700 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
26710 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *db;.  int rc;. 
26720 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
26730 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
26740 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e   *zName;.     in
26750 74 20 69 64 3b 0a 20 20 7d 20 61 49 64 5b 5d 20  t id;.  } aId[] 
26760 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
26770 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 22 2c  E_LIMIT_LENGTH",
26780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
26790 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54  LITE_LIMIT_LENGT
267a0 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
267b0 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45  },.    { "SQLITE
267c0 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
267d0 48 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  H",          SQL
267e0 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
267f0 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 7d  NGTH           }
26800 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f  ,.    { "SQLITE_
26810 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 22 2c 20 20  LIMIT_COLUMN",  
26820 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
26830 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20  TE_LIMIT_COLUMN 
26840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
26850 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c  .    { "SQLITE_L
26860 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 22  IMIT_EXPR_DEPTH"
26870 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
26880 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
26890 54 48 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  TH           },.
268a0 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49      { "SQLITE_LI
268b0 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MIT_COMPOUND_SEL
268c0 45 43 54 22 2c 20 20 20 20 20 53 51 4c 49 54 45  ECT",     SQLITE
268d0 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
268e0 53 45 4c 45 43 54 20 20 20 20 20 20 7d 2c 0a 20  SELECT      },. 
268f0 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
26900 49 54 5f 56 44 42 45 5f 4f 50 22 2c 20 20 20 20  IT_VDBE_OP",    
26910 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
26920 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20  LIMIT_VDBE_OP   
26930 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
26940 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
26950 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 22 2c  T_FUNCTION_ARG",
26960 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
26970 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
26980 47 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  G         },.   
26990 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
269a0 5f 41 54 54 41 43 48 45 44 22 2c 20 20 20 20 20  _ATTACHED",     
269b0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
269c0 4d 49 54 5f 41 54 54 41 43 48 45 44 20 20 20 20  MIT_ATTACHED    
269d0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
269e0 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
269f0 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
26a00 47 54 48 22 2c 20 53 51 4c 49 54 45 5f 4c 49 4d  GTH", SQLITE_LIM
26a10 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
26a20 4c 45 4e 47 54 48 20 20 7d 2c 0a 20 20 20 20 7b  LENGTH  },.    {
26a30 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56   "SQLITE_LIMIT_V
26a40 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 22 2c  ARIABLE_NUMBER",
26a50 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
26a60 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
26a70 52 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20  R      },.    { 
26a80 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  "SQLITE_LIMIT_TR
26a90 49 47 47 45 52 5f 44 45 50 54 48 22 2c 20 20 20  IGGER_DEPTH",   
26aa0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
26ab0 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 20  _TRIGGER_DEPTH  
26ac0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
26ad0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
26ae0 4b 45 52 5f 54 48 52 45 41 44 53 22 2c 20 20 20  KER_THREADS",   
26af0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
26b00 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20  WORKER_THREADS  
26b10 20 20 20 20 20 7d 2c 0a 20 20 20 20 0a 20 20 20       },.    .   
26b20 20 2f 2a 20 4f 75 74 20 6f 66 20 72 61 6e 67 65   /* Out of range
26b30 20 74 65 73 74 20 63 61 73 65 73 20 2a 2f 0a 20   test cases */. 
26b40 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d     { "SQLITE_LIM
26b50 49 54 5f 54 4f 4f 53 4d 41 4c 4c 22 2c 20 20 20  IT_TOOSMALL",   
26b60 20 20 20 20 20 20 20 20 20 2d 31 2c 20 20 20 20           -1,    
26b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26b80 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
26b90 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
26ba0 54 5f 54 4f 4f 42 49 47 22 2c 20 20 20 20 20 20  T_TOOBIG",      
26bb0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
26bc0 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45  IMIT_WORKER_THRE
26bd0 41 44 53 2b 31 20 20 20 20 20 7d 2c 0a 20 20 7d  ADS+1     },.  }
26be0 3b 0a 20 20 69 6e 74 20 69 2c 20 69 64 3b 0a 20  ;.  int i, id;. 
26bf0 20 69 6e 74 20 76 61 6c 3b 0a 20 20 63 6f 6e 73   int val;.  cons
26c00 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a 0a 20 20  t char *zId;..  
26c10 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20  if( objc!=4 ){. 
26c20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
26c30 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
26c40 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
26c50 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
26c60 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
26c70 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
26c80 30 29 2c 20 22 20 44 42 20 49 44 20 56 41 4c 55  0), " DB ID VALU
26c90 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  E", 0);.    retu
26ca0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
26cb0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
26cc0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
26cd0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
26ce0 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75  1]), &db) ) retu
26cf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
26d00 7a 49 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  zId = Tcl_GetStr
26d10 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
26d20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
26d30 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49  f(aId)/sizeof(aI
26d40 64 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  d[0]); i++){.   
26d50 20 69 66 28 20 73 74 72 63 6d 70 28 7a 49 64 2c   if( strcmp(zId,
26d60 20 61 49 64 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d   aId[i].zName)==
26d70 30 20 29 7b 0a 20 20 20 20 20 20 69 64 20 3d 20  0 ){.      id = 
26d80 61 49 64 5b 69 5d 2e 69 64 3b 0a 20 20 20 20 20  aId[i].id;.     
26d90 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
26da0 7d 0a 20 20 69 66 28 20 69 3e 3d 73 69 7a 65 6f  }.  if( i>=sizeo
26db0 66 28 61 49 64 29 2f 73 69 7a 65 6f 66 28 61 49  f(aId)/sizeof(aI
26dc0 64 5b 30 5d 29 20 29 7b 0a 20 20 20 20 54 63 6c  d[0]) ){.    Tcl
26dd0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
26de0 74 65 72 70 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c  terp, "unknown l
26df0 69 6d 69 74 20 74 79 70 65 3a 20 22 2c 20 7a 49  imit type: ", zI
26e00 64 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20  d, (char*)0);.  
26e10 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
26e20 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
26e30 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
26e40 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
26e50 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e 20   &val) ) return 
26e60 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
26e70 3d 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  = sqlite3_limit(
26e80 64 62 2c 20 69 64 2c 20 76 61 6c 29 3b 0a 20 20  db, id, val);.  
26e90 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
26ea0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
26eb0 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72  IntObj(rc));.  r
26ec0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a  eturn TCL_OK;  .
26ed0 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
26ee0 20 20 73 61 76 65 5f 70 72 6e 67 5f 73 74 61 74    save_prng_stat
26ef0 65 0a 2a 2a 0a 2a 2a 20 53 61 76 65 20 74 68 65  e.**.** Save the
26f00 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 73   state of the ps
26f10 65 75 64 6f 2d 72 61 6e 64 6f 6d 20 6e 75 6d 62  eudo-random numb
26f20 65 72 20 67 65 6e 65 72 61 74 6f 72 2e 0a 2a 2a  er generator..**
26f30 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
26f40 65 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 73  e, verify that s
26f50 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
26f60 72 6f 6c 20 77 6f 72 6b 73 20 65 76 65 6e 20 77  rol works even w
26f70 68 65 6e 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69  hen.** called wi
26f80 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 72 61 6e  th an out-of-ran
26f90 67 65 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74  ge opcode..*/.st
26fa0 61 74 69 63 20 69 6e 74 20 73 61 76 65 5f 70 72  atic int save_pr
26fb0 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
26fc0 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
26fd0 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
26fe0 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
26ff0 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
27000 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
27010 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
27020 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
27030 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
27040 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
27050 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
27060 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
27070 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
27080 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
27090 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
270a0 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
270b0 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73  .){.  int rc = s
270c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
270d0 72 6f 6c 28 39 39 39 39 29 3b 0a 20 20 61 73 73  rol(9999);.  ass
270e0 65 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20  ert( rc==0 );.  
270f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  rc = sqlite3_tes
27100 74 5f 63 6f 6e 74 72 6f 6c 28 2d 31 29 3b 0a 20  t_control(-1);. 
27110 20 61 73 73 65 72 74 28 20 72 63 3d 3d 30 20 29   assert( rc==0 )
27120 3b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  ;.  sqlite3_test
27130 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
27140 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
27150 56 45 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  VE);.  return TC
27160 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63  L_OK;.}./*.** tc
27170 6c 63 6d 64 3a 20 20 72 65 73 74 6f 72 65 5f 70  lcmd:  restore_p
27180 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61  rng_state.*/.sta
27190 74 69 63 20 69 6e 74 20 72 65 73 74 6f 72 65 5f  tic int restore_
271a0 70 72 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c  prng_state(.  Cl
271b0 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
271c0 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
271d0 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
271e0 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
271f0 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
27200 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
27210 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
27220 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
27230 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
27240 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
27250 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
27260 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
27270 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
27280 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
27290 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
272a0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
272b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
272c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
272d0 47 5f 52 45 53 54 4f 52 45 29 3b 0a 20 20 72 65  G_RESTORE);.  re
272e0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f  turn TCL_OK;.}./
272f0 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 72 65  *.** tclcmd:  re
27300 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a  set_prng_state.*
27310 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
27320 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 28 0a 20  et_prng_state(. 
27330 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
27340 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
27350 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
27360 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
27370 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
27380 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
27390 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
273a0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
273b0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
273c0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
273d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
273e0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
273f0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
27400 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
27410 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
27420 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
27430 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
27440 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
27450 50 52 4e 47 5f 52 45 53 45 54 29 3b 0a 20 20 72  PRNG_RESET);.  r
27460 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
27470 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
27480 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62 65 5f  database_may_be_
27490 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e  corrupt.**.** In
274a0 64 69 63 61 74 65 20 74 68 61 74 20 64 61 74 61  dicate that data
274b0 62 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74  base files might
274c0 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 49 6e   be corrupt.  In
274d0 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 73 65   other words, se
274e0 74 20 74 68 65 20 6e 6f 72 6d 61 6c 0a 2a 2a 20  t the normal.** 
274f0 73 74 61 74 65 20 6f 66 20 6f 70 65 72 61 74 69  state of operati
27500 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
27510 74 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f 62  t database_may_b
27520 65 5f 63 6f 72 72 75 70 74 28 0a 20 20 43 6c 69  e_corrupt(.  Cli
27530 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
27540 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
27550 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
27560 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
27570 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
27580 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
27590 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
275a0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
275b0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
275c0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
275d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
275e0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
275f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
27600 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
27610 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
27620 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74  /.){.  sqlite3_t
27630 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
27640 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
27650 52 5f 43 4f 52 52 55 50 54 2c 20 30 29 3b 0a 20  R_CORRUPT, 0);. 
27660 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
27670 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  }./*.** tclcmd: 
27680 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f   database_never_
27690 63 6f 72 72 75 70 74 0a 2a 2a 0a 2a 2a 20 49 6e  corrupt.**.** In
276a0 64 69 63 61 74 65 20 74 68 61 74 20 64 61 74 61  dicate that data
276b0 62 61 73 65 20 66 69 6c 65 73 20 61 72 65 20 61  base files are a
276c0 6c 77 61 79 73 20 77 65 6c 6c 2d 66 6f 72 6d 65  lways well-forme
276d0 64 2e 20 20 54 68 69 73 20 65 6e 61 62 6c 65 73  d.  This enables
276e0 20 65 78 74 72 61 20 61 73 73 65 72 74 28 29 0a   extra assert().
276f0 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  ** statements th
27700 61 74 20 74 65 73 74 20 63 6f 6e 64 69 74 69 6f  at test conditio
27710 6e 73 20 74 68 61 74 20 61 72 65 20 61 6c 77 61  ns that are alwa
27720 79 73 20 74 72 75 65 20 66 6f 72 20 77 65 6c 6c  ys true for well
27730 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65  -formed database
27740 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
27750 20 64 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f   database_never_
27760 63 6f 72 72 75 70 74 28 0a 20 20 43 6c 69 65 6e  corrupt(.  Clien
27770 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
27780 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
27790 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
277a0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
277b0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
277c0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
277d0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
277e0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
277f0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
27800 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
27810 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
27820 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
27830 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
27840 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
27850 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
27860 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73  ){.  sqlite3_tes
27870 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
27880 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
27890 43 4f 52 52 55 50 54 2c 20 31 29 3b 0a 20 20 72  CORRUPT, 1);.  r
278a0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
278b0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
278c0 70 63 61 63 68 65 5f 73 74 61 74 73 0a 2a 2f 0a  pcache_stats.*/.
278d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
278e0 70 63 61 63 68 65 5f 73 74 61 74 73 28 0a 20 20  pcache_stats(.  
278f0 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
27900 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
27910 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
27920 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
27930 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
27940 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
27950 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
27960 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27970 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27980 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27990 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
279a0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
279b0 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
279c0 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
279d0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
279e0 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 4d  s */.){.  int nM
279f0 69 6e 3b 0a 20 20 69 6e 74 20 6e 4d 61 78 3b 0a  in;.  int nMax;.
27a00 20 20 69 6e 74 20 6e 43 75 72 72 65 6e 74 3b 0a    int nCurrent;.
27a10 20 20 69 6e 74 20 6e 52 65 63 79 63 6c 61 62 6c    int nRecyclabl
27a20 65 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  e;.  Tcl_Obj *pR
27a30 65 74 3b 0a 0a 20 20 73 71 6c 69 74 65 33 50 63  et;..  sqlite3Pc
27a40 61 63 68 65 53 74 61 74 73 28 26 6e 43 75 72 72  acheStats(&nCurr
27a50 65 6e 74 2c 20 26 6e 4d 61 78 2c 20 26 6e 4d 69  ent, &nMax, &nMi
27a60 6e 2c 20 26 6e 52 65 63 79 63 6c 61 62 6c 65 29  n, &nRecyclable)
27a70 3b 0a 0a 20 20 70 52 65 74 20 3d 20 54 63 6c 5f  ;..  pRet = Tcl_
27a80 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f  NewObj();.  Tcl_
27a90 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
27aa0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
27ab0 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  t, Tcl_NewString
27ac0 4f 62 6a 28 22 63 75 72 72 65 6e 74 22 2c 20 2d  Obj("current", -
27ad0 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
27ae0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
27af0 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
27b00 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 75 72  l_NewIntObj(nCur
27b10 72 65 6e 74 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  rent));.  Tcl_Li
27b20 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
27b30 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c  nt(interp, pRet,
27b40 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
27b50 6a 28 22 6d 61 78 22 2c 20 2d 31 29 29 3b 0a 20  j("max", -1));. 
27b60 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
27b70 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
27b80 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49  , pRet, Tcl_NewI
27b90 6e 74 4f 62 6a 28 6e 4d 61 78 29 29 3b 0a 20 20  ntObj(nMax));.  
27ba0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
27bb0 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c  dElement(interp,
27bc0 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74   pRet, Tcl_NewSt
27bd0 72 69 6e 67 4f 62 6a 28 22 6d 69 6e 22 2c 20 2d  ringObj("min", -
27be0 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  1));.  Tcl_ListO
27bf0 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
27c00 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
27c10 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4d 69 6e  l_NewIntObj(nMin
27c20 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
27c30 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
27c40 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
27c50 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 72  _NewStringObj("r
27c60 65 63 79 63 6c 61 62 6c 65 22 2c 20 2d 31 29 29  ecyclable", -1))
27c70 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
27c80 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
27c90 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
27ca0 65 77 49 6e 74 4f 62 6a 28 6e 52 65 63 79 63 6c  ewIntObj(nRecycl
27cb0 61 62 6c 65 29 29 3b 0a 0a 20 20 54 63 6c 5f 53  able));..  Tcl_S
27cc0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
27cd0 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65  rp, pRet);..  re
27ce0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
27cf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
27d00 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
27d10 46 59 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  FY.static void t
27d20 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
27d30 79 5f 63 62 28 76 6f 69 64 20 2a 2a 61 41 72 67  y_cb(void **aArg
27d40 2c 20 69 6e 74 20 6e 41 72 67 29 7b 0a 20 20 69  , int nArg){.  i
27d50 6e 74 20 69 69 3b 0a 20 20 66 6f 72 28 69 69 3d  nt ii;.  for(ii=
27d60 30 3b 20 69 69 3c 6e 41 72 67 3b 20 69 69 2b 2b  0; ii<nArg; ii++
27d70 29 7b 0a 20 20 20 20 54 63 6c 5f 45 76 61 6c 45  ){.    Tcl_EvalE
27d80 78 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29  x((Tcl_Interp *)
27d90 61 41 72 67 5b 69 69 5d 2c 20 22 75 6e 6c 6f 63  aArg[ii], "unloc
27da0 6b 5f 6e 6f 74 69 66 79 22 2c 20 2d 31 2c 20 54  k_notify", -1, T
27db0 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42 41 4c 29 3b  CL_EVAL_GLOBAL);
27dc0 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
27dd0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55   SQLITE_ENABLE_U
27de0 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 20 2a 2f 0a  NLOCK_NOTIFY */.
27df0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
27e00 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b 5f 6e  sqlite3_unlock_n
27e10 6f 74 69 66 79 20 64 62 0a 2a 2f 0a 23 69 66 64  otify db.*/.#ifd
27e20 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
27e30 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73  _UNLOCK_NOTIFY.s
27e40 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 75  tatic int test_u
27e50 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 0a 20 20  nlock_notify(.  
27e60 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
27e70 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
27e80 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
27e90 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
27ea0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
27eb0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
27ec0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
27ed0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
27ee0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
27ef0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
27f00 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
27f10 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
27f20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
27f30 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
27f40 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
27f50 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
27f60 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
27f70 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
27f80 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
27f90 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
27fa0 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
27fb0 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
27fc0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
27fd0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
27fe0 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
27ff0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
28000 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75    rc = sqlite3_u
28010 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 28 64 62 2c  nlock_notify(db,
28020 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74   test_unlock_not
28030 69 66 79 5f 63 62 2c 20 28 76 6f 69 64 20 2a 29  ify_cb, (void *)
28040 69 6e 74 65 72 70 29 3b 0a 20 20 54 63 6c 5f 53  interp);.  Tcl_S
28050 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
28060 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
28070 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
28080 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
28090 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
280a0 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20  ../*.** tclcmd: 
280b0 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
280c0 63 6b 70 6f 69 6e 74 20 64 62 20 3f 4e 41 4d 45  ckpoint db ?NAME
280d0 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ?.*/.static int 
280e0 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  test_wal_checkpo
280f0 69 6e 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  int(.  ClientDat
28100 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
28110 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
28120 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
28130 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
28140 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
28150 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
28160 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
28170 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
28180 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
28190 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
281a0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
281b0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
281c0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
281d0 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 0a   char *zDb = 0;.
281e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
281f0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
28200 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62 6a 63 21  objc!=3 && objc!
28210 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =2 ){.    Tcl_Wr
28220 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
28230 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
28240 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65  ?NAME?");.    re
28250 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28260 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62    }..  if( getDb
28270 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
28280 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
28290 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a  jv[1]), &db) ){.
282a0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
282b0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
282c0 6f 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a  objc==3 ){.    z
282d0 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
282e0 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7d  ng(objv[2]);.  }
282f0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
28300 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64  wal_checkpoint(d
28310 62 2c 20 7a 44 62 29 3b 0a 20 20 54 63 6c 5f 53  b, zDb);.  Tcl_S
28320 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
28330 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
28340 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
28350 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
28360 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
28370 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74 65   tclcmd:  sqlite
28380 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
28390 5f 76 32 20 64 62 20 4d 4f 44 45 20 3f 4e 41 4d  _v2 db MODE ?NAM
283a0 45 3f 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  E?.**.** This co
283b0 6d 6d 61 6e 64 20 63 61 6c 6c 73 20 74 68 65 20  mmand calls the 
283c0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
283d0 32 28 29 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  2() function wit
283e0 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 0a  h the specified.
283f0 2a 2a 20 6d 6f 64 65 20 61 72 67 75 6d 65 6e 74  ** mode argument
28400 20 28 70 61 73 73 69 76 65 2c 20 66 75 6c 6c 20   (passive, full 
28410 6f 72 20 72 65 73 74 61 72 74 29 2e 20 49 66 20  or restart). If 
28420 70 72 65 73 65 6e 74 2c 20 74 68 65 20 64 61 74  present, the dat
28430 61 62 61 73 65 20 6e 61 6d 65 0a 2a 2a 20 4e 41  abase name.** NA
28440 4d 45 20 69 73 20 70 61 73 73 65 64 20 61 73 20  ME is passed as 
28450 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
28460 65 6e 74 20 74 6f 20 77 61 6c 5f 63 68 65 63 6b  ent to wal_check
28470 70 6f 69 6e 74 5f 76 32 28 29 2e 20 49 66 20 69  point_v2(). If i
28480 74 20 74 68 65 0a 2a 2a 20 4e 41 4d 45 20 61 72  t the.** NAME ar
28490 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 70 72  gument is not pr
284a0 65 73 65 6e 74 2c 20 61 20 4e 55 4c 4c 20 70 6f  esent, a NULL po
284b0 69 6e 74 65 72 20 69 73 20 70 61 73 73 65 64 20  inter is passed 
284c0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
284d0 66 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  f wal_checkpoint
284e0 5f 76 32 28 29 20 72 65 74 75 72 6e 73 20 61 6e  _v2() returns an
284f0 79 20 76 61 6c 75 65 20 6f 74 68 65 72 20 74 68  y value other th
28500 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 6f  an SQLITE_BUSY o
28510 72 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  r.** SQLITE_OK, 
28520 74 68 65 6e 20 74 68 69 73 20 63 6f 6d 6d 61 6e  then this comman
28530 64 20 72 65 74 75 72 6e 73 20 54 43 4c 5f 45 52  d returns TCL_ER
28540 52 4f 52 2e 20 54 68 65 20 54 63 6c 20 72 65 73  ROR. The Tcl res
28550 75 6c 74 20 69 73 20 73 65 74 0a 2a 2a 20 74 6f  ult is set.** to
28560 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
28570 67 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ge obtained from
28580 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
28590 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
285a0 73 65 2c 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  se, this command
285b0 20 72 65 74 75 72 6e 73 20 61 20 6c 69 73 74 20   returns a list 
285c0 6f 66 20 74 68 72 65 65 20 69 6e 74 65 67 65 72  of three integer
285d0 73 2e 20 54 68 65 20 66 69 72 73 74 20 69 6e 74  s. The first int
285e0 65 67 65 72 0a 2a 2a 20 69 73 20 31 20 69 66 20  eger.** is 1 if 
285f0 53 51 4c 49 54 45 5f 42 55 53 59 20 77 61 73 20  SQLITE_BUSY was 
28600 72 65 74 75 72 6e 65 64 2c 20 6f 72 20 30 20 6f  returned, or 0 o
28610 74 68 65 72 77 69 73 65 2e 20 54 68 65 20 66 6f  therwise. The fo
28620 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 69 6e 74 65  llowing two inte
28630 67 65 72 73 0a 2a 2a 20 61 72 65 20 74 68 65 20  gers.** are the 
28640 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
28650 76 69 61 20 74 68 65 20 6f 75 74 70 75 74 20 70  via the output p
28660 61 72 61 6d 65 74 65 72 73 20 62 79 20 77 61 6c  arameters by wal
28670 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
28680 20 2d 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72   -.** the number
28690 20 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68   of frames in th
286a0 65 20 6c 6f 67 20 61 6e 64 20 74 68 65 20 6e 75  e log and the nu
286b0 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
286c0 6e 20 74 68 65 20 6c 6f 67 0a 2a 2a 20 74 68 61  n the log.** tha
286d0 74 20 68 61 76 65 20 62 65 65 6e 20 63 68 65 63  t have been chec
286e0 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 73 74 61  kpointed..*/.sta
286f0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 77 61 6c  tic int test_wal
28700 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a  _checkpoint_v2(.
28710 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
28720 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
28730 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
28740 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
28750 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
28760 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
28770 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
28780 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
28790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
287a0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
287b0 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
287c0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
287d0 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
287e0 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
287f0 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c   *zDb = 0;.  sql
28800 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
28810 72 63 3b 0a 0a 20 20 69 6e 74 20 65 4d 6f 64 65  rc;..  int eMode
28820 3b 0a 20 20 69 6e 74 20 6e 4c 6f 67 20 3d 20 2d  ;.  int nLog = -
28830 35 35 35 3b 0a 20 20 69 6e 74 20 6e 43 6b 70 74  555;.  int nCkpt
28840 20 3d 20 2d 35 35 35 3b 0a 20 20 54 63 6c 5f 4f   = -555;.  Tcl_O
28850 62 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e  bj *pRet;..  con
28860 73 74 20 63 68 61 72 20 2a 20 61 4d 6f 64 65 5b  st char * aMode[
28870 5d 20 3d 20 7b 20 22 70 61 73 73 69 76 65 22 2c  ] = { "passive",
28880 20 22 66 75 6c 6c 22 2c 20 22 72 65 73 74 61 72   "full", "restar
28890 74 22 2c 20 30 20 7d 3b 0a 20 20 61 73 73 65 72  t", 0 };.  asser
288a0 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  t( SQLITE_CHECKP
288b0 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d 30 20  OINT_PASSIVE==0 
288c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
288d0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
288e0 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73 73 65  ULL==1 );.  asse
288f0 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
28900 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d 3d 32  POINT_RESTART==2
28910 20 29 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   );..  if( objc!
28920 3d 33 20 26 26 20 6f 62 6a 63 21 3d 34 20 29 7b  =3 && objc!=4 ){
28930 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
28940 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
28950 20 6f 62 6a 76 2c 20 22 44 42 20 4d 4f 44 45 20   objv, "DB MODE 
28960 3f 4e 41 4d 45 3f 22 29 3b 0a 20 20 20 20 72 65  ?NAME?");.    re
28970 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28980 20 20 7d 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d    }..  if( objc=
28990 3d 34 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20  =4 ){.    zDb = 
289a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
289b0 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 20 20 69 66  jv[3]);.  }.  if
289c0 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
289d0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
289e0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
289f0 64 62 29 0a 20 20 20 7c 7c 20 54 63 6c 5f 47 65  db).   || Tcl_Ge
28a00 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28 69 6e  tIndexFromObj(in
28a10 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 61  terp, objv[2], a
28a20 4d 6f 64 65 2c 20 22 6d 6f 64 65 22 2c 20 30 2c  Mode, "mode", 0,
28a30 20 26 65 4d 6f 64 65 29 20 0a 20 20 29 7b 0a 20   &eMode) .  ){. 
28a40 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
28a50 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ROR;.  }..  rc =
28a60 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
28a70 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20 7a  ckpoint_v2(db, z
28a80 44 62 2c 20 65 4d 6f 64 65 2c 20 26 6e 4c 6f 67  Db, eMode, &nLog
28a90 2c 20 26 6e 43 6b 70 74 29 3b 0a 20 20 69 66 28  , &nCkpt);.  if(
28aa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
28ab0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 42 55 53  & rc!=SQLITE_BUS
28ac0 59 20 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74  Y ){.    Tcl_Set
28ad0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
28ae0 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 65  char *)sqlite3_e
28af0 72 72 6d 73 67 28 64 62 29 2c 20 54 43 4c 5f 56  rrmsg(db), TCL_V
28b00 4f 4c 41 54 49 4c 45 29 3b 0a 20 20 20 20 72 65  OLATILE);.    re
28b10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28b20 20 20 7d 0a 0a 20 20 70 52 65 74 20 3d 20 54 63    }..  pRet = Tc
28b30 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 54 63  l_NewObj();.  Tc
28b40 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45  l_ListObjAppendE
28b50 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70  lement(interp, p
28b60 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  Ret, Tcl_NewIntO
28b70 62 6a 28 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  bj(rc==SQLITE_BU
28b80 53 59 3f 31 3a 30 29 29 3b 0a 20 20 54 63 6c 5f  SY?1:0));.  Tcl_
28b90 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
28ba0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
28bb0 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
28bc0 28 6e 4c 6f 67 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nLog));.  Tcl_L
28bd0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
28be0 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
28bf0 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
28c00 6e 43 6b 70 74 29 29 3b 0a 20 20 54 63 6c 5f 53  nCkpt));.  Tcl_S
28c10 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
28c20 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20 72 65  rp, pRet);..  re
28c30 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
28c40 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 74  /*.** tclcmd:  t
28c50 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 20  est_sqlite3_log 
28c60 3f 53 43 52 49 50 54 3f 0a 2a 2f 0a 73 74 61 74  ?SCRIPT?.*/.stat
28c70 69 63 20 73 74 72 75 63 74 20 4c 6f 67 43 61 6c  ic struct LogCal
28c80 6c 62 61 63 6b 20 7b 0a 20 20 54 63 6c 5f 49 6e  lback {.  Tcl_In
28c90 74 65 72 70 20 2a 70 49 6e 74 65 72 70 3b 0a 20  terp *pInterp;. 
28ca0 20 54 63 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 3b 0a   Tcl_Obj *pObj;.
28cb0 7d 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 20 3d 20  } logcallback = 
28cc0 7b 30 2c 20 30 7d 3b 0a 73 74 61 74 69 63 20 76  {0, 0};.static v
28cd0 6f 69 64 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b  oid xLogcallback
28ce0 28 76 6f 69 64 20 2a 75 6e 75 73 65 64 2c 20 69  (void *unused, i
28cf0 6e 74 20 65 72 72 2c 20 63 68 61 72 20 2a 7a 4d  nt err, char *zM
28d00 73 67 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  sg){.  Tcl_Obj *
28d10 70 4e 65 77 20 3d 20 54 63 6c 5f 44 75 70 6c 69  pNew = Tcl_Dupli
28d20 63 61 74 65 4f 62 6a 28 6c 6f 67 63 61 6c 6c 62  cateObj(logcallb
28d30 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 54 63 6c  ack.pObj);.  Tcl
28d40 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 4e  _IncrRefCount(pN
28d50 65 77 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  ew);.  Tcl_ListO
28d60 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
28d70 0a 20 20 20 20 20 20 30 2c 20 70 4e 65 77 2c 20  .      0, pNew, 
28d80 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a  Tcl_NewStringObj
28d90 28 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  (sqlite3ErrName(
28da0 65 72 72 29 2c 20 2d 31 29 0a 20 20 29 3b 0a 20  err), -1).  );. 
28db0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
28dc0 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 4e 65  ndElement(0, pNe
28dd0 77 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  w, Tcl_NewString
28de0 4f 62 6a 28 7a 4d 73 67 2c 20 2d 31 29 29 3b 0a  Obj(zMsg, -1));.
28df0 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28    Tcl_EvalObjEx(
28e00 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74  logcallback.pInt
28e10 65 72 70 2c 20 70 4e 65 77 2c 20 54 43 4c 5f 45  erp, pNew, TCL_E
28e20 56 41 4c 5f 47 4c 4f 42 41 4c 7c 54 43 4c 5f 45  VAL_GLOBAL|TCL_E
28e30 56 41 4c 5f 44 49 52 45 43 54 29 3b 0a 20 20 54  VAL_DIRECT);.  T
28e40 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
28e50 70 4e 65 77 29 3b 0a 7d 0a 73 74 61 74 69 63 20  pNew);.}.static 
28e60 69 6e 74 20 74 65 73 74 5f 73 71 6c 69 74 65 33  int test_sqlite3
28e70 5f 6c 6f 67 28 0a 20 20 43 6c 69 65 6e 74 44 61  _log(.  ClientDa
28e80 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20  ta clientData,. 
28e90 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
28ea0 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
28eb0 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
28ec0 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
28ed0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
28ee0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
28ef0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
28f00 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
28f10 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
28f20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
28f30 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
28f40 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 3e 32 20  ){.  if( objc>2 
28f50 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
28f60 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
28f70 31 2c 20 6f 62 6a 76 2c 20 22 53 43 52 49 50 54  1, objv, "SCRIPT
28f80 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
28f90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
28fa0 69 66 28 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e  if( logcallback.
28fb0 70 4f 62 6a 20 29 7b 0a 20 20 20 20 54 63 6c 5f  pObj ){.    Tcl_
28fc0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67  DecrRefCount(log
28fd0 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a  callback.pObj);.
28fe0 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e      logcallback.
28ff0 70 4f 62 6a 20 3d 20 30 3b 0a 20 20 20 20 6c 6f  pObj = 0;.    lo
29000 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72  gcallback.pInter
29010 70 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  p = 0;.    sqlit
29020 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45  e3_config(SQLITE
29030 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c 20 30 2c 20  _CONFIG_LOG, 0, 
29040 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62  0);.  }.  if( ob
29050 6a 63 3e 31 20 29 7b 0a 20 20 20 20 6c 6f 67 63  jc>1 ){.    logc
29060 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20 3d 20 6f  allback.pObj = o
29070 62 6a 76 5b 31 5d 3b 0a 20 20 20 20 54 63 6c 5f  bjv[1];.    Tcl_
29080 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 67  IncrRefCount(log
29090 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 29 3b 0a  callback.pObj);.
290a0 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e      logcallback.
290b0 70 49 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  pInterp = interp
290c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
290d0 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
290e0 49 47 5f 4c 4f 47 2c 20 78 4c 6f 67 63 61 6c 6c  IG_LOG, xLogcall
290f0 62 61 63 6b 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  back, 0);.  }.  
29100 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
29110 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 74 63 6c 5f  ../*.**     tcl_
29120 6f 62 6a 70 72 6f 63 20 43 4f 4d 4d 41 4e 44 4e  objproc COMMANDN
29130 41 4d 45 20 41 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a  AME ARGS....**.*
29140 2a 20 52 75 6e 20 61 20 54 43 4c 20 63 6f 6d 6d  * Run a TCL comm
29150 61 6e 64 20 75 73 69 6e 67 20 69 74 73 20 6f 62  and using its ob
29160 6a 50 72 6f 63 20 69 6e 74 65 72 66 61 63 65 2e  jProc interface.
29170 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f 72    Throw an error
29180 20 69 66 0a 2a 2a 20 74 68 65 20 63 6f 6d 6d 61   if.** the comma
29190 6e 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f  nd has no objPro
291a0 63 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a  c interface..*/.
291b0 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 41 73  static int runAs
291c0 4f 62 6a 50 72 6f 63 28 0a 20 20 76 6f 69 64 20  ObjProc(.  void 
291d0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
291e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
291f0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
29200 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
29210 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 54 63 6c   objv[].){.  Tcl
29220 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f  _CmdInfo cmdInfo
29230 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29  ;.  if( objc<2 )
29240 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
29250 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
29260 2c 20 6f 62 6a 76 2c 20 22 43 4f 4d 4d 41 4e 44  , objv, "COMMAND
29270 20 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75   ...");.    retu
29280 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
29290 7d 0a 20 20 69 66 28 20 21 54 63 6c 5f 47 65 74  }.  if( !Tcl_Get
292a0 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69 6e 74 65  CommandInfo(inte
292b0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
292c0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 63 6d 64  g(objv[1]), &cmd
292d0 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
292e0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
292f0 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
29300 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 0a 20 20 20  ot found: ",.   
29310 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
29320 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
29330 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
29340 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
29350 0a 20 20 7d 0a 20 20 69 66 28 20 63 6d 64 49 6e  .  }.  if( cmdIn
29360 66 6f 2e 6f 62 6a 50 72 6f 63 3d 3d 30 20 29 7b  fo.objProc==0 ){
29370 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
29380 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 63  esult(interp, "c
29390 6f 6d 6d 61 6e 64 20 68 61 73 20 6e 6f 20 6f 62  ommand has no ob
293a0 6a 50 72 6f 63 3a 20 22 2c 0a 20 20 20 20 20 20  jProc: ",.      
293b0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
293c0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68  ng(objv[1]), (ch
293d0 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75  ar*)0);.    retu
293e0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
293f0 7d 0a 20 20 72 65 74 75 72 6e 20 63 6d 64 49 6e  }.  return cmdIn
29400 66 6f 2e 6f 62 6a 50 72 6f 63 28 63 6d 64 49 6e  fo.objProc(cmdIn
29410 66 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61  fo.objClientData
29420 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2d 31  , interp, objc-1
29430 2c 20 6f 62 6a 76 2b 31 29 3b 0a 7d 0a 0a 23 69  , objv+1);.}..#i
29440 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
29450 54 5f 45 58 50 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20  T_EXPLAIN./*.** 
29460 57 41 52 4e 49 4e 47 3a 20 54 68 65 20 66 6f 6c  WARNING: The fol
29470 6c 6f 77 69 6e 67 20 66 75 6e 63 74 69 6f 6e 2c  lowing function,
29480 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
29490 72 79 50 6c 61 6e 28 29 20 69 73 20 61 6e 20 65  ryPlan() is an e
294a0 78 61 63 74 0a 2a 2a 20 63 6f 70 79 20 6f 66 20  xact.** copy of 
294b0 65 78 61 6d 70 6c 65 20 63 6f 64 65 20 66 72 6f  example code fro
294c0 6d 20 65 71 70 2e 69 6e 20 28 65 71 70 2e 68 74  m eqp.in (eqp.ht
294d0 6d 6c 29 2e 20 49 66 20 74 68 69 73 20 63 6f 64  ml). If this cod
294e0 65 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 0a 2a  e is modified,.*
294f0 2a 20 74 68 65 6e 20 74 68 65 20 64 6f 63 75 6d  * then the docum
29500 65 6e 74 61 74 69 6f 6e 20 63 6f 70 79 20 6e 65  entation copy ne
29510 65 64 73 20 74 6f 20 62 65 20 6d 6f 64 69 66 69  eds to be modifi
29520 65 64 20 61 73 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f  ed as well..*/./
29530 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 70 53  *.** Argument pS
29540 74 6d 74 20 69 73 20 61 20 70 72 65 70 61 72 65  tmt is a prepare
29550 64 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  d SQL statement.
29560 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 63   This function c
29570 6f 6d 70 69 6c 65 73 0a 2a 2a 20 61 6e 20 45 58  ompiles.** an EX
29580 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
29590 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 72 65 70 6f   command to repo
295a0 72 74 20 6f 6e 20 74 68 65 20 70 72 65 70 61 72  rt on the prepar
295b0 65 64 20 73 74 61 74 65 6d 65 6e 74 2c 0a 2a 2a  ed statement,.**
295c0 20 61 6e 64 20 70 72 69 6e 74 73 20 74 68 65 20   and prints the 
295d0 72 65 70 6f 72 74 20 74 6f 20 73 74 64 6f 75 74  report to stdout
295e0 20 75 73 69 6e 67 20 70 72 69 6e 74 66 28 29 2e   using printf().
295f0 0a 2a 2f 0a 69 6e 74 20 70 72 69 6e 74 45 78 70  .*/.int printExp
29600 6c 61 69 6e 51 75 65 72 79 50 6c 61 6e 28 73 71  lainQueryPlan(sq
29610 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
29620 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
29630 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
29640 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 53        /* Input S
29650 51 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45  QL */.  char *zE
29660 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 20  xplain;         
29670 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 77          /* SQL w
29680 69 74 68 20 45 58 50 4c 41 49 4e 20 51 55 45 52  ith EXPLAIN QUER
29690 59 20 50 4c 41 4e 20 70 72 65 70 65 6e 64 65 64  Y PLAN prepended
296a0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
296b0 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 20 20 20  mt *pExplain;   
296c0 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65        /* Compile
296d0 64 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  d EXPLAIN QUERY 
296e0 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  PLAN command */.
296f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
29700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29710 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
29720 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 70 72   from sqlite3_pr
29730 65 70 61 72 65 5f 76 32 28 29 20 2a 2f 0a 0a 20  epare_v2() */.. 
29740 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
29750 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  sql(pStmt);.  if
29760 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75  ( zSql==0 ) retu
29770 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
29780 0a 0a 20 20 7a 45 78 70 6c 61 69 6e 20 3d 20 73  ..  zExplain = s
29790 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
297a0 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
297b0 41 4e 20 25 73 22 2c 20 7a 53 71 6c 29 3b 0a 20  AN %s", zSql);. 
297c0 20 69 66 28 20 7a 45 78 70 6c 61 69 6e 3d 3d 30   if( zExplain==0
297d0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
297e0 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 72 63 20 3d 20  _NOMEM;..  rc = 
297f0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
29800 76 32 28 73 71 6c 69 74 65 33 5f 64 62 5f 68 61  v2(sqlite3_db_ha
29810 6e 64 6c 65 28 70 53 74 6d 74 29 2c 20 7a 45 78  ndle(pStmt), zEx
29820 70 6c 61 69 6e 2c 20 2d 31 2c 20 26 70 45 78 70  plain, -1, &pExp
29830 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 73 71 6c 69  lain, 0);.  sqli
29840 74 65 33 5f 66 72 65 65 28 7a 45 78 70 6c 61 69  te3_free(zExplai
29850 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
29860 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
29870 20 72 63 3b 0a 0a 20 20 77 68 69 6c 65 28 20 53   rc;..  while( S
29880 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
29890 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e  e3_step(pExplain
298a0 29 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 53 65  ) ){.    int iSe
298b0 6c 65 63 74 69 64 20 3d 20 73 71 6c 69 74 65 33  lectid = sqlite3
298c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70  _column_int(pExp
298d0 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 69 6e  lain, 0);.    in
298e0 74 20 69 4f 72 64 65 72 20 3d 20 73 71 6c 69 74  t iOrder = sqlit
298f0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
29900 78 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20  xplain, 1);.    
29910 69 6e 74 20 69 46 72 6f 6d 20 3d 20 73 71 6c 69  int iFrom = sqli
29920 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
29930 45 78 70 6c 61 69 6e 2c 20 32 29 3b 0a 20 20 20  Explain, 2);.   
29940 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65   const char *zDe
29950 74 61 69 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  tail = (const ch
29960 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  ar *)sqlite3_col
29970 75 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69  umn_text(pExplai
29980 6e 2c 20 33 29 3b 0a 0a 20 20 20 20 70 72 69 6e  n, 3);..    prin
29990 74 66 28 22 25 64 20 25 64 20 25 64 20 25 73 5c  tf("%d %d %d %s\
299a0 6e 22 2c 20 69 53 65 6c 65 63 74 69 64 2c 20 69  n", iSelectid, i
299b0 4f 72 64 65 72 2c 20 69 46 72 6f 6d 2c 20 7a 44  Order, iFrom, zD
299c0 65 74 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 72  etail);.  }..  r
299d0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 66 69  eturn sqlite3_fi
299e0 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29  nalize(pExplain)
299f0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 20  ;.}..static int 
29a00 74 65 73 74 5f 70 72 69 6e 74 5f 65 71 70 28 0a  test_print_eqp(.
29a10 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
29a20 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
29a30 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
29a40 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
29a50 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
29a60 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
29a70 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
29a80 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
29a90 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
29aa0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
29ab0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
29ac0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
29ad0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
29ae0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
29af0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
29b00 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
29b10 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
29b20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
29b30 20 72 63 20 3d 20 70 72 69 6e 74 45 78 70 6c 61   rc = printExpla
29b40 69 6e 51 75 65 72 79 50 6c 61 6e 28 70 53 74 6d  inQueryPlan(pStm
29b50 74 29 3b 0a 20 20 2f 2a 20 54 68 69 73 20 69 73  t);.  /* This is
29b60 20 6e 65 65 64 65 64 20 6f 6e 20 57 69 6e 64 6f   needed on Windo
29b70 77 73 20 73 6f 20 74 68 61 74 20 61 20 74 65 73  ws so that a tes
29b80 74 20 63 61 73 65 20 75 73 69 6e 67 20 74 68 69  t case using thi
29b90 73 20 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  s .  ** function
29ba0 20 63 61 6e 20 6f 70 65 6e 20 61 20 72 65 61 64   can open a read
29bb0 20 70 69 70 65 20 61 6e 64 20 67 65 74 20 74 68   pipe and get th
29bc0 65 20 6f 75 74 70 75 74 20 6f 66 0a 20 20 2a 2a  e output of.  **
29bd0 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
29be0 72 79 50 6c 61 6e 28 29 20 69 6d 6d 65 64 69 61  ryPlan() immedia
29bf0 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 66 66 6c  tely..  */.  ffl
29c00 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 54  ush(stdout);.  T
29c10 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
29c20 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
29c30 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  rrorName(rc), 0)
29c40 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
29c50 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
29c60 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50 4c 41  QLITE_OMIT_EXPLA
29c70 49 4e 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c  IN */../*.** sql
29c80 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
29c90 6c 20 56 45 52 42 20 41 52 47 53 2e 2e 2e 0a 2a  l VERB ARGS....*
29ca0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
29cb0 74 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 0a  t_test_control(.
29cc0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
29cd0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
29ce0 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
29cf0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
29d00 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
29d10 7b 0a 20 20 73 74 72 75 63 74 20 56 65 72 62 20  {.  struct Verb 
29d20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
29d30 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 6e 74   *zName;.    int
29d40 20 69 3b 0a 20 20 7d 20 61 56 65 72 62 5b 5d 20   i;.  } aVerb[] 
29d50 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49 54  = {.    { "SQLIT
29d60 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
29d70 54 49 4d 45 5f 46 41 55 4c 54 22 2c 20 53 51 4c  TIME_FAULT", SQL
29d80 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
29d90 41 4c 54 49 4d 45 5f 46 41 55 4c 54 20 7d 2c 20  ALTIME_FAULT }, 
29da0 0a 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54  .    { "SQLITE_T
29db0 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
29dc0 4d 41 50 22 2c 20 53 51 4c 49 54 45 5f 54 45 53  MAP", SQLITE_TES
29dd0 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41  TCTRL_SORTER_MMA
29de0 50 20 7d 2c 20 0a 20 20 7d 3b 0a 20 20 69 6e 74  P }, .  };.  int
29df0 20 69 56 65 72 62 3b 0a 20 20 69 6e 74 20 69 46   iVerb;.  int iF
29e00 6c 61 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  lag;.  int rc;..
29e10 20 20 69 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a    if( objc<2 ){.
29e20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
29e30 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
29e40 6f 62 6a 76 2c 20 22 56 45 52 42 20 41 52 47 53  objv, "VERB ARGS
29e50 2e 2e 2e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ...");.    retur
29e60 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29e70 0a 0a 20 20 72 63 20 3d 20 54 63 6c 5f 47 65 74  ..  rc = Tcl_Get
29e80 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75  IndexFromObjStru
29e90 63 74 28 0a 20 20 20 20 20 20 69 6e 74 65 72 70  ct(.      interp
29ea0 2c 20 6f 62 6a 76 5b 31 5d 2c 20 61 56 65 72 62  , objv[1], aVerb
29eb0 2c 20 73 69 7a 65 6f 66 28 61 56 65 72 62 5b 30  , sizeof(aVerb[0
29ec0 5d 29 2c 20 22 56 45 52 42 22 2c 20 30 2c 20 26  ]), "VERB", 0, &
29ed0 69 56 65 72 62 0a 20 20 29 3b 0a 20 20 69 66 28  iVerb.  );.  if(
29ee0 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 72 65   rc!=TCL_OK ) re
29ef0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 46 6c 61  turn rc;..  iFla
29f00 67 20 3d 20 61 56 65 72 62 5b 69 56 65 72 62 5d  g = aVerb[iVerb]
29f10 2e 69 3b 0a 20 20 73 77 69 74 63 68 28 20 69 46  .i;.  switch( iF
29f20 6c 61 67 20 29 7b 0a 20 20 20 20 63 61 73 65 20  lag ){.    case 
29f30 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
29f40 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a  LOCALTIME_FAULT:
29f50 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 61 6c   {.      int val
29f60 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 62 6a 63  ;.      if( objc
29f70 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 54  !=3 ){.        T
29f80 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
29f90 69 6e 74 65 72 70 2c 20 32 2c 20 6f 62 6a 76 2c  interp, 2, objv,
29fa0 20 22 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 20   "ONOFF");.     
29fb0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
29fc0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
29fd0 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
29fe0 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
29ff0 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 76  erp, objv[2], &v
2a000 61 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  al) ) return TCL
2a010 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 73 71  _ERROR;.      sq
2a020 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2a030 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2a040 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55  RL_LOCALTIME_FAU
2a050 4c 54 2c 20 76 61 6c 29 3b 0a 20 20 20 20 20 20  LT, val);.      
2a060 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
2a070 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
2a080 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d  STCTRL_SORTER_MM
2a090 41 50 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  AP: {.      int 
2a0a0 76 61 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  val;.      sqlit
2a0b0 65 33 20 2a 64 62 3b 0a 20 20 20 20 20 20 69 66  e3 *db;.      if
2a0c0 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
2a0d0 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
2a0e0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
2a0f0 20 6f 62 6a 76 2c 20 22 44 42 20 4c 49 4d 49 54   objv, "DB LIMIT
2a100 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
2a110 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a120 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2a130 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2a140 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2a150 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 26 64 62  ng(objv[2]), &db
2a160 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2a170 52 52 4f 52 3b 0a 20 20 20 20 20 20 69 66 28 20  RROR;.      if( 
2a180 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
2a190 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33  j(interp, objv[3
2a1a0 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72  ], &val) ) retur
2a1b0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
2a1c0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
2a1d0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2a1e0 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d  ESTCTRL_SORTER_M
2a1f0 4d 41 50 2c 20 64 62 2c 20 76 61 6c 29 3b 0a 20  MAP, db, val);. 
2a200 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a210 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65 73  }.  }..  Tcl_Res
2a220 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 29  etResult(interp)
2a230 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2a240 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45  K;.}..#if SQLITE
2a250 5f 4f 53 5f 55 4e 49 58 0a 23 69 6e 63 6c 75 64  _OS_UNIX.#includ
2a260 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a 23  e <sys/time.h>.#
2a270 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65 73  include <sys/res
2a280 6f 75 72 63 65 2e 68 3e 0a 0a 73 74 61 74 69 63  ource.h>..static
2a290 20 69 6e 74 20 74 65 73 74 5f 67 65 74 72 75 73   int test_getrus
2a2a0 61 67 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  age(.  void * cl
2a2b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2a2c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2a2d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2a2e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2a2f0 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 62 75  v[].){.  char bu
2a300 66 5b 31 30 32 34 5d 3b 0a 20 20 73 74 72 75 63  f[1024];.  struc
2a310 74 20 72 75 73 61 67 65 20 72 3b 0a 20 20 6d 65  t rusage r;.  me
2a320 6d 73 65 74 28 26 72 2c 20 30 2c 20 73 69 7a 65  mset(&r, 0, size
2a330 6f 66 28 72 29 29 3b 0a 20 20 67 65 74 72 75 73  of(r));.  getrus
2a340 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c  age(RUSAGE_SELF,
2a350 20 26 72 29 3b 0a 0a 20 20 73 70 72 69 6e 74 66   &r);..  sprintf
2a360 28 62 75 66 2c 20 22 72 75 5f 75 74 69 6d 65 3d  (buf, "ru_utime=
2a370 25 64 2e 25 30 36 64 20 72 75 5f 73 74 69 6d 65  %d.%06d ru_stime
2a380 3d 25 64 2e 25 30 36 64 20 72 75 5f 6d 69 6e 66  =%d.%06d ru_minf
2a390 6c 74 3d 25 64 20 72 75 5f 6d 61 6a 66 6c 74 3d  lt=%d ru_majflt=
2a3a0 25 64 22 2c 20 0a 20 20 20 20 28 69 6e 74 29 72  %d", .    (int)r
2a3b0 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 73 65 63  .ru_utime.tv_sec
2a3c0 2c 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69 6d  , (int)r.ru_utim
2a3d0 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20 20  e.tv_usec, .    
2a3e0 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65 2e  (int)r.ru_stime.
2a3f0 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e 72  tv_sec, (int)r.r
2a400 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65 63 2c  u_stime.tv_usec,
2a410 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75 5f   .    (int)r.ru_
2a420 6d 69 6e 66 6c 74 2c 20 28 69 6e 74 29 72 2e 72  minflt, (int)r.r
2a430 75 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b 0a 20 20  u_majflt.  );.  
2a440 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
2a450 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
2a460 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20 2d  StringObj(buf, -
2a470 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  1));.  return TC
2a480 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  L_OK;.}.#endif..
2a490 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2a4a0 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61 74  N./*.** Informat
2a4b0 69 6f 6e 20 70 61 73 73 65 64 20 66 72 6f 6d 20  ion passed from 
2a4c0 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20  the main thread 
2a4d0 69 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f 77 73  into the windows
2a4e0 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a 20   file locker.** 
2a4f0 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65 61  background threa
2a500 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69 6e  d..*/.struct win
2a510 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a 20  32FileLocker {. 
2a520 20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b 20 20   char *evName;  
2a530 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
2a540 65 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c 20  event to signal 
2a550 74 68 72 65 61 64 20 73 74 61 72 74 75 70 20 2a  thread startup *
2a560 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20 20  /.  HANDLE h;   
2a570 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c          /* Handl
2a580 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
2a590 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20 20   be locked */.  
2a5a0 69 6e 74 20 64 65 6c 61 79 31 3b 20 20 20 20 20  int delay1;     
2a5b0 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65 66      /* Delay bef
2a5c0 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a 20  ore locking */. 
2a5d0 20 69 6e 74 20 64 65 6c 61 79 32 3b 20 20 20 20   int delay2;    
2a5e0 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65       /* Delay be
2a5f0 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67 20 2a  fore unlocking *
2a600 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20 20 20  /.  int ok;     
2a610 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69 73          /* Finis
2a620 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74 20  hed ok */.  int 
2a630 65 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  err;            
2a640 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65 72  /* True if an er
2a650 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 7d 3b  ror occurs */.};
2a660 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53 51  .#endif...#if SQ
2a670 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e 63  LITE_OS_WIN.#inc
2a680 6c 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68 3e  lude <process.h>
2a690 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b 67  ./*.** The backg
2a6a0 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68 61  round thread tha
2a6b0 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63 6b  t does file lock
2a6c0 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
2a6d0 6f 69 64 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c  oid win32_file_l
2a6e0 6f 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70 70  ocker(void *pApp
2a6f0 44 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74 20  Data){.  struct 
2a700 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20  win32FileLocker 
2a710 2a 70 20 3d 20 28 73 74 72 75 63 74 20 77 69 6e  *p = (struct win
2a720 33 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70 41  32FileLocker*)pA
2a730 70 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70 2d  ppData;.  if( p-
2a740 3e 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20 48  >evName ){.    H
2a750 41 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e 45  ANDLE ev = OpenE
2a760 76 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49 46  vent(EVENT_MODIF
2a770 59 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c 20  Y_STATE, FALSE, 
2a780 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20 20  p->evName);.    
2a790 69 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20 20  if ( ev ){.     
2a7a0 20 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a 20   SetEvent(ev);. 
2a7b0 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65       CloseHandle
2a7c0 28 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (ev);.    }.  }.
2a7d0 20 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31 20    if( p->delay1 
2a7e0 29 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61 79  ) Sleep(p->delay
2a7f0 31 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46 69  1);.  if( LockFi
2a800 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20 31  le(p->h, 0, 0, 1
2a810 30 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b 0a  00000000, 0) ){.
2a820 20 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c      Sleep(p->del
2a830 61 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63 6b  ay2);.    Unlock
2a840 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c  File(p->h, 0, 0,
2a850 20 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b 0a   100000000, 0);.
2a860 20 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a 20      p->ok = 1;. 
2a870 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 65   }else{.    p->e
2a880 72 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43 6c  rr = 1;.  }.  Cl
2a890 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29 3b  oseHandle(p->h);
2a8a0 0a 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20 70  .  p->h = 0;.  p
2a8b0 2d 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20 20  ->delay1 = 0;.  
2a8c0 70 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a 7d  p->delay2 = 0;.}
2a8d0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51 4c  .#endif..#if SQL
2a8e0 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a 2a  ITE_OS_WIN./*.**
2a8f0 20 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33 32        lock_win32
2a900 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20 44  _file FILENAME D
2a910 45 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a 0a  ELAY1 DELAY2.**.
2a920 2a 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  ** Get an exclus
2a930 69 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c 6f  ive manditory lo
2a940 63 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20 44  ck on file for D
2a950 45 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f 6e  ELAY2 millisecon
2a960 64 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c 41  ds..** Wait DELA
2a970 59 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  Y1 milliseconds 
2a980 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e 67  before acquiring
2a990 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
2a9a0 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 66  atic int win32_f
2a9b0 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69 64  ile_lock(.  void
2a9c0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2a9d0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2a9e0 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2a9f0 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2aa00 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 74  T objv[].){.  st
2aa10 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e 33  atic struct win3
2aa20 32 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d 20  2FileLocker x = 
2aa30 7b 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f  { "win32_file_lo
2aa40 63 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  ck", 0, 0, 0, 0,
2aa50 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68   0 };.  const ch
2aa60 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  ar *zFilename;. 
2aa70 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b   char zBuf[200];
2aa80 0a 20 20 69 6e 74 20 72 65 74 72 79 20 3d 20 30  .  int retry = 0
2aa90 3b 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a 20  ;.  HANDLE ev;. 
2aaa0 20 44 57 4f 52 44 20 77 52 65 73 75 6c 74 3b 0a   DWORD wResult;.
2aab0 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34    .  if( objc!=4
2aac0 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
2aad0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
2aae0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
2aaf0 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20 44  bjv, "FILENAME D
2ab00 45 4c 41 59 31 20 44 45 4c 41 59 32 22 29 3b 0a  ELAY1 DELAY2");.
2ab10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ab20 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2ab30 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20 73  objc==1 ){.    s
2ab40 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2ab50 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
2ab60 75 66 2c 20 22 25 64 20 25 64 20 25 64 20 25 64  uf, "%d %d %d %d
2ab70 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20   %d",.          
2ab80 20 20 20 20 20 20 20 20 20 20 20 78 2e 6f 6b 2c             x.ok,
2ab90 20 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79 31   x.err, x.delay1
2aba0 2c 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68 29  , x.delay2, x.h)
2abb0 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  ;.    Tcl_Append
2abc0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
2abd0 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  Buf, (char*)0);.
2abe0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
2abf0 4b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20  K;.  }.  while( 
2ac00 78 2e 68 20 26 26 20 72 65 74 72 79 3c 33 30 20  x.h && retry<30 
2ac10 29 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b 0a  ){.    retry++;.
2ac20 20 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b 0a      Sleep(100);.
2ac30 20 20 7d 0a 20 20 69 66 28 20 78 2e 68 20 29 7b    }.  if( x.h ){
2ac40 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
2ac50 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 62  esult(interp, "b
2ac60 75 73 79 22 2c 20 28 63 68 61 72 2a 29 30 29 3b  usy", (char*)0);
2ac70 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2ac80 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
2ac90 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
2aca0 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
2acb0 32 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29 20 29  2], &x.delay1) )
2acc0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2acd0 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74  R;.  if( Tcl_Get
2ace0 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
2acf0 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e 64  p, objv[3], &x.d
2ad00 65 6c 61 79 32 29 20 29 20 72 65 74 75 72 6e 20  elay2) ) return 
2ad10 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 69  TCL_ERROR;.  zFi
2ad20 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74  lename = Tcl_Get
2ad30 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b  String(objv[1]);
2ad40 0a 20 20 78 2e 68 20 3d 20 43 72 65 61 74 65 46  .  x.h = CreateF
2ad50 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 47  ile(zFilename, G
2ad60 45 4e 45 52 49 43 5f 52 45 41 44 7c 47 45 4e 45  ENERIC_READ|GENE
2ad70 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20 20  RIC_WRITE,.     
2ad80 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53 48           FILE_SH
2ad90 41 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53 48  ARE_READ|FILE_SH
2ada0 41 52 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f 50  ARE_WRITE, 0, OP
2adb0 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20 20  EN_ALWAYS,.     
2adc0 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41 54           FILE_AT
2add0 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c 20  TRIBUTE_NORMAL, 
2ade0 30 29 3b 0a 20 20 69 66 28 20 21 78 2e 68 20 29  0);.  if( !x.h )
2adf0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
2ae00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2ae10 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65  cannot open file
2ae20 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  : ", zFilename, 
2ae30 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72  (char*)0);.    r
2ae40 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2ae50 0a 20 20 7d 0a 20 20 65 76 20 3d 20 43 72 65 61  .  }.  ev = Crea
2ae60 74 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54 52  teEvent(NULL, TR
2ae70 55 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76 4e  UE, FALSE, x.evN
2ae80 61 6d 65 29 3b 0a 20 20 69 66 20 28 20 21 65 76  ame);.  if ( !ev
2ae90 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2aea0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2aeb0 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65 20   "cannot create 
2aec0 65 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e 61  event: ", x.evNa
2aed0 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20  me, (char*)0);. 
2aee0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2aef0 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67 69  ROR;.  }.  _begi
2af00 6e 74 68 72 65 61 64 28 77 69 6e 33 32 5f 66 69  nthread(win32_fi
2af10 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28 76  le_locker, 0, (v
2af20 6f 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65 65  oid*)&x);.  Slee
2af30 70 28 30 29 3b 0a 20 20 69 66 20 28 20 28 77 52  p(0);.  if ( (wR
2af40 65 73 75 6c 74 20 3d 20 57 61 69 74 46 6f 72 53  esult = WaitForS
2af50 69 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c 20  ingleObject(ev, 
2af60 31 30 30 30 30 29 29 21 3d 57 41 49 54 5f 4f 42  10000))!=WAIT_OB
2af70 4a 45 43 54 5f 30 20 29 7b 0a 20 20 20 20 73 71  JECT_0 ){.    sq
2af80 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2af90 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
2afa0 66 2c 20 22 30 78 25 78 22 2c 20 77 52 65 73 75  f, "0x%x", wResu
2afb0 6c 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70  lt);.    Tcl_App
2afc0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2afd0 2c 20 22 77 61 69 74 20 66 61 69 6c 65 64 3a 20  , "wait failed: 
2afe0 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a 29  ", zBuf, (char*)
2aff0 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61 6e  0);.    CloseHan
2b000 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 72 65 74  dle(ev);.    ret
2b010 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2b020 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c 65   }.  CloseHandle
2b030 28 65 76 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  (ev);.  return T
2b040 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2b050 20 20 20 20 20 65 78 69 73 74 73 5f 77 69 6e 33       exists_win3
2b060 32 5f 70 61 74 68 20 50 41 54 48 0a 2a 2a 0a 2a  2_path PATH.**.*
2b070 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  * Returns non-ze
2b080 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69 66  ro if the specif
2b090 69 65 64 20 70 61 74 68 20 65 78 69 73 74 73 2c  ied path exists,
2b0a0 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75 61   whose fully qua
2b0b0 6c 69 66 69 65 64 20 6e 61 6d 65 0a 2a 2a 20 6d  lified name.** m
2b0c0 61 79 20 65 78 63 65 65 64 20 32 36 30 20 63 68  ay exceed 260 ch
2b0d0 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20 69  aracters if it i
2b0e0 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68 20  s prefixed with 
2b0f0 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69  "\\?\"..*/.stati
2b100 63 20 69 6e 74 20 77 69 6e 33 32 5f 65 78 69 73  c int win32_exis
2b110 74 73 5f 70 61 74 68 28 0a 20 20 76 6f 69 64 20  ts_path(.  void 
2b120 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
2b130 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2b140 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2b150 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2b160 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20  objv[].){.  if( 
2b170 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2b180 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2b190 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2b1a0 20 22 50 41 54 48 22 29 3b 0a 20 20 20 20 72 65   "PATH");.    re
2b1b0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
2b1c0 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
2b1d0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
2b1e0 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
2b1f0 28 0a 20 20 20 20 20 20 47 65 74 46 69 6c 65 41  (.      GetFileA
2b200 74 74 72 69 62 75 74 65 73 57 28 20 54 63 6c 5f  ttributesW( Tcl_
2b210 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76 5b  GetUnicode(objv[
2b220 31 5d 29 29 21 3d 49 4e 56 41 4c 49 44 5f 46 49  1]))!=INVALID_FI
2b230 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29 29  LE_ATTRIBUTES ))
2b240 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2b250 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20  K;.}../*.**     
2b260 20 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c 65   find_win32_file
2b270 20 50 41 54 54 45 52 4e 0a 2a 2a 0a 2a 2a 20 52   PATTERN.**.** R
2b280 65 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66  eturns a list of
2b290 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64 69   entries in a di
2b2a0 72 65 63 74 6f 72 79 20 74 68 61 74 20 6d 61 74  rectory that mat
2b2b0 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  ch the specified
2b2c0 20 70 61 74 74 65 72 6e 2c 0a 2a 2a 20 77 68 6f   pattern,.** who
2b2d0 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66 69  se fully qualifi
2b2e0 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63 65  ed name may exce
2b2f0 65 64 20 32 34 38 20 63 68 61 72 61 63 74 65 72  ed 248 character
2b300 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69  s if it is prefi
2b310 78 65 64 20 77 69 74 68 0a 2a 2a 20 22 5c 5c 3f  xed with.** "\\?
2b320 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  \"..*/.static in
2b330 74 20 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69 6c  t win32_find_fil
2b340 65 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e  e(.  void *clien
2b350 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
2b360 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
2b370 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
2b380 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
2b390 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 46 69  .){.  HANDLE hFi
2b3a0 6e 64 46 69 6c 65 20 3d 20 49 4e 56 41 4c 49 44  ndFile = INVALID
2b3b0 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a 20  _HANDLE_VALUE;. 
2b3c0 20 57 49 4e 33 32 5f 46 49 4e 44 5f 44 41 54 41   WIN32_FIND_DATA
2b3d0 57 20 66 69 6e 64 44 61 74 61 3b 0a 20 20 54 63  W findData;.  Tc
2b3e0 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 3b 0a  l_Obj *listObj;.
2b3f0 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72 6e    DWORD lastErrn
2b400 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  o;.  if( objc!=2
2b410 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
2b420 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
2b430 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 54 45   1, objv, "PATTE
2b440 52 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  RN");.    return
2b450 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2b460 20 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 46 69    hFindFile = Fi
2b470 6e 64 46 69 72 73 74 46 69 6c 65 57 28 54 63 6c  ndFirstFileW(Tcl
2b480 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76  _GetUnicode(objv
2b490 5b 31 5d 29 2c 20 26 66 69 6e 64 44 61 74 61 29  [1]), &findData)
2b4a0 3b 0a 20 20 69 66 28 20 68 46 69 6e 64 46 69 6c  ;.  if( hFindFil
2b4b0 65 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44 4c  e==INVALID_HANDL
2b4c0 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20 54  E_VALUE ){.    T
2b4d0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
2b4e0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 57  interp, Tcl_NewW
2b4f0 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61 73  ideIntObj(GetLas
2b500 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20 20  tError()));.    
2b510 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2b520 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 4f 62 6a 20  ;.  }.  listObj 
2b530 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
2b540 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
2b550 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 64  nt(listObj);.  d
2b560 6f 20 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73 74  o {.    Tcl_List
2b570 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
2b580 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62 6a  (interp, listObj
2b590 2c 20 54 63 6c 5f 4e 65 77 55 6e 69 63 6f 64 65  , Tcl_NewUnicode
2b5a0 4f 62 6a 28 0a 20 20 20 20 20 20 20 20 66 69 6e  Obj(.        fin
2b5b0 64 44 61 74 61 2e 63 46 69 6c 65 4e 61 6d 65 2c  dData.cFileName,
2b5c0 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f 4c   -1));.    Tcl_L
2b5d0 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
2b5e0 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  ent(interp, list
2b5f0 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65  Obj, Tcl_NewWide
2b600 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20 20  IntObj(.        
2b610 66 69 6e 64 44 61 74 61 2e 64 77 46 69 6c 65 41  findData.dwFileA
2b620 74 74 72 69 62 75 74 65 73 29 29 3b 0a 20 20 7d  ttributes));.  }
2b630 20 77 68 69 6c 65 28 20 46 69 6e 64 4e 65 78 74   while( FindNext
2b640 46 69 6c 65 57 28 68 46 69 6e 64 46 69 6c 65 2c  FileW(hFindFile,
2b650 20 26 66 69 6e 64 44 61 74 61 29 20 29 3b 0a 20   &findData) );. 
2b660 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65 74   lastErrno = Get
2b670 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20 69  LastError();.  i
2b680 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 4e 4f  f( lastErrno!=NO
2b690 5f 45 52 52 4f 52 20 26 26 20 6c 61 73 74 45 72  _ERROR && lastEr
2b6a0 72 6e 6f 21 3d 45 52 52 4f 52 5f 4e 4f 5f 4d 4f  rno!=ERROR_NO_MO
2b6b0 52 45 5f 46 49 4c 45 53 20 29 7b 0a 20 20 20 20  RE_FILES ){.    
2b6c0 46 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64 46  FindClose(hFindF
2b6d0 69 6c 65 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65  ile);.    Tcl_De
2b6e0 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74 4f  crRefCount(listO
2b6f0 62 6a 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65 74  bj);.    Tcl_Set
2b700 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
2b710 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
2b720 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f 72  Obj(GetLastError
2b730 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ()));.    return
2b740 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2b750 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e    FindClose(hFin
2b760 64 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 53 65  dFile);.  Tcl_Se
2b770 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
2b780 70 2c 20 6c 69 73 74 4f 62 6a 29 3b 0a 20 20 72  p, listObj);.  r
2b790 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
2b7a0 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 64 65 6c 65  ./*.**      dele
2b7b0 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46 49  te_win32_file FI
2b7c0 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 44 65 6c  LENAME.**.** Del
2b7d0 65 74 65 73 20 74 68 65 20 73 70 65 63 69 66 69  etes the specifi
2b7e0 65 64 20 66 69 6c 65 2c 20 77 68 6f 73 65 20 66  ed file, whose f
2b7f0 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e  ully qualified n
2b800 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32  ame may exceed 2
2b810 36 30 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73  60.** characters
2b820 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78   if it is prefix
2b830 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a  ed with "\\?\"..
2b840 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69  */.static int wi
2b850 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65 28  n32_delete_file(
2b860 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44  .  void *clientD
2b870 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2b880 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2b890 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2b8a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2b8b0 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  {.  if( objc!=2 
2b8c0 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
2b8d0 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
2b8e0 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41  1, objv, "FILENA
2b8f0 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ME");.    return
2b900 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2b910 20 20 69 66 28 20 21 44 65 6c 65 74 65 46 69 6c    if( !DeleteFil
2b920 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64  eW(Tcl_GetUnicod
2b930 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a 20  e(objv[1])) ){. 
2b940 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
2b950 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
2b960 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65  NewWideIntObj(Ge
2b970 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a  tLastError()));.
2b980 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2b990 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f  RROR;.  }.  Tcl_
2b9a0 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65  ResetResult(inte
2b9b0 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  rp);.  return TC
2b9c0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20  L_OK;.}../*.**  
2b9d0 20 20 20 20 6d 61 6b 65 5f 77 69 6e 33 32 5f 64      make_win32_d
2b9e0 69 72 20 44 49 52 45 43 54 4f 52 59 0a 2a 2a 0a  ir DIRECTORY.**.
2b9f0 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20 73  ** Creates the s
2ba00 70 65 63 69 66 69 65 64 20 64 69 72 65 63 74 6f  pecified directo
2ba10 72 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20  ry, whose fully 
2ba20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20 6d  qualified name m
2ba30 61 79 20 65 78 63 65 65 64 20 32 34 38 0a 2a 2a  ay exceed 248.**
2ba40 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20 69   characters if i
2ba50 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77 69  t is prefixed wi
2ba60 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74  th "\\?\"..*/.st
2ba70 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 6d  atic int win32_m
2ba80 6b 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63 6c  kdir(.  void *cl
2ba90 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
2baa0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
2bab0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
2bac0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
2bad0 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62 6a  v[].){.  if( obj
2bae0 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
2baf0 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
2bb00 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
2bb10 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20 20  IRECTORY");.    
2bb20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2bb30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 43 72 65  ;.  }.  if( !Cre
2bb40 61 74 65 44 69 72 65 63 74 6f 72 79 57 28 54 63  ateDirectoryW(Tc
2bb50 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a  l_GetUnicode(obj
2bb60 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 20 29 7b 0a  v[1]), NULL) ){.
2bb70 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
2bb80 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
2bb90 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
2bba0 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
2bbb0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2bbc0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
2bbd0 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
2bbe0 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
2bbf0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
2bc00 20 20 20 20 20 72 65 6d 6f 76 65 5f 77 69 6e 33       remove_win3
2bc10 32 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a  2_dir DIRECTORY.
2bc20 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 73 20 74 68  **.** Removes th
2bc30 65 20 73 70 65 63 69 66 69 65 64 20 64 69 72 65  e specified dire
2bc40 63 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c  ctory, whose ful
2bc50 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d  ly qualified nam
2bc60 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34 38  e may exceed 248
2bc70 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20 69  .** characters i
2bc80 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65 64  f it is prefixed
2bc90 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f   with "\\?\"..*/
2bca0 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33  .static int win3
2bcb0 32 5f 72 6d 64 69 72 28 0a 20 20 76 6f 69 64 20  2_rmdir(.  void 
2bcc0 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54  *clientData,.  T
2bcd0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2bce0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
2bcf0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
2bd00 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20  objv[].){.  if( 
2bd10 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
2bd20 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
2bd30 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
2bd40 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b 0a 20   "DIRECTORY");. 
2bd50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2bd60 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  ROR;.  }.  if( !
2bd70 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 79 57  RemoveDirectoryW
2bd80 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28  (Tcl_GetUnicode(
2bd90 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20 20  objv[1])) ){.   
2bda0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
2bdb0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
2bdc0 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c  wWideIntObj(GetL
2bdd0 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20  astError()));.  
2bde0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2bdf0 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52 65  OR;.  }.  Tcl_Re
2be00 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
2be10 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2be20 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  OK;.}.#endif.../
2be30 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74 69 6d 69  *.**      optimi
2be40 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20 44  zation_control D
2be50 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a 2a  B OPT BOOLEAN.**
2be60 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
2be70 73 61 62 6c 65 20 71 75 65 72 79 20 6f 70 74 69  sable query opti
2be80 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69 6e 67 20  mizations using 
2be90 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73 74  the sqlite3_test
2bea0 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69 6e  _control().** in
2beb0 74 65 72 66 61 63 65 2e 20 20 44 69 73 61 62 6c  terface.  Disabl
2bec0 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20  e if BOOLEAN is 
2bed0 66 61 6c 73 65 20 61 6e 64 20 65 6e 61 62 6c 65  false and enable
2bee0 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20 74   if BOOLEAN is t
2bef0 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69 73 20 74  rue..** OPT is t
2bf00 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 6f  he name of the o
2bf10 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20 62  ptimization to b
2bf20 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a 73  e disabled..*/.s
2bf30 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6d 69  tatic int optimi
2bf40 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28 0a  zation_control(.
2bf50 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
2bf60 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2bf70 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2bf80 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2bf90 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2bfa0 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  {.  int i;.  sql
2bfb0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
2bfc0 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20  t char *zOpt;.  
2bfd0 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e 74  int onoff;.  int
2bfe0 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 73 74 61   mask = 0;.  sta
2bff0 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2c000 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61   {.    const cha
2c010 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20 20  r *zOptName;.   
2c020 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20 61   int mask;.  } a
2c030 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20  Opt[] = {.    { 
2c040 22 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20  "all",          
2c050 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41 6c         SQLITE_Al
2c060 6c 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c 0a  lOpts        },.
2c070 20 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20 20 20      { "none",   
2c080 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
2c090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c0a0 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 75 65     },.    { "que
2c0b0 72 79 2d 66 6c 61 74 74 65 6e 65 72 22 2c 20 20  ry-flattener",  
2c0c0 20 20 20 53 51 4c 49 54 45 5f 51 75 65 72 79 46     SQLITE_QueryF
2c0d0 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20 20 20  lattener },.    
2c0e0 7b 20 22 63 6f 6c 75 6d 6e 2d 63 61 63 68 65 22  { "column-cache"
2c0f0 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ,        SQLITE_
2c100 43 6f 6c 75 6d 6e 43 61 63 68 65 20 20 20 20 7d  ColumnCache    }
2c110 2c 0a 20 20 20 20 7b 20 22 67 72 6f 75 70 62 79  ,.    { "groupby
2c120 2d 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20 53  -order",       S
2c130 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72 64  QLITE_GroupByOrd
2c140 65 72 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 66  er   },.    { "f
2c150 61 63 74 6f 72 2d 63 6f 6e 73 74 61 6e 74 73 22  actor-constants"
2c160 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 61 63 74  ,    SQLITE_Fact
2c170 6f 72 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a 20 20  orOutConst },.  
2c180 20 20 7b 20 22 64 69 73 74 69 6e 63 74 2d 6f 70    { "distinct-op
2c190 74 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  t",        SQLIT
2c1a0 45 5f 44 69 73 74 69 6e 63 74 4f 70 74 20 20 20  E_DistinctOpt   
2c1b0 20 7d 2c 0a 20 20 20 20 7b 20 22 63 6f 76 65 72   },.    { "cover
2c1c0 2d 69 64 78 2d 73 63 61 6e 22 2c 20 20 20 20 20  -idx-scan",     
2c1d0 20 53 51 4c 49 54 45 5f 43 6f 76 65 72 49 64 78   SQLITE_CoverIdx
2c1e0 53 63 61 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20  Scan   },.    { 
2c1f0 22 6f 72 64 65 72 2d 62 79 2d 69 64 78 2d 6a 6f  "order-by-idx-jo
2c200 69 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f 4f 72  in",   SQLITE_Or
2c210 64 65 72 42 79 49 64 78 4a 6f 69 6e 20 7d 2c 0a  derByIdxJoin },.
2c220 20 20 20 20 7b 20 22 74 72 61 6e 73 69 74 69 76      { "transitiv
2c230 65 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  e",          SQL
2c240 49 54 45 5f 54 72 61 6e 73 69 74 69 76 65 20 20  ITE_Transitive  
2c250 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73 75 62     },.    { "sub
2c260 71 75 65 72 79 2d 63 6f 72 6f 75 74 69 6e 65 22  query-coroutine"
2c270 2c 20 20 53 51 4c 49 54 45 5f 53 75 62 71 43 6f  ,  SQLITE_SubqCo
2c280 72 6f 75 74 69 6e 65 20 20 7d 2c 0a 20 20 20 20  routine  },.    
2c290 7b 20 22 6f 6d 69 74 2d 6e 6f 6f 70 2d 6a 6f 69  { "omit-noop-joi
2c2a0 6e 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  n",      SQLITE_
2c2b0 4f 6d 69 74 4e 6f 6f 70 4a 6f 69 6e 20 20 20 7d  OmitNoopJoin   }
2c2c0 2c 0a 20 20 20 20 7b 20 22 73 74 61 74 33 22 2c  ,.    { "stat3",
2c2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2c2e0 51 4c 49 54 45 5f 53 74 61 74 33 34 20 20 20 20  QLITE_Stat34    
2c2f0 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 73       },.    { "s
2c300 74 61 74 34 22 2c 20 20 20 20 20 20 20 20 20 20  tat4",          
2c310 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61 74       SQLITE_Stat
2c320 33 34 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  34         },.  
2c330 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  };..  if( objc!=
2c340 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
2c350 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2c360 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 4f  , 1, objv, "DB O
2c370 50 54 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20  PT BOOLEAN");.  
2c380 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2c390 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
2c3a0 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2c3b0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
2c3c0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
2c3d0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
2c3e0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
2c3f0 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28  tBooleanFromObj(
2c400 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
2c410 20 26 6f 6e 6f 66 66 29 20 29 20 72 65 74 75 72   &onoff) ) retur
2c420 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
2c430 4f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Opt = Tcl_GetStr
2c440 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
2c450 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2c460 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61  f(aOpt)/sizeof(a
2c470 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Opt[0]); i++){. 
2c480 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 4f     if( strcmp(zO
2c490 70 74 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74  pt, aOpt[i].zOpt
2c4a0 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
2c4b0 20 20 6d 61 73 6b 20 3d 20 61 4f 70 74 5b 69 5d    mask = aOpt[i]
2c4c0 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 62 72 65  .mask;.      bre
2c4d0 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
2c4e0 69 66 28 20 6f 6e 6f 66 66 20 29 20 6d 61 73 6b  if( onoff ) mask
2c4f0 20 3d 20 7e 6d 61 73 6b 3b 0a 20 20 69 66 28 20   = ~mask;.  if( 
2c500 69 3e 3d 73 69 7a 65 6f 66 28 61 4f 70 74 29 2f  i>=sizeof(aOpt)/
2c510 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29 20  sizeof(aOpt[0]) 
2c520 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2c530 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2c540 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6d 69 7a  "unknown optimiz
2c550 61 74 69 6f 6e 20 2d 20 73 68 6f 75 6c 64 20 62  ation - should b
2c560 65 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 20 20  e one of:",.    
2c570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c580 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
2c590 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
2c5a0 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28 61  f(aOpt)/sizeof(a
2c5b0 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20  Opt[0]); i++){. 
2c5c0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
2c5d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 20  esult(interp, " 
2c5e0 22 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74 4e  ", aOpt[i].zOptN
2c5f0 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
2c600 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
2c610 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
2c620 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
2c630 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
2c640 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54  STCTRL_OPTIMIZAT
2c650 49 4f 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29 3b  IONS, db, mask);
2c660 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2c670 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74 72  ;.}..typedef str
2c680 75 63 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f  uct sqlite3_api_
2c690 72 6f 75 74 69 6e 65 73 20 73 71 6c 69 74 65 33  routines sqlite3
2c6a0 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 3b 0a 2f  _api_routines;./
2c6b0 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73 74  *.**     load_st
2c6c0 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20 44  atic_extension D
2c6d0 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a 2a  B NAME ....**.**
2c6e0 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f 72   Load one or mor
2c6f0 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69 6e  e statically lin
2c700 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e 0a  ked extensions..
2c710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
2c720 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e  lLoadStaticExten
2c730 73 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64 20  sionCmd(.  void 
2c740 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
2c750 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2c760 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
2c770 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
2c780 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78 74   objv[].){.  ext
2c790 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2c7a0 61 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c 69  amatch_init(sqli
2c7b0 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2c7c0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2c7d0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2c7e0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  rn int sqlite3_c
2c7f0 6c 6f 73 75 72 65 5f 69 6e 69 74 28 73 71 6c 69  losure_init(sqli
2c800 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2c810 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2c820 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2c830 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  rn int sqlite3_e
2c840 76 61 6c 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  val_init(sqlite3
2c850 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2c860 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2c870 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2c880 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  int sqlite3_file
2c890 69 6f 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  io_init(sqlite3*
2c8a0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2c8b0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2c8c0 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2c8d0 6e 74 20 73 71 6c 69 74 65 33 5f 66 75 7a 7a 65  nt sqlite3_fuzze
2c8e0 72 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  r_init(sqlite3*,
2c8f0 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2c900 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2c910 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2c920 74 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69  t sqlite3_ieee_i
2c930 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68 61  nit(sqlite3*,cha
2c940 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65  r**,const sqlite
2c950 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29  3_api_routines*)
2c960 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2c970 71 6c 69 74 65 33 5f 6e 65 78 74 63 68 61 72 5f  qlite3_nextchar_
2c980 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c 63 68  init(sqlite3*,ch
2c990 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c 69 74  ar**,const sqlit
2c9a0 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 2a  e3_api_routines*
2c9b0 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  );.  extern int 
2c9c0 73 71 6c 69 74 65 33 5f 70 65 72 63 65 6e 74 69  sqlite3_percenti
2c9d0 6c 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  le_init(sqlite3*
2c9e0 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2c9f0 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2ca00 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2ca10 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 67 65 78  nt sqlite3_regex
2ca20 70 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  p_init(sqlite3*,
2ca30 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2ca40 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2ca50 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2ca60 74 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66  t sqlite3_spellf
2ca70 69 78 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a  ix_init(sqlite3*
2ca80 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71  ,char**,const sq
2ca90 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e  lite3_api_routin
2caa0 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69  es*);.  extern i
2cab0 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 79 70  nt sqlite3_totyp
2cac0 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33 2a 2c  e_init(sqlite3*,
2cad0 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73 71 6c  char**,const sql
2cae0 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65  ite3_api_routine
2caf0 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e  s*);.  extern in
2cb00 74 20 73 71 6c 69 74 65 33 5f 77 68 6f 6c 65 6e  t sqlite3_wholen
2cb10 75 6d 62 65 72 5f 69 6e 69 74 28 73 71 6c 69 74  umber_init(sqlit
2cb20 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74  e3*,char**,const
2cb30 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75   sqlite3_api_rou
2cb40 74 69 6e 65 73 2a 29 3b 0a 20 20 73 74 61 74 69  tines*);.  stati
2cb50 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
2cb60 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2cb70 2a 7a 45 78 74 4e 61 6d 65 3b 0a 20 20 20 20 69  *zExtName;.    i
2cb80 6e 74 20 28 2a 70 49 6e 69 74 29 28 73 71 6c 69  nt (*pInit)(sqli
2cb90 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2cba0 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2cbb0 75 74 69 6e 65 73 2a 29 3b 0a 20 20 7d 20 61 45  utines*);.  } aE
2cbc0 78 74 65 6e 73 69 6f 6e 5b 5d 20 3d 20 7b 0a 20  xtension[] = {. 
2cbd0 20 20 20 7b 20 22 61 6d 61 74 63 68 22 2c 20 20     { "amatch",  
2cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2cbf0 6c 69 74 65 33 5f 61 6d 61 74 63 68 5f 69 6e 69  lite3_amatch_ini
2cc00 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2cc10 7d 2c 0a 20 20 20 20 7b 20 22 63 6c 6f 73 75 72  },.    { "closur
2cc20 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2cc30 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 75 72    sqlite3_closur
2cc40 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  e_init          
2cc50 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 65 76      },.    { "ev
2cc60 61 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  al",            
2cc70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 76        sqlite3_ev
2cc80 61 6c 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  al_init         
2cc90 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2cca0 20 22 66 69 6c 65 69 6f 22 2c 20 20 20 20 20 20   "fileio",      
2ccb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2ccc0 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 20 20 20  3_fileio_init   
2ccd0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2cce0 20 20 20 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20     { "fuzzer",  
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2cd00 6c 69 74 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69  lite3_fuzzer_ini
2cd10 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2cd20 7d 2c 0a 20 20 20 20 7b 20 22 69 65 65 65 37 35  },.    { "ieee75
2cd30 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  4",             
2cd40 20 20 73 71 6c 69 74 65 33 5f 69 65 65 65 5f 69    sqlite3_ieee_i
2cd50 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
2cd60 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65      },.    { "ne
2cd70 78 74 63 68 61 72 22 2c 20 20 20 20 20 20 20 20  xtchar",        
2cd80 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6e 65        sqlite3_ne
2cd90 78 74 63 68 61 72 5f 69 6e 69 74 20 20 20 20 20  xtchar_init     
2cda0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2cdb0 20 22 70 65 72 63 65 6e 74 69 6c 65 22 2c 20 20   "percentile",  
2cdc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cdd0 33 5f 70 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69  3_percentile_ini
2cde0 74 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t           },. 
2cdf0 20 20 20 7b 20 22 72 65 67 65 78 70 22 2c 20 20     { "regexp",  
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
2ce10 6c 69 74 65 33 5f 72 65 67 65 78 70 5f 69 6e 69  lite3_regexp_ini
2ce20 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
2ce30 7d 2c 0a 20 20 20 20 7b 20 22 73 70 65 6c 6c 66  },.    { "spellf
2ce40 69 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ix",            
2ce50 20 20 73 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66    sqlite3_spellf
2ce60 69 78 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20  ix_init         
2ce70 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f      },.    { "to
2ce80 74 79 70 65 22 2c 20 20 20 20 20 20 20 20 20 20  type",          
2ce90 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 6f        sqlite3_to
2cea0 74 79 70 65 5f 69 6e 69 74 20 20 20 20 20 20 20  type_init       
2ceb0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
2cec0 20 22 77 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20   "wholenumber", 
2ced0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
2cee0 33 5f 77 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e  3_wholenumber_in
2cef0 69 74 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  it          },. 
2cf00 20 7d 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   };.  sqlite3 *d
2cf10 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
2cf20 2a 7a 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 69 2c  *zName;.  int i,
2cf30 20 6a 2c 20 72 63 3b 0a 20 20 63 68 61 72 20 2a   j, rc;.  char *
2cf40 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69  zErrMsg = 0;.  i
2cf50 66 28 20 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20  f( objc<3 ){.   
2cf60 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
2cf70 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
2cf80 76 2c 20 22 44 42 20 4e 41 4d 45 20 2e 2e 2e 22  v, "DB NAME ..."
2cf90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
2cfa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
2cfb0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
2cfc0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
2cfd0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
2cfe0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
2cff0 4c 5f 45 52 52 4f 52 3b 0a 20 20 66 6f 72 28 6a  L_ERROR;.  for(j
2d000 3d 32 3b 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b 29  =2; j<objc; j++)
2d010 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63  {.    zName = Tc
2d020 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2d030 5b 6a 5d 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [j]);.    for(i=
2d040 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
2d050 45 78 74 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b 29  Extension); i++)
2d060 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63  {.      if( strc
2d070 6d 70 28 7a 4e 61 6d 65 2c 20 61 45 78 74 65 6e  mp(zName, aExten
2d080 73 69 6f 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d 65  sion[i].zExtName
2d090 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
2d0a0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 41    }.    if( i>=A
2d0b0 72 72 61 79 53 69 7a 65 28 61 45 78 74 65 6e 73  rraySize(aExtens
2d0c0 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 54 63  ion) ){.      Tc
2d0d0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2d0e0 6e 74 65 72 70 2c 20 22 6e 6f 20 73 75 63 68 20  nterp, "no such 
2d0f0 65 78 74 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a 4e  extension: ", zN
2d100 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
2d110 20 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c        return TCL
2d120 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
2d130 20 20 72 63 20 3d 20 61 45 78 74 65 6e 73 69 6f    rc = aExtensio
2d140 6e 5b 69 5d 2e 70 49 6e 69 74 28 64 62 2c 20 26  n[i].pInit(db, &
2d150 7a 45 72 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20  zErrMsg, 0);.   
2d160 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2d170 4f 4b 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b  OK || zErrMsg ){
2d180 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  .      Tcl_Appen
2d190 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2d1a0 22 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20  "initialization 
2d1b0 6f 66 20 22 2c 20 7a 4e 61 6d 65 2c 20 22 20 66  of ", zName, " f
2d1c0 61 69 6c 65 64 3a 20 22 2c 20 7a 45 72 72 4d 73  ailed: ", zErrMs
2d1d0 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
2d1e0 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72 2a            (char*
2d1f0 29 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  )0);.      sqlit
2d200 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
2d210 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 54  ;.      return T
2d220 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  CL_ERROR;.    }.
2d230 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c    }.  return TCL
2d240 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20  _OK;.}../*.**   
2d250 20 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 66 61    sorter_test_fa
2d260 6b 65 68 65 61 70 20 42 4f 4f 4c 0a 2a 2a 0a 2a  keheap BOOL.**.*
2d270 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 6f 72  /.static int sor
2d280 74 65 72 5f 74 65 73 74 5f 66 61 6b 65 68 65 61  ter_test_fakehea
2d290 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  p(.  void * clie
2d2a0 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
2d2b0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
2d2c0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
2d2d0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
2d2e0 5d 0a 29 7b 0a 20 20 69 6e 74 20 62 41 72 67 3b  ].){.  int bArg;
2d2f0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
2d300 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2d310 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2d320 2c 20 6f 62 6a 76 2c 20 22 42 4f 4f 4c 22 29 3b  , objv, "BOOL");
2d330 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
2d340 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
2d350 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
2d360 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
2d370 6f 62 6a 76 5b 31 5d 2c 20 26 62 41 72 67 29 20  objv[1], &bArg) 
2d380 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
2d390 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
2d3a0 69 66 28 20 62 41 72 67 20 29 7b 0a 20 20 20 20  if( bArg ){.    
2d3b0 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2d3c0 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30  lConfig.pHeap==0
2d3d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d3e0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
2d3f0 65 61 70 20 3d 20 53 51 4c 49 54 45 5f 49 4e 54  eap = SQLITE_INT
2d400 5f 54 4f 5f 50 54 52 28 2d 31 29 3b 0a 20 20 20  _TO_PTR(-1);.   
2d410 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
2d420 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2d430 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 53  lConfig.pHeap==S
2d440 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52  QLITE_INT_TO_PTR
2d450 28 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 73 71  (-1) ){.      sq
2d460 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2d470 67 2e 70 48 65 61 70 20 3d 20 30 3b 0a 20 20 20  g.pHeap = 0;.   
2d480 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65   }.  }..  Tcl_Re
2d490 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
2d4a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2d4b0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
2d4c0 20 73 6f 72 74 65 72 5f 74 65 73 74 5f 73 6f 72   sorter_test_sor
2d4d0 74 34 5f 68 65 6c 70 65 72 20 44 42 20 53 51 4c  t4_helper DB SQL
2d4e0 31 20 4e 53 54 45 50 20 53 51 4c 32 0a 2a 2a 0a  1 NSTEP SQL2.**.
2d4f0 2a 2a 20 43 6f 6d 70 69 6c 65 20 53 51 4c 20 73  ** Compile SQL s
2d500 74 61 74 65 6d 65 6e 74 20 24 53 51 4c 31 20 61  tatement $SQL1 a
2d510 6e 64 20 73 74 65 70 20 69 74 20 24 4e 53 54 45  nd step it $NSTE
2d520 50 20 74 69 6d 65 73 2e 20 46 6f 72 20 65 61 63  P times. For eac
2d530 68 20 72 6f 77 2c 20 0a 2a 2a 20 63 68 65 63 6b  h row, .** check
2d540 20 74 68 61 74 20 74 68 65 20 6c 65 66 74 6d 6f   that the leftmo
2d550 73 74 20 61 6e 64 20 72 69 67 68 74 6d 6f 73 74  st and rightmost
2d560 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
2d570 64 20 61 72 65 20 62 6f 74 68 20 69 6e 74 65 67  d are both integ
2d580 65 72 73 2c 0a 2a 2a 20 61 6e 64 20 74 68 61 74  ers,.** and that
2d590 20 62 6f 74 68 20 63 6f 6e 74 61 69 6e 20 74 68   both contain th
2d5a0 65 20 73 61 6d 65 20 76 61 6c 75 65 2e 0a 2a 2a  e same value..**
2d5b0 0a 2a 2a 20 54 68 65 6e 20 65 78 65 63 75 74 65  .** Then execute
2d5c0 20 73 74 61 74 65 6d 65 6e 74 20 24 53 51 4c 32   statement $SQL2
2d5d0 2e 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  . Check that the
2d5e0 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
2d5f0 6e 73 20 74 68 65 20 73 61 6d 65 0a 2a 2a 20 73  ns the same.** s
2d600 65 74 20 6f 66 20 69 6e 74 65 67 65 72 73 20 69  et of integers i
2d610 6e 20 74 68 65 20 73 61 6d 65 20 6f 72 64 65 72  n the same order
2d620 20 61 73 20 69 6e 20 74 68 65 20 70 72 65 76 69   as in the previ
2d630 6f 75 73 20 73 74 65 70 20 28 75 73 69 6e 67 20  ous step (using 
2d640 24 53 51 4c 31 29 2e 0a 2a 2f 0a 73 74 61 74 69  $SQL1)..*/.stati
2d650 63 20 69 6e 74 20 73 6f 72 74 65 72 5f 74 65 73  c int sorter_tes
2d660 74 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 28 0a  t_sort4_helper(.
2d670 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
2d680 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
2d690 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
2d6a0 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
2d6b0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
2d6c0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
2d6d0 7a 53 71 6c 31 3b 0a 20 20 63 6f 6e 73 74 20 63  zSql1;.  const c
2d6e0 68 61 72 20 2a 7a 53 71 6c 32 3b 0a 20 20 69 6e  har *zSql2;.  in
2d6f0 74 20 6e 53 74 65 70 3b 20 0a 20 20 69 6e 74 20  t nStep; .  int 
2d700 69 53 74 65 70 3b 20 0a 20 20 69 6e 74 20 69 43  iStep; .  int iC
2d710 6b 73 75 6d 31 20 3d 20 30 3b 20 0a 20 20 69 6e  ksum1 = 0; .  in
2d720 74 20 69 43 6b 73 75 6d 32 20 3d 20 30 3b 20 0a  t iCksum2 = 0; .
2d730 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
2d740 69 42 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  iB;.  sqlite3 *d
2d750 62 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  b;.  sqlite3_stm
2d760 74 20 2a 70 53 74 6d 74 3b 0a 20 20 0a 20 20 69  t *pStmt;.  .  i
2d770 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a 20 20  f( objc!=5 ){.  
2d780 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
2d790 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
2d7a0 6a 76 2c 20 22 44 42 20 53 51 4c 31 20 4e 53 54  jv, "DB SQL1 NST
2d7b0 45 50 20 53 51 4c 32 22 29 3b 0a 20 20 20 20 72  EP SQL2");.    r
2d7c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2d7d0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
2d7e0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2d7f0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2d800 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
2d810 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2d820 3b 0a 20 20 7a 53 71 6c 31 20 3d 20 54 63 6c 5f  ;.  zSql1 = Tcl_
2d830 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
2d840 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
2d850 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
2d860 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 6e 53  rp, objv[3], &nS
2d870 74 65 70 29 20 29 20 72 65 74 75 72 6e 20 54 43  tep) ) return TC
2d880 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 53 71 6c 32  L_ERROR;.  zSql2
2d890 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
2d8a0 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a 20 20 72 63  (objv[4]);..  rc
2d8b0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
2d8c0 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 31 2c  re_v2(db, zSql1,
2d8d0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2d8e0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
2d8f0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 71 6c 5f  E_OK ) goto sql_
2d900 65 72 72 6f 72 3b 0a 0a 20 20 69 42 20 3d 20 73  error;..  iB = s
2d910 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
2d920 75 6e 74 28 70 53 74 6d 74 29 2d 31 3b 0a 20 20  unt(pStmt)-1;.  
2d930 66 6f 72 28 69 53 74 65 70 3d 30 3b 20 69 53 74  for(iStep=0; iSt
2d940 65 70 3c 6e 53 74 65 70 20 26 26 20 53 51 4c 49  ep<nStep && SQLI
2d950 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
2d960 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53 74  step(pStmt); iSt
2d970 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 61  ep++){.    int a
2d980 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2d990 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
2d9a0 0a 20 20 20 20 69 66 28 20 61 21 3d 73 71 6c 69  .    if( a!=sqli
2d9b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
2d9c0 53 74 6d 74 2c 20 69 42 29 20 29 7b 0a 20 20 20  Stmt, iB) ){.   
2d9d0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
2d9e0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 64 61 74  ult(interp, "dat
2d9f0 61 20 65 72 72 6f 72 3a 20 28 61 21 3d 62 29 22  a error: (a!=b)"
2da00 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 65 74 75  , 0);.      retu
2da10 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2da20 20 20 7d 0a 0a 20 20 20 20 69 43 6b 73 75 6d 31    }..    iCksum1
2da30 20 2b 3d 20 28 69 43 6b 73 75 6d 31 20 3c 3c 20   += (iCksum1 << 
2da40 33 29 20 2b 20 61 3b 0a 20 20 7d 0a 20 20 72 63  3) + a;.  }.  rc
2da50 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
2da60 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  ize(pStmt);.  if
2da70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2da80 29 20 67 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72  ) goto sql_error
2da90 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
2daa0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
2dab0 20 7a 53 71 6c 32 2c 20 2d 31 2c 20 26 70 53 74   zSql2, -1, &pSt
2dac0 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  mt, 0);.  if( rc
2dad0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2dae0 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 20 20  to sql_error;.  
2daf0 66 6f 72 28 69 53 74 65 70 3d 30 3b 20 53 51 4c  for(iStep=0; SQL
2db00 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2db10 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 20 69 53  _step(pStmt); iS
2db20 74 65 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  tep++){.    int 
2db30 61 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  a = sqlite3_colu
2db40 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29  mn_int(pStmt, 0)
2db50 3b 0a 20 20 20 20 69 43 6b 73 75 6d 32 20 2b 3d  ;.    iCksum2 +=
2db60 20 28 69 43 6b 73 75 6d 32 20 3c 3c 20 33 29 20   (iCksum2 << 3) 
2db70 2b 20 61 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  + a;.  }.  rc = 
2db80 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2db90 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 72  (pStmt);.  if( r
2dba0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2dbb0 6f 74 6f 20 73 71 6c 5f 65 72 72 6f 72 3b 0a 0a  oto sql_error;..
2dbc0 20 20 69 66 28 20 69 43 6b 73 75 6d 31 21 3d 69    if( iCksum1!=i
2dbd0 43 6b 73 75 6d 32 20 29 7b 0a 20 20 20 20 54 63  Cksum2 ){.    Tc
2dbe0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
2dbf0 6e 74 65 72 70 2c 20 22 63 68 65 63 6b 73 75 6d  nterp, "checksum
2dc00 20 6d 69 73 6d 61 74 63 68 22 2c 20 30 29 3b 0a   mismatch", 0);.
2dc10 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2dc20 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  RROR;.  }..  ret
2dc30 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 20 73 71 6c  urn TCL_OK;. sql
2dc40 5f 65 72 72 6f 72 3a 0a 20 20 54 63 6c 5f 41 70  _error:.  Tcl_Ap
2dc50 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
2dc60 70 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a 20 22  p, "sql error: "
2dc70 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2dc80 28 64 62 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (db), 0);.  retu
2dc90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a  rn TCL_ERROR;.}.
2dca0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2dcb0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
2dcc0 49 4f 4e 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  ION.#include "sq
2dcd0 6c 69 74 65 33 75 73 65 72 61 75 74 68 2e 68 22  lite3userauth.h"
2dce0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
2dcf0 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75 74  sqlite3_user_aut
2dd00 68 65 6e 74 69 63 61 74 65 20 44 42 20 55 53 45  henticate DB USE
2dd10 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 0a 2a  RNAME PASSWORD.*
2dd20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
2dd30 74 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63  t_user_authentic
2dd40 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
2dd50 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
2dd60 20 55 6e 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c   Unused */.  Tcl
2dd70 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
2dd80 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
2dd90 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
2dda0 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
2ddb0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
2ddc0 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
2ddd0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
2dde0 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
2ddf0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
2de00 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
2de10 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
2de20 20 63 68 61 72 20 2a 7a 55 73 65 72 20 3d 20 30   char *zUser = 0
2de30 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61 73 73 77  ;.  char *zPassw
2de40 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 50 61  d = 0;.  int nPa
2de50 73 73 77 64 20 3d 20 30 3b 0a 20 20 73 71 6c 69  sswd = 0;.  sqli
2de60 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72  te3 *db;.  int r
2de70 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
2de80 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
2de90 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
2dea0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55  , 1, objv, "DB U
2deb0 53 45 52 4e 41 4d 45 20 50 41 53 53 57 4f 52 44  SERNAME PASSWORD
2dec0 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
2ded0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
2dee0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
2def0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
2df00 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
2df10 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74   &db) ){.    ret
2df20 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2df30 20 7d 0a 20 20 7a 55 73 65 72 20 3d 20 54 63 6c   }.  zUser = Tcl
2df40 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2df50 32 5d 29 3b 0a 20 20 7a 50 61 73 73 77 64 20 3d  2]);.  zPasswd =
2df60 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
2df70 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26  omObj(objv[3], &
2df80 6e 50 61 73 73 77 64 29 3b 0a 20 20 72 63 20 3d  nPasswd);.  rc =
2df90 20 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 61 75   sqlite3_user_au
2dfa0 74 68 65 6e 74 69 63 61 74 65 28 64 62 2c 20 7a  thenticate(db, z
2dfb0 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e  User, zPasswd, n
2dfc0 50 61 73 73 77 64 29 3b 0a 20 20 54 63 6c 5f 53  Passwd);.  Tcl_S
2dfd0 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
2dfe0 20 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72   (char *)t1Error
2dff0 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54  Name(rc), TCL_ST
2e000 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20  ATIC);.  return 
2e010 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  TCL_OK;.}.#endif
2e020 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f   /* SQLITE_USER_
2e030 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a  AUTHENTICATION *
2e040 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
2e050 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
2e060 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d  TION./*.** tclcm
2e070 64 3a 20 20 73 71 6c 69 74 65 33 5f 75 73 65 72  d:  sqlite3_user
2e080 5f 61 64 64 20 44 42 20 55 53 45 52 4e 41 4d 45  _add DB USERNAME
2e090 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49   PASSWORD ISADMI
2e0a0 4e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  N.*/.static int 
2e0b0 74 65 73 74 5f 75 73 65 72 5f 61 64 64 28 0a 20  test_user_add(. 
2e0c0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
2e0d0 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65  ntData, /* Unuse
2e0e0 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
2e0f0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2e100 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2e110 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2e120 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2e130 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
2e140 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2e150 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2e160 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
2e170 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
2e180 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
2e190 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ts */.){.  char 
2e1a0 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63 68  *zUser = 0;.  ch
2e1b0 61 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b  ar *zPasswd = 0;
2e1c0 0a 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20 3d  .  int nPasswd =
2e1d0 20 30 3b 0a 20 20 69 6e 74 20 69 73 41 64 6d 69   0;.  int isAdmi
2e1e0 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  n = 0;.  sqlite3
2e1f0 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a   *db;.  int rc;.
2e200 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29  .  if( objc!=5 )
2e210 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
2e220 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
2e230 2c 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52  , objv, "DB USER
2e240 4e 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53  NAME PASSWORD IS
2e250 41 44 4d 49 4e 22 29 3b 0a 20 20 20 20 72 65 74  ADMIN");.    ret
2e260 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
2e270 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
2e280 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
2e290 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
2e2a0 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20  [1]), &db) ){.  
2e2b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
2e2c0 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20  OR;.  }.  zUser 
2e2d0 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  = Tcl_GetString(
2e2e0 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73  objv[2]);.  zPas
2e2f0 73 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  swd = Tcl_GetStr
2e300 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
2e310 33 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20  3], &nPasswd);. 
2e320 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46   Tcl_GetBooleanF
2e330 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
2e340 62 6a 76 5b 34 5d 2c 20 26 69 73 41 64 6d 69 6e  bjv[4], &isAdmin
2e350 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
2e360 33 5f 75 73 65 72 5f 61 64 64 28 64 62 2c 20 7a  3_user_add(db, z
2e370 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c 20 6e  User, zPasswd, n
2e380 50 61 73 73 77 64 2c 20 69 73 41 64 6d 69 6e 29  Passwd, isAdmin)
2e390 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c  ;.  Tcl_SetResul
2e3a0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
2e3b0 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63  *)t1ErrorName(rc
2e3c0 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a  ), TCL_STATIC);.
2e3d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
2e3e0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
2e3f0 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54  ITE_USER_AUTHENT
2e400 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69 66 64  ICATION */..#ifd
2e410 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  ef SQLITE_USER_A
2e420 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 2f 2a  UTHENTICATION./*
2e430 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c  .** tclcmd:  sql
2e440 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65  ite3_user_change
2e450 20 44 42 20 55 53 45 52 4e 41 4d 45 20 50 41 53   DB USERNAME PAS
2e460 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 0a 2a 2f  SWORD ISADMIN.*/
2e470 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
2e480 5f 75 73 65 72 5f 63 68 61 6e 67 65 28 0a 20 20  _user_change(.  
2e490 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
2e4a0 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64  tData, /* Unused
2e4b0 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
2e4c0 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
2e4d0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
2e4e0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
2e4f0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
2e500 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
2e510 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2e520 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
2e530 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
2e540 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
2e550 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
2e560 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  s */.){.  char *
2e570 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 63 68 61  zUser = 0;.  cha
2e580 72 20 2a 7a 50 61 73 73 77 64 20 3d 20 30 3b 0a  r *zPasswd = 0;.
2e590 20 20 69 6e 74 20 6e 50 61 73 73 77 64 20 3d 20    int nPasswd = 
2e5a0 30 3b 0a 20 20 69 6e 74 20 69 73 41 64 6d 69 6e  0;.  int isAdmin
2e5b0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
2e5c0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
2e5d0 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b    if( objc!=5 ){
2e5e0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
2e5f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
2e600 20 6f 62 6a 76 2c 20 22 44 42 20 55 53 45 52 4e   objv, "DB USERN
2e610 41 4d 45 20 50 41 53 53 57 4f 52 44 20 49 53 41  AME PASSWORD ISA
2e620 44 4d 49 4e 22 29 3b 0a 20 20 20 20 72 65 74 75  DMIN");.    retu
2e630 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2e640 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
2e650 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
2e660 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
2e670 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20  1]), &db) ){.   
2e680 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2e690 52 3b 0a 20 20 7d 0a 20 20 7a 55 73 65 72 20 3d  R;.  }.  zUser =
2e6a0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
2e6b0 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a 50 61 73 73  bjv[2]);.  zPass
2e6c0 77 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  wd = Tcl_GetStri
2e6d0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33  ngFromObj(objv[3
2e6e0 5d 2c 20 26 6e 50 61 73 73 77 64 29 3b 0a 20 20  ], &nPasswd);.  
2e6f0 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
2e700 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
2e710 6a 76 5b 34 5d 2c 20 26 69 73 41 64 6d 69 6e 29  jv[4], &isAdmin)
2e720 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
2e730 5f 75 73 65 72 5f 63 68 61 6e 67 65 28 64 62 2c  _user_change(db,
2e740 20 7a 55 73 65 72 2c 20 7a 50 61 73 73 77 64 2c   zUser, zPasswd,
2e750 20 6e 50 61 73 73 77 64 2c 20 69 73 41 64 6d 69   nPasswd, isAdmi
2e760 6e 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  n);.  Tcl_SetRes
2e770 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
2e780 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
2e790 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
2e7a0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2e7b0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
2e7c0 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48 45  QLITE_USER_AUTHE
2e7d0 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 23 69  NTICATION */..#i
2e7e0 66 64 65 66 20 53 51 4c 49 54 45 5f 55 53 45 52  fdef SQLITE_USER
2e7f0 5f 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a  _AUTHENTICATION.
2e800 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73  /*.** tclcmd:  s
2e810 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65  qlite3_user_dele
2e820 74 65 20 44 42 20 55 53 45 52 4e 41 4d 45 0a 2a  te DB USERNAME.*
2e830 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
2e840 74 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 0a 20  t_user_delete(. 
2e850 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
2e860 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73 65  ntData, /* Unuse
2e870 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  d */.  Tcl_Inter
2e880 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
2e890 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
2e8a0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
2e8b0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
2e8c0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
2e8d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2e8e0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2e8f0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
2e900 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
2e910 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
2e920 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20  ts */.){.  char 
2e930 2a 7a 55 73 65 72 20 3d 20 30 3b 0a 20 20 73 71  *zUser = 0;.  sq
2e940 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
2e950 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
2e960 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
2e970 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
2e980 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
2e990 20 55 53 45 52 4e 41 4d 45 22 29 3b 0a 20 20 20   USERNAME");.   
2e9a0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2e9b0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
2e9c0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
2e9d0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
2e9e0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
2e9f0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
2ea00 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 55  _ERROR;.  }.  zU
2ea10 73 65 72 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ser = Tcl_GetStr
2ea20 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
2ea30 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  rc = sqlite3_use
2ea40 72 5f 64 65 6c 65 74 65 28 64 62 2c 20 7a 55 73  r_delete(db, zUs
2ea50 65 72 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65  er);.  Tcl_SetRe
2ea60 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
2ea70 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
2ea80 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
2ea90 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
2eaa0 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  OK;.}.#endif /* 
2eab0 53 51 4c 49 54 45 5f 55 53 45 52 5f 41 55 54 48  SQLITE_USER_AUTH
2eac0 45 4e 54 49 43 41 54 49 4f 4e 20 2a 2f 0a 0a 2f  ENTICATION */../
2ead0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 63 6f  *.** Register co
2eae0 6d 6d 61 6e 64 73 20 77 69 74 68 20 74 68 65 20  mmands with the 
2eaf0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 2e  TCL interpreter.
2eb00 0a 2a 2f 0a 69 6e 74 20 53 71 6c 69 74 65 74 65  .*/.int Sqlitete
2eb10 73 74 31 5f 49 6e 69 74 28 54 63 6c 5f 49 6e 74  st1_Init(Tcl_Int
2eb20 65 72 70 20 2a 69 6e 74 65 72 70 29 7b 0a 20 20  erp *interp){.  
2eb30 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2eb40 65 33 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 3b  e3_search_count;
2eb50 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
2eb60 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f 75 6e  lite3_found_coun
2eb70 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2eb80 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70  sqlite3_interrup
2eb90 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72  t_count;.  exter
2eba0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70  n int sqlite3_op
2ebb0 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 3b 0a 20  en_file_count;. 
2ebc0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
2ebd0 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74 3b 0a  te3_sort_count;.
2ebe0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2ebf0 69 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d  ite3_current_tim
2ec00 65 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  e;.#if SQLITE_OS
2ec10 5f 55 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64  _UNIX && defined
2ec20 28 5f 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53  (__APPLE__) && S
2ec30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
2ec40 4b 49 4e 47 5f 53 54 59 4c 45 0a 20 20 65 78 74  KING_STYLE.  ext
2ec50 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2ec60 68 6f 73 74 69 64 5f 6e 75 6d 3b 0a 23 65 6e 64  hostid_num;.#end
2ec70 69 66 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  if.  extern int 
2ec80 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
2ec90 73 69 7a 65 3b 0a 20 20 65 78 74 65 72 6e 20 69  size;.  extern i
2eca0 6e 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 53  nt sqlite3BtreeS
2ecb0 68 61 72 65 64 43 61 63 68 65 52 65 70 6f 72 74  haredCacheReport
2ecc0 28 76 6f 69 64 2a 2c 0a 20 20 20 20 20 20 20 20  (void*,.        
2ecd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecf0 20 20 54 63 6c 5f 49 6e 74 65 72 70 2a 2c 69 6e    Tcl_Interp*,in
2ed00 74 2c 54 63 6c 5f 4f 62 6a 2a 43 4f 4e 53 54 2a  t,Tcl_Obj*CONST*
2ed10 29 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75  );.  static stru
2ed20 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a  ct {.     char *
2ed30 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f  zName;.     Tcl_
2ed40 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63 3b 0a  CmdProc *xProc;.
2ed50 20 20 7d 20 61 43 6d 64 5b 5d 20 3d 20 7b 0a 20    } aCmd[] = {. 
2ed60 20 20 20 20 7b 20 22 64 62 5f 65 6e 74 65 72 22      { "db_enter"
2ed70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ed80 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2ed90 72 6f 63 2a 29 64 62 5f 65 6e 74 65 72 20 20 20  roc*)db_enter   
2eda0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2edb0 20 20 20 20 7b 20 22 64 62 5f 6c 65 61 76 65 22      { "db_leave"
2edc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2edd0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2ede0 72 6f 63 2a 29 64 62 5f 6c 65 61 76 65 20 20 20  roc*)db_leave   
2edf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2ee00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2ee10 70 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20  printf_int",    
2ee20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2ee30 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
2ee40 69 6e 74 66 5f 69 6e 74 20 20 20 20 7d 2c 0a 20  intf_int    },. 
2ee50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2ee60 70 72 69 6e 74 66 5f 69 6e 74 36 34 22 2c 20 20  printf_int64",  
2ee70 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2ee80 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
2ee90 69 6e 74 66 5f 69 6e 74 36 34 20 20 7d 2c 0a 20  intf_int64  },. 
2eea0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2eeb0 70 72 69 6e 74 66 5f 6c 6f 6e 67 22 2c 20 20 20  printf_long",   
2eec0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2eed0 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
2eee0 69 6e 74 66 5f 6c 6f 6e 67 20 20 20 7d 2c 0a 20  intf_long   },. 
2eef0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2ef00 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20 20  printf_str",    
2ef10 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2ef20 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
2ef30 69 6e 74 66 5f 73 74 72 20 20 20 20 7d 2c 0a 20  intf_str    },. 
2ef40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
2ef50 6e 70 72 69 6e 74 66 5f 73 74 72 22 2c 20 20 20  nprintf_str",   
2ef60 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2ef70 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 73 6e 70  roc*)sqlite3_snp
2ef80 72 69 6e 74 66 5f 73 74 72 20 20 20 7d 2c 0a 20  rintf_str   },. 
2ef90 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2efa0 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 22 2c  printf_stronly",
2efb0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2efc0 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
2efd0 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 7d 2c 0a 20  intf_stronly},. 
2efe0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2eff0 70 72 69 6e 74 66 5f 64 6f 75 62 6c 65 22 2c 20  printf_double", 
2f000 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2f010 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
2f020 69 6e 74 66 5f 64 6f 75 62 6c 65 20 7d 2c 0a 20  intf_double },. 
2f030 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2f040 70 72 69 6e 74 66 5f 73 63 61 6c 65 64 22 2c 20  printf_scaled", 
2f050 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2f060 72 6f 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72  roc*)sqlite3_mpr
2f070 69 6e 74 66 5f 73 63 61 6c 65 64 20 7d 2c 0a 20  intf_scaled },. 
2f080 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2f090 70 72 69 6e 74 66 5f 68 65 78 64 6f 75 62 6c 65  printf_hexdouble
2f0a0 22 2c 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f  ",   (Tcl_CmdPro
2f0b0 63 2a 29 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  c*)sqlite3_mprin
2f0c0 74 66 5f 68 65 78 64 6f 75 62 6c 65 7d 2c 0a 20  tf_hexdouble},. 
2f0d0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d      { "sqlite3_m
2f0e0 70 72 69 6e 74 66 5f 7a 5f 74 65 73 74 22 2c 20  printf_z_test", 
2f0f0 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2f100 72 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74  roc*)test_mprint
2f110 66 5f 7a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  f_z        },.  
2f120 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6d 70     { "sqlite3_mp
2f130 72 69 6e 74 66 5f 6e 5f 74 65 73 74 22 2c 20 20  rintf_n_test",  
2f140 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2f150 6f 63 2a 29 74 65 73 74 5f 6d 70 72 69 6e 74 66  oc*)test_mprintf
2f160 5f 6e 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20  _n        },.   
2f170 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 6e 70    { "sqlite3_snp
2f180 72 69 6e 74 66 5f 69 6e 74 22 2c 20 20 20 20 20  rintf_int",     
2f190 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2f1a0 63 2a 29 74 65 73 74 5f 73 6e 70 72 69 6e 74 66  c*)test_snprintf
2f1b0 5f 69 6e 74 20 20 20 20 20 7d 2c 0a 20 20 20 20  _int     },.    
2f1c0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 61 73 74   { "sqlite3_last
2f1d0 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 22 2c 20  _insert_rowid", 
2f1e0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2f1f0 2a 29 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69  *)test_last_rowi
2f200 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  d       },.     
2f210 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f  { "sqlite3_exec_
2f220 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20 20 20  printf",        
2f230 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2f240 29 74 65 73 74 5f 65 78 65 63 5f 70 72 69 6e 74  )test_exec_print
2f250 66 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  f      },.     {
2f260 20 22 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 68   "sqlite3_exec_h
2f270 65 78 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ex",            
2f280 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2f290 74 65 73 74 5f 65 78 65 63 5f 68 65 78 20 20 20  test_exec_hex   
2f2a0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2f2b0 22 73 71 6c 69 74 65 33 5f 65 78 65 63 22 2c 20  "sqlite3_exec", 
2f2c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f2d0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2f2e0 65 73 74 5f 65 78 65 63 20 20 20 20 20 20 20 20  est_exec        
2f2f0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2f300 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 22  sqlite3_exec_nr"
2f310 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f320 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2f330 73 74 5f 65 78 65 63 5f 6e 72 20 20 20 20 20 20  st_exec_nr      
2f340 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
2f350 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54  QLITE_OMIT_GET_T
2f360 41 42 4c 45 0a 20 20 20 20 20 7b 20 22 73 71 6c  ABLE.     { "sql
2f370 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65 5f 70  ite3_get_table_p
2f380 72 69 6e 74 66 22 2c 20 20 20 20 20 20 28 54 63  rintf",      (Tc
2f390 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2f3a0 67 65 74 5f 74 61 62 6c 65 5f 70 72 69 6e 74 66  get_table_printf
2f3b0 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20   },.#endif.     
2f3c0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  { "sqlite3_close
2f3d0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2f3e0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2f3f0 29 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f  )sqlite_test_clo
2f400 73 65 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  se     },.     {
2f410 20 22 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f   "sqlite3_close_
2f420 76 32 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  v2",            
2f430 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2f440 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73  sqlite_test_clos
2f450 65 5f 76 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20  e_v2  },.     { 
2f460 22 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f  "sqlite3_create_
2f470 66 75 6e 63 74 69 6f 6e 22 2c 20 20 20 20 20 20  function",      
2f480 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2f490 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  est_create_funct
2f4a0 69 6f 6e 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  ion  },.     { "
2f4b0 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61  sqlite3_create_a
2f4c0 67 67 72 65 67 61 74 65 22 2c 20 20 20 20 20 20  ggregate",      
2f4d0 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65  (Tcl_CmdProc*)te
2f4e0 73 74 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67  st_create_aggreg
2f4f0 61 74 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  ate },.     { "s
2f500 71 6c 69 74 65 5f 72 65 67 69 73 74 65 72 5f 74  qlite_register_t
2f510 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 28  est_function", (
2f520 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2f530 74 5f 72 65 67 69 73 74 65 72 5f 66 75 6e 63 20  t_register_func 
2f540 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2f550 6c 69 74 65 5f 61 62 6f 72 74 22 2c 20 20 20 20  lite_abort",    
2f560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2f570 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2f580 74 65 5f 61 62 6f 72 74 20 20 20 20 20 20 20 20  te_abort        
2f590 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2f5a0 69 74 65 5f 62 69 6e 64 22 2c 20 20 20 20 20 20  ite_bind",      
2f5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63               (Tc
2f5c0 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2f5d0 62 69 6e 64 20 20 20 20 20 20 20 20 20 20 20 20  bind            
2f5e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 62 72 65 61   },.     { "brea
2f5f0 6b 70 6f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  kpoint",        
2f600 20 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c              (Tcl
2f610 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62  _CmdProc*)test_b
2f620 72 65 61 6b 70 6f 69 6e 74 20 20 20 20 20 20 20  reakpoint       
2f630 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2f640 65 33 5f 6b 65 79 22 2c 20 20 20 20 20 20 20 20  e3_key",        
2f650 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2f660 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6b 65  CmdProc*)test_ke
2f670 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  y              }
2f680 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2f690 33 5f 72 65 6b 65 79 22 2c 20 20 20 20 20 20 20  3_rekey",       
2f6a0 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2f6b0 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 72 65 6b  mdProc*)test_rek
2f6c0 65 79 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  ey            },
2f6d0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f  .     { "sqlite_
2f6e0 73 65 74 5f 6d 61 67 69 63 22 2c 20 20 20 20 20  set_magic",     
2f6f0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2f700 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 73 65  dProc*)sqlite_se
2f710 74 5f 6d 61 67 69 63 20 20 20 20 20 20 7d 2c 0a  t_magic      },.
2f720 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2f730 69 6e 74 65 72 72 75 70 74 22 2c 20 20 20 20 20  interrupt",     
2f740 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2f750 50 72 6f 63 2a 29 74 65 73 74 5f 69 6e 74 65 72  Proc*)test_inter
2f760 72 75 70 74 20 20 20 20 20 20 20 20 7d 2c 0a 20  rupt        },. 
2f770 20 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65      { "sqlite_de
2f780 6c 65 74 65 5f 66 75 6e 63 74 69 6f 6e 22 2c 20  lete_function", 
2f790 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2f7a0 72 6f 63 2a 29 64 65 6c 65 74 65 5f 66 75 6e 63  roc*)delete_func
2f7b0 74 69 6f 6e 20 20 20 20 20 20 20 7d 2c 0a 20 20  tion       },.  
2f7c0 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 64 65 6c     { "sqlite_del
2f7d0 65 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c 20  ete_collation", 
2f7e0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2f7f0 6f 63 2a 29 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  oc*)delete_colla
2f800 74 69 6f 6e 20 20 20 20 20 20 7d 2c 0a 20 20 20  tion      },.   
2f810 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74    { "sqlite3_get
2f820 5f 61 75 74 6f 63 6f 6d 6d 69 74 22 2c 20 20 20  _autocommit",   
2f830 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2f840 63 2a 29 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69  c*)get_autocommi
2f850 74 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20  t        },.    
2f860 20 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 61 63   { "sqlite3_stac
2f870 6b 5f 75 73 65 64 22 2c 20 20 20 20 20 20 20 20  k_used",        
2f880 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2f890 2a 29 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65  *)test_stack_use
2f8a0 64 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  d       },.     
2f8b0 7b 20 22 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  { "sqlite3_busy_
2f8c0 74 69 6d 65 6f 75 74 22 2c 20 20 20 20 20 20 20  timeout",       
2f8d0 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2f8e0 29 74 65 73 74 5f 62 75 73 79 5f 74 69 6d 65 6f  )test_busy_timeo
2f8f0 75 74 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ut     },.     {
2f900 20 22 70 72 69 6e 74 66 22 2c 20 20 20 20 20 20   "printf",      
2f910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f920 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2f930 74 65 73 74 5f 70 72 69 6e 74 66 20 20 20 20 20  test_printf     
2f940 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2f950 22 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 22  "sqlite3IoTrace"
2f960 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ,              (
2f970 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2f980 74 5f 69 6f 5f 74 72 61 63 65 20 20 20 20 20 20  t_io_trace      
2f990 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 63 6c     },.     { "cl
2f9a0 61 6e 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64  ang_sanitize_add
2f9b0 72 65 73 73 22 2c 20 20 20 20 20 20 20 20 28 54  ress",        (T
2f9c0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 63 6c 61 6e  cl_CmdProc*)clan
2f9d0 67 5f 73 61 6e 69 74 69 7a 65 5f 61 64 64 72 65  g_sanitize_addre
2f9e0 73 73 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  ss },.  };.  sta
2f9f0 74 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20  tic struct {.   
2fa00 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20    char *zName;. 
2fa10 20 20 20 20 54 63 6c 5f 4f 62 6a 43 6d 64 50 72      Tcl_ObjCmdPr
2fa20 6f 63 20 2a 78 50 72 6f 63 3b 0a 20 20 20 20 20  oc *xProc;.     
2fa30 76 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61  void *clientData
2fa40 3b 0a 20 20 7d 20 61 4f 62 6a 43 6d 64 5b 5d 20  ;.  } aObjCmd[] 
2fa50 3d 20 7b 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  = {.     { "sqli
2fa60 74 65 33 5f 63 6f 6e 6e 65 63 74 69 6f 6e 5f 70  te3_connection_p
2fa70 6f 69 6e 74 65 72 22 2c 20 20 20 20 67 65 74 5f  ointer",    get_
2fa80 73 71 6c 69 74 65 5f 70 6f 69 6e 74 65 72 2c 20  sqlite_pointer, 
2fa90 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2faa0 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 22 2c 20  ite3_bind_int", 
2fab0 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2fac0 74 5f 62 69 6e 64 5f 69 6e 74 2c 20 20 20 20 20  t_bind_int,     
2fad0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
2fae0 6c 69 74 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62  lite3_bind_zerob
2faf0 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20 74 65  lob",         te
2fb00 73 74 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  st_bind_zeroblob
2fb10 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  , 0 },.     { "s
2fb20 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36  qlite3_bind_int6
2fb30 34 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74  4",            t
2fb40 65 73 74 5f 62 69 6e 64 5f 69 6e 74 36 34 2c 20  est_bind_int64, 
2fb50 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
2fb60 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75  sqlite3_bind_dou
2fb70 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20  ble",           
2fb80 74 65 73 74 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  test_bind_double
2fb90 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20  ,   0 },.     { 
2fba0 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75  "sqlite3_bind_nu
2fbb0 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ll",            
2fbc0 20 74 65 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 20   test_bind_null 
2fbd0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
2fbe0 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74   "sqlite3_bind_t
2fbf0 65 78 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  ext",           
2fc00 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78 74    test_bind_text
2fc10 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2fc20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2fc30 74 65 78 74 31 36 22 2c 20 20 20 20 20 20 20 20  text16",        
2fc40 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 74 65 78     test_bind_tex
2fc50 74 31 36 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  t16   ,0 },.    
2fc60 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2fc70 5f 62 6c 6f 62 22 2c 20 20 20 20 20 20 20 20 20  _blob",         
2fc80 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 62 6c      test_bind_bl
2fc90 6f 62 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ob     ,0 },.   
2fca0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2fcb0 64 5f 70 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e  d_parameter_coun
2fcc0 74 22 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70  t",  test_bind_p
2fcd0 61 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 2c 20  arameter_count, 
2fce0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2fcf0 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
2fd00 65 72 5f 6e 61 6d 65 22 2c 20 20 20 74 65 73 74  er_name",   test
2fd10 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2fd20 6e 61 6d 65 2c 20 20 30 7d 2c 0a 20 20 20 20 20  name,  0},.     
2fd30 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2fd40 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 22  parameter_index"
2fd50 2c 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72  ,  test_bind_par
2fd60 61 6d 65 74 65 72 5f 69 6e 64 65 78 2c 20 30 7d  ameter_index, 0}
2fd70 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2fd80 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73  3_clear_bindings
2fd90 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f 63  ",        test_c
2fda0 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 2c 20 30  lear_bindings, 0
2fdb0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2fdc0 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
2fdd0 73 5f 6e 75 6c 6c 22 2c 20 20 20 74 65 73 74 5f  s_null",   test_
2fde0 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67 73 5f 6e  clear_bindings_n
2fdf0 75 6c 6c 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  ull, 0},.     { 
2fe00 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22 2c  "sqlite3_sleep",
2fe10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20 20   test_sleep,    
2fe30 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
2fe40 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64   "sqlite3_errcod
2fe50 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2fe60 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20 20    test_errcode  
2fe70 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2fe80 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  { "sqlite3_exten
2fe90 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20 20  ded_errcode",   
2fea0 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f     test_ex_errco
2feb0 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  de    ,0 },.    
2fec0 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 6d   { "sqlite3_errm
2fed0 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  sg",            
2fee0 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67 20      test_errmsg 
2fef0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2ff00 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
2ff10 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20 20  msg16",         
2ff20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
2ff30 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  16      ,0 },.  
2ff40 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f 70     { "sqlite3_op
2ff50 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  en",            
2ff60 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e 20        test_open 
2ff70 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20           ,0 },. 
2ff80 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
2ff90 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20 20  pen16",         
2ffa0 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
2ffb0 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  16        ,0 },.
2ffc0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ffd0 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20 20  open_v2",       
2ffe0 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
2fff0 6e 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d 2c  n_v2       ,0 },
30000 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
30010 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20 20  _complete16",   
30020 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
30030 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20 7d  mplete16    ,0 }
30040 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ,..     { "sqlit
30050 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20 20  e3_prepare",    
30060 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
30070 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c 30  prepare       ,0
30080 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
30090 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c 20  te3_prepare16", 
300a0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
300b0 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20 2c  _prepare16     ,
300c0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
300d0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 22  ite3_prepare_v2"
300e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
300f0 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20 20  t_prepare_v2    
30100 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
30110 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74 6b  lite3_prepare_tk
30120 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74 65  t3134",       te
30130 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33 31  st_prepare_tkt31
30140 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22  34, 0},.     { "
30150 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
30160 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20 20  6_v2",          
30170 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f 76  test_prepare16_v
30180 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  2  ,0 },.     { 
30190 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a  "sqlite3_finaliz
301a0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
301b0 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20 20   test_finalize  
301c0 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b      ,0 },.     {
301d0 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73   "sqlite3_stmt_s
301e0 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20 20  tatus",         
301f0 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61 74    test_stmt_stat
30200 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20  us   ,0 },.     
30210 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65 74  { "sqlite3_reset
30220 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30230 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20 20     test_reset   
30240 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
30250 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70 69   { "sqlite3_expi
30260 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  red",           
30270 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65 64      test_expired
30280 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
30290 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72 61    { "sqlite3_tra
302a0 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22 2c  nsfer_bindings",
302b0 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73 66       test_transf
302c0 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20 20  er_bind ,0 },.  
302d0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 68     { "sqlite3_ch
302e0 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20 20  anges",         
302f0 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e 67        test_chang
30300 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  es       ,0 },. 
30310 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 73      { "sqlite3_s
30320 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  tep",           
30330 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65 70         test_step
30340 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
30350 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
30360 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20 20  sql",           
30370 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c          test_sql
30380 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c             ,0 },
30390 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
303a0 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20 20  _next_stmt",    
303b0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e 65           test_ne
303c0 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20 7d  xt_stmt     ,0 }
303d0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
303e0 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 22  3_stmt_readonly"
303f0 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73  ,         test_s
30400 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30 20  tmt_readonly ,0 
30410 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30420 65 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20 20  e3_stmt_busy",  
30430 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
30440 73 74 6d 74 5f 62 75 73 79 20 20 20 20 20 2c 30  stmt_busy     ,0
30450 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65 73   },.     { "uses
30460 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c 20  _stmt_journal", 
30470 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65 73              uses
30480 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c 30  _stmt_journal ,0
30490 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c   },..     { "sql
304a0 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d  ite3_release_mem
304b0 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74 65 73  ory",        tes
304c0 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  t_release_memory
304d0 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b  ,     0},.     {
304e0 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c   "sqlite3_db_rel
304f0 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20 20  ease_memory",   
30500 20 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61 73    test_db_releas
30510 65 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a 20  e_memory,  0},. 
30520 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64      { "sqlite3_d
30530 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 20  b_filename",    
30540 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f 66         test_db_f
30550 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20 20  ilename,        
30560 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
30570 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 22  te3_db_readonly"
30580 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ,           test
30590 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20 20  _db_readonly,   
305a0 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b 20       0},.     { 
305b0 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65  "sqlite3_soft_he
305c0 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20 20  ap_limit",      
305d0 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70 5f   test_soft_heap_
305e0 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20 20  limit,    0},.  
305f0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 68     { "sqlite3_th
30600 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20 20  read_cleanup",  
30610 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65 61        test_threa
30620 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20 30  d_cleanup,     0
30630 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30640 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e  e3_pager_refcoun
30650 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  ts",       test_
30660 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73 2c  pager_refcounts,
30670 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b 20      0},..     { 
30680 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78  "sqlite3_load_ex
30690 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20 20  tension",       
306a0 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65 6e   test_load_exten
306b0 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20 20  sion,     0},.  
306c0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 6e     { "sqlite3_en
306d0 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
306e0 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62 6c  ion", test_enabl
306f0 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20 30  e_load,        0
30700 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
30710 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75  e3_extended_resu
30720 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74 5f  lt_codes", test_
30730 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
30740 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20 20  codes, 0},.     
30750 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  { "sqlite3_limit
30760 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30770 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20 20     test_limit,  
30780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
30790 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76 65  },..     { "save
307a0 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20 20  _prng_state",   
307b0 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76 65              save
307c0 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20 20  _prng_state,    
307d0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65 73  0 },.     { "res
307e0 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 22  tore_prng_state"
307f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65 73  ,            res
30800 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c  tore_prng_state,
30810 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
30820 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c  set_prng_state",
30830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
30840 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20  set_prng_state, 
30850 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64    0 },.     { "d
30860 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f  atabase_never_co
30870 72 72 75 70 74 22 2c 20 20 20 20 20 20 20 20 64  rrupt",        d
30880 61 74 61 62 61 73 65 5f 6e 65 76 65 72 5f 63 6f  atabase_never_co
30890 72 72 75 70 74 2c 20 30 7d 2c 0a 20 20 20 20 20  rrupt, 0},.     
308a0 7b 20 22 64 61 74 61 62 61 73 65 5f 6d 61 79 5f  { "database_may_
308b0 62 65 5f 63 6f 72 72 75 70 74 22 2c 20 20 20 20  be_corrupt",    
308c0 20 20 20 64 61 74 61 62 61 73 65 5f 6d 61 79 5f     database_may_
308d0 62 65 5f 63 6f 72 72 75 70 74 2c 20 30 7d 2c 0a  be_corrupt, 0},.
308e0 20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61       { "optimiza
308f0 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 22 2c 20 20  tion_control",  
30900 20 20 20 20 20 20 20 20 6f 70 74 69 6d 69 7a 61          optimiza
30910 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 2c 30 7d 2c  tion_control,0},
30920 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
30930 49 4e 0a 20 20 20 20 20 7b 20 22 6c 6f 63 6b 5f  IN.     { "lock_
30940 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20 20 20  win32_file",    
30950 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33 32             win32
30960 5f 66 69 6c 65 5f 6c 6f 63 6b 2c 20 20 20 20 30  _file_lock,    0
30970 20 7d 2c 0a 20 20 20 20 20 7b 20 22 65 78 69 73   },.     { "exis
30980 74 73 5f 77 69 6e 33 32 5f 70 61 74 68 22 2c 20  ts_win32_path", 
30990 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 33              win3
309a0 32 5f 65 78 69 73 74 73 5f 70 61 74 68 2c 20 20  2_exists_path,  
309b0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6e  0 },.     { "fin
309c0 64 5f 77 69 6e 33 32 5f 66 69 6c 65 22 2c 20 20  d_win32_file",  
309d0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e               win
309e0 33 32 5f 66 69 6e 64 5f 66 69 6c 65 2c 20 20 20  32_find_file,   
309f0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65   0 },.     { "de
30a00 6c 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 22  lete_win32_file"
30a10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69  ,             wi
30a20 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65 2c  n32_delete_file,
30a30 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d    0 },.     { "m
30a40 61 6b 65 5f 77 69 6e 33 32 5f 64 69 72 22 2c 20  ake_win32_dir", 
30a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
30a60 69 6e 33 32 5f 6d 6b 64 69 72 2c 20 20 20 20 20  in32_mkdir,     
30a70 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
30a80 72 65 6d 6f 76 65 5f 77 69 6e 33 32 5f 64 69 72  remove_win32_dir
30a90 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
30aa0 77 69 6e 33 32 5f 72 6d 64 69 72 2c 20 20 20 20  win32_rmdir,    
30ab0 20 20 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a      0 },.#endif.
30ac0 20 20 20 20 20 7b 20 22 74 63 6c 5f 6f 62 6a 70       { "tcl_objp
30ad0 72 6f 63 22 2c 20 20 20 20 20 20 20 20 20 20 20  roc",           
30ae0 20 20 20 20 20 20 20 20 72 75 6e 41 73 4f 62 6a          runAsObj
30af0 50 72 6f 63 2c 20 20 20 20 20 20 20 30 20 7d 2c  Proc,       0 },
30b00 0a 0a 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ..     /* sqlite
30b10 33 5f 63 6f 6c 75 6d 6e 5f 2a 28 29 20 41 50 49  3_column_*() API
30b20 20 2a 2f 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   */.     { "sqli
30b30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  te3_column_count
30b40 22 2c 20 20 20 20 20 20 20 20 20 20 74 65 73 74  ",          test
30b50 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 20 20 2c  _column_count  ,
30b60 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
30b70 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 22  ite3_data_count"
30b80 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ,            tes
30b90 74 5f 64 61 74 61 5f 63 6f 75 6e 74 20 20 20 20  t_data_count    
30ba0 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
30bb0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70  lite3_column_typ
30bc0 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65  e",           te
30bd0 73 74 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 20 20  st_column_type  
30be0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
30bf0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
30c00 6f 62 22 2c 20 20 20 20 20 20 20 20 20 20 20 74  ob",           t
30c10 65 73 74 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 20  est_column_blob 
30c20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22    ,0 },.     { "
30c30 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
30c40 6f 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 20  ouble",         
30c50 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  test_column_doub
30c60 6c 65 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20  le ,0 },.     { 
30c70 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
30c80 69 6e 74 36 34 22 2c 20 20 20 20 20 20 20 20 20  int64",         
30c90 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f 69 6e 74   test_column_int
30ca0 36 34 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  64  ,0 },.     {
30cb0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
30cc0 5f 74 65 78 74 22 2c 20 20 20 74 65 73 74 5f 73  _text",   test_s
30cd0 74 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64  tmt_utf8,  (void
30ce0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
30cf0 5f 74 65 78 74 20 7d 2c 0a 20 20 20 20 20 7b 20  _text },.     { 
30d00 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
30d10 6e 61 6d 65 22 2c 20 20 20 74 65 73 74 5f 73 74  name",   test_st
30d20 6d 74 5f 75 74 66 38 2c 20 20 28 76 6f 69 64 2a  mt_utf8,  (void*
30d30 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
30d40 6e 61 6d 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22  name },.     { "
30d50 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
30d60 6e 74 22 2c 20 20 20 20 74 65 73 74 5f 73 74 6d  nt",    test_stm
30d70 74 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29  t_int,   (void*)
30d80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
30d90 6e 74 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  nt  },.     { "s
30da0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
30db0 74 65 73 22 2c 20 20 74 65 73 74 5f 73 74 6d 74  tes",  test_stmt
30dc0 5f 69 6e 74 2c 20 20 20 28 76 6f 69 64 2a 29 73  _int,   (void*)s
30dd0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
30de0 74 65 73 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51  tes},.#ifndef SQ
30df0 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
30e00 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  PE.     { "sqlit
30e10 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
30e20 70 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  pe",test_stmt_ut
30e30 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
30e40 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70  3_column_decltyp
30e50 65 7d 2c 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  e},.#endif.#ifde
30e60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
30e70 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
30e80 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
30e90 6e 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 22  n_database_name"
30ea0 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c  ,test_stmt_utf8,
30eb0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
30ec0 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
30ed0 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33  ame},.{ "sqlite3
30ee0 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61  _column_table_na
30ef0 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75 74  me",test_stmt_ut
30f00 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  f8,(void*)sqlite
30f10 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
30f20 61 6d 65 7d 2c 0a 7b 20 22 73 71 6c 69 74 65 33  ame},.{ "sqlite3
30f30 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
30f40 61 6d 65 22 2c 74 65 73 74 5f 73 74 6d 74 5f 75  ame",test_stmt_u
30f50 74 66 38 2c 28 76 6f 69 64 2a 29 73 71 6c 69 74  tf8,(void*)sqlit
30f60 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
30f70 5f 6e 61 6d 65 7d 2c 0a 23 65 6e 64 69 66 0a 0a  _name},.#endif..
30f80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
30f90 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b  MIT_UTF16.     {
30fa0 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e   "sqlite3_column
30fb0 5f 62 79 74 65 73 31 36 22 2c 20 74 65 73 74 5f  _bytes16", test_
30fc0 73 74 6d 74 5f 69 6e 74 2c 20 28 76 6f 69 64 2a  stmt_int, (void*
30fd0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
30fe0 62 79 74 65 73 31 36 20 7d 2c 0a 20 20 20 20 20  bytes16 },.     
30ff0 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
31000 6e 5f 74 65 78 74 31 36 22 2c 20 20 74 65 73 74  n_text16",  test
31010 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f  _stmt_utf16, (vo
31020 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  id*)sqlite3_colu
31030 6d 6e 5f 74 65 78 74 31 36 7d 2c 0a 20 20 20 20  mn_text16},.    
31040 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
31050 6d 6e 5f 6e 61 6d 65 31 36 22 2c 20 20 74 65 73  mn_name16",  tes
31060 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76  t_stmt_utf16, (v
31070 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
31080 75 6d 6e 5f 6e 61 6d 65 31 36 7d 2c 0a 20 20 20  umn_name16},.   
31090 20 20 7b 20 22 61 64 64 5f 61 6c 69 67 6e 6d 65    { "add_alignme
310a0 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
310b0 6e 73 22 2c 20 61 64 64 5f 61 6c 69 67 6e 6d 65  ns", add_alignme
310c0 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69 6f  nt_test_collatio
310d0 6e 73 2c 20 30 20 20 20 20 20 20 7d 2c 0a 23 69  ns, 0      },.#i
310e0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
310f0 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20  T_DECLTYPE.     
31100 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
31110 6e 5f 64 65 63 6c 74 79 70 65 31 36 22 2c 74 65  n_decltype16",te
31120 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 2c 28 76  st_stmt_utf16,(v
31130 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  oid*)sqlite3_col
31140 75 6d 6e 5f 64 65 63 6c 74 79 70 65 31 36 7d 2c  umn_decltype16},
31150 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
31160 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c  QLITE_ENABLE_COL
31170 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 7b 22 73  UMN_METADATA.{"s
31180 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
31190 74 61 62 61 73 65 5f 6e 61 6d 65 31 36 22 2c 0a  tabase_name16",.
311a0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31    test_stmt_utf1
311b0 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  6, (void*)sqlite
311c0 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
311d0 65 5f 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c  e_name16},.{"sql
311e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c  ite3_column_tabl
311f0 65 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f  e_name16", test_
31200 73 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69  stmt_utf16, (voi
31210 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
31220 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36 7d 2c  n_table_name16},
31230 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  .{"sqlite3_colum
31240 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 22  n_origin_name16"
31250 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31  , test_stmt_utf1
31260 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  6, (void*)sqlite
31270 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f  3_column_origin_
31280 6e 61 6d 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a  name16},.#endif.
31290 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
312a0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
312b0 6c 6c 61 74 69 6f 6e 5f 76 32 22 2c 20 74 65 73  llation_v2", tes
312c0 74 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  t_create_collati
312d0 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 20 20 20 20  on_v2, 0 },.    
312e0 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 6c 6f 62   { "sqlite3_glob
312f0 61 6c 5f 72 65 63 6f 76 65 72 22 2c 20 20 20 20  al_recover",    
31300 20 74 65 73 74 5f 67 6c 6f 62 61 6c 5f 72 65 63   test_global_rec
31310 6f 76 65 72 2c 20 30 20 20 20 7d 2c 0a 20 20 20  over, 0   },.   
31320 20 20 7b 20 22 77 6f 72 6b 69 6e 67 5f 36 34 62    { "working_64b
31330 69 74 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20  it_int",        
31340 20 20 77 6f 72 6b 69 6e 67 5f 36 34 62 69 74 5f    working_64bit_
31350 69 6e 74 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20  int,   0   },.  
31360 20 20 20 7b 20 22 76 66 73 5f 75 6e 6c 69 6e 6b     { "vfs_unlink
31370 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 20  _test",         
31380 20 20 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65     vfs_unlink_te
31390 73 74 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20  st,     0   },. 
313a0 20 20 20 20 7b 20 22 76 66 73 5f 69 6e 69 74 66      { "vfs_initf
313b0 61 69 6c 5f 74 65 73 74 22 2c 20 20 20 20 20 20  ail_test",      
313c0 20 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c      vfs_initfail
313d0 5f 74 65 73 74 2c 20 20 20 30 20 20 20 7d 2c 0a  _test,   0   },.
313e0 20 20 20 20 20 7b 20 22 76 66 73 5f 75 6e 72 65       { "vfs_unre
313f0 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20 20  gister_all",    
31400 20 20 20 20 20 76 66 73 5f 75 6e 72 65 67 69 73       vfs_unregis
31410 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d 2c  ter_all,  0   },
31420 0a 20 20 20 20 20 7b 20 22 76 66 73 5f 72 65 72  .     { "vfs_rer
31430 65 67 69 73 74 65 72 5f 61 6c 6c 22 2c 20 20 20  egister_all",   
31440 20 20 20 20 20 20 76 66 73 5f 72 65 72 65 67 69        vfs_reregi
31450 73 74 65 72 5f 61 6c 6c 2c 20 20 30 20 20 20 7d  ster_all,  0   }
31460 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
31470 6f 6e 74 72 6f 6c 5f 74 65 73 74 22 2c 20 20 20  ontrol_test",   
31480 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f 6e 74         file_cont
31490 72 6f 6c 5f 74 65 73 74 2c 20 20 20 30 20 20 20  rol_test,   0   
314a0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
314b0 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e  control_lasterrn
314c0 6f 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f  o_test", file_co
314d0 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f  ntrol_lasterrno_
314e0 74 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20  test,  0   },.  
314f0 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
31500 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73  ol_lockproxy_tes
31510 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  t", file_control
31520 5f 6c 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 2c  _lockproxy_test,
31530 20 20 30 20 20 20 7d 2c 0a 23 69 66 64 65 66 20    0   },.#ifdef 
31540 5f 5f 41 50 50 4c 45 5f 5f 0a 20 20 20 20 20 7b  __APPLE__.     {
31550 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74   "file_control_t
31560 72 75 6e 63 61 74 65 5f 74 65 73 74 22 2c 20 66  runcate_test", f
31570 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 72 75 6e  ile_control_trun
31580 63 61 74 65 5f 74 65 73 74 2c 20 20 30 20 20 20  cate_test,  0   
31590 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
315a0 63 6f 6e 74 72 6f 6c 5f 72 65 70 6c 61 63 65 5f  control_replace_
315b0 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  test", file_cont
315c0 72 6f 6c 5f 72 65 70 6c 61 63 65 5f 74 65 73 74  rol_replace_test
315d0 2c 20 20 30 20 20 20 7d 2c 0a 23 65 6e 64 69 66  ,  0   },.#endif
315e0 20 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63   .     { "file_c
315f0 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65  ontrol_chunksize
31600 5f 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e  _test", file_con
31610 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74  trol_chunksize_t
31620 65 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20  est,  0   },.   
31630 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
31640 6c 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 22  l_sizehint_test"
31650 2c 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  ,  file_control_
31660 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 2c 20 20  sizehint_test,  
31670 20 30 20 20 20 7d 2c 0a 23 69 66 20 53 51 4c 49   0   },.#if SQLI
31680 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20 7b  TE_OS_WIN.     {
31690 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77   "file_control_w
316a0 69 6e 33 32 5f 61 76 5f 72 65 74 72 79 22 2c 20  in32_av_retry", 
316b0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e  file_control_win
316c0 33 32 5f 61 76 5f 72 65 74 72 79 2c 20 20 30 20  32_av_retry,  0 
316d0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c    },.     { "fil
316e0 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
316f0 73 65 74 5f 68 61 6e 64 6c 65 22 2c 20 66 69 6c  set_handle", fil
31700 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
31710 73 65 74 5f 68 61 6e 64 6c 65 2c 20 30 20 20 7d  set_handle, 0  }
31720 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20  ,.#endif.     { 
31730 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65  "file_control_pe
31740 72 73 69 73 74 5f 77 61 6c 22 2c 20 20 20 20 66  rsist_wal",    f
31750 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65 72 73  ile_control_pers
31760 69 73 74 5f 77 61 6c 2c 20 20 20 20 20 30 20 20  ist_wal,     0  
31770 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65   },.     { "file
31780 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61  _control_powersa
31790 66 65 5f 6f 76 65 72 77 72 69 74 65 22 2c 66 69  fe_overwrite",fi
317a0 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 6f 77 65 72  le_control_power
317b0 73 61 66 65 5f 6f 76 65 72 77 72 69 74 65 2c 30  safe_overwrite,0
317c0 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f  },.     { "file_
317d0 63 6f 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 22  control_vfsname"
317e0 2c 20 20 20 20 20 20 20 20 66 69 6c 65 5f 63 6f  ,        file_co
317f0 6e 74 72 6f 6c 5f 76 66 73 6e 61 6d 65 2c 20 20  ntrol_vfsname,  
31800 20 20 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20         0   },.  
31810 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72     { "file_contr
31820 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 22  ol_tempfilename"
31830 2c 20 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  ,   file_control
31840 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65 2c 20 20  _tempfilename,  
31850 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
31860 22 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73  "sqlite3_vfs_lis
31870 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 76 66  t",           vf
31880 73 5f 6c 69 73 74 2c 20 20 20 20 20 30 20 20 20  s_list,     0   
31890 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
318a0 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
318b0 6f 6e 5f 76 32 22 2c 20 74 65 73 74 5f 63 72 65  on_v2", test_cre
318c0 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 2c  ate_function_v2,
318d0 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 70 61   0 },.     { "pa
318e0 74 68 5f 69 73 5f 6c 6f 63 61 6c 22 2c 20 20 20  th_is_local",   
318f0 20 20 20 20 20 20 20 20 20 20 20 70 61 74 68 5f             path_
31900 69 73 5f 6c 6f 63 61 6c 2c 20 20 30 20 20 20 7d  is_local,  0   }
31910 2c 0a 20 20 20 20 20 7b 20 22 70 61 74 68 5f 69  ,.     { "path_i
31920 73 5f 64 6f 73 22 2c 20 20 20 20 20 20 20 20 20  s_dos",         
31930 20 20 20 20 20 20 20 70 61 74 68 5f 69 73 5f 64         path_is_d
31940 6f 73 2c 20 20 30 20 20 20 7d 2c 0a 0a 20 20 20  os,  0   },..   
31950 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 66    /* Functions f
31960 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23 69 66 6e  rom os.h */.#ifn
31970 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
31980 55 54 46 31 36 0a 20 20 20 20 20 7b 20 22 61 64  UTF16.     { "ad
31990 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22 2c  d_test_collate",
319a0 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
319b0 6c 61 74 65 2c 20 30 20 20 20 20 20 20 20 20 20  late, 0         
319c0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
319d0 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e  d_test_collate_n
319e0 65 65 64 65 64 22 2c 20 74 65 73 74 5f 63 6f 6c  eeded", test_col
319f0 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20 30 20 20  late_needed, 0  
31a00 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
31a10 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22  d_test_function"
31a20 2c 20 20 20 20 20 20 20 74 65 73 74 5f 66 75 6e  ,       test_fun
31a30 63 74 69 6f 6e 2c 20 30 20 20 20 20 20 20 20 20  ction, 0        
31a40 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64     },.     { "ad
31a50 64 5f 74 65 73 74 5f 75 74 66 31 36 62 69 6e 5f  d_test_utf16bin_
31a60 63 6f 6c 6c 61 74 65 22 2c 20 20 20 20 74 65 73  collate",    tes
31a70 74 5f 75 74 66 31 36 62 69 6e 5f 63 6f 6c 6c 61  t_utf16bin_colla
31a80 74 65 2c 20 30 20 20 20 20 20 20 20 20 7d 2c 0a  te, 0        },.
31a90 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73  #endif.     { "s
31aa0 71 6c 69 74 65 33 5f 74 65 73 74 5f 65 72 72 73  qlite3_test_errs
31ab0 74 72 22 2c 20 20 20 20 20 74 65 73 74 5f 65 72  tr",     test_er
31ac0 72 73 74 72 2c 20 30 20 20 20 20 20 20 20 20 20  rstr, 0         
31ad0 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 74      },.     { "t
31ae0 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65  cl_variable_type
31af0 22 2c 20 20 20 20 20 20 20 74 63 6c 5f 76 61 72  ",       tcl_var
31b00 69 61 62 6c 65 5f 74 79 70 65 2c 20 30 20 20 20  iable_type, 0   
31b10 20 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53      },.#ifndef S
31b20 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 41 52 45  QLITE_OMIT_SHARE
31b30 44 5f 43 41 43 48 45 0a 20 20 20 20 20 7b 20 22  D_CACHE.     { "
31b40 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73  sqlite3_enable_s
31b50 68 61 72 65 64 5f 63 61 63 68 65 22 2c 20 74 65  hared_cache", te
31b60 73 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64  st_enable_shared
31b70 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22  , 0  },.     { "
31b80 73 71 6c 69 74 65 33 5f 73 68 61 72 65 64 5f 63  sqlite3_shared_c
31b90 61 63 68 65 5f 72 65 70 6f 72 74 22 2c 20 73 71  ache_report", sq
31ba0 6c 69 74 65 33 42 74 72 65 65 53 68 61 72 65 64  lite3BtreeShared
31bb0 43 61 63 68 65 52 65 70 6f 72 74 2c 20 30 7d 2c  CacheReport, 0},
31bc0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
31bd0 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
31be0 6f 6e 5f 6e 75 6d 62 65 72 22 2c 20 74 65 73 74  on_number", test
31bf0 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
31c00 65 72 2c 20 30 20 20 7d 2c 0a 23 69 66 64 65 66  er, 0  },.#ifdef
31c10 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
31c20 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
31c30 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
31c40 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
31c50 64 61 74 61 22 2c 20 74 65 73 74 5f 74 61 62 6c  data", test_tabl
31c60 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
31c70 61 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  a, 0  },.#endif.
31c80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
31c90 4d 49 54 5f 49 4e 43 52 42 4c 4f 42 0a 20 20 20  MIT_INCRBLOB.   
31ca0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f    { "sqlite3_blo
31cb0 62 5f 72 65 6f 70 65 6e 22 2c 20 74 65 73 74 5f  b_reopen", test_
31cc0 62 6c 6f 62 5f 72 65 6f 70 65 6e 2c 20 30 20 20  blob_reopen, 0  
31cd0 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
31ce0 20 22 70 63 61 63 68 65 5f 73 74 61 74 73 22 2c   "pcache_stats",
31cf0 20 20 20 20 20 20 20 74 65 73 74 5f 70 63 61 63         test_pcac
31d00 68 65 5f 73 74 61 74 73 2c 20 30 20 20 7d 2c 0a  he_stats, 0  },.
31d10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
31d20 41 42 4c 45 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49  ABLE_UNLOCK_NOTI
31d30 46 59 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  FY.     { "sqlit
31d40 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
31d50 22 2c 20 74 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e  ", test_unlock_n
31d60 6f 74 69 66 79 2c 20 30 20 20 7d 2c 0a 23 65 6e  otify, 0  },.#en
31d70 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  dif.     { "sqli
31d80 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
31d90 6e 74 22 2c 20 20 20 74 65 73 74 5f 77 61 6c 5f  nt",   test_wal_
31da0 63 68 65 63 6b 70 6f 69 6e 74 2c 20 30 20 20 7d  checkpoint, 0  }
31db0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
31dc0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
31dd0 5f 76 32 22 2c 74 65 73 74 5f 77 61 6c 5f 63 68  _v2",test_wal_ch
31de0 65 63 6b 70 6f 69 6e 74 5f 76 32 2c 20 30 20 20  eckpoint_v2, 0  
31df0 7d 2c 0a 20 20 20 20 20 7b 20 22 74 65 73 74 5f  },.     { "test_
31e00 73 71 6c 69 74 65 33 5f 6c 6f 67 22 2c 20 20 20  sqlite3_log",   
31e10 20 20 20 20 20 20 74 65 73 74 5f 73 71 6c 69 74        test_sqlit
31e20 65 33 5f 6c 6f 67 2c 20 30 20 20 7d 2c 0a 23 69  e3_log, 0  },.#i
31e30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
31e40 54 5f 45 58 50 4c 41 49 4e 0a 20 20 20 20 20 7b  T_EXPLAIN.     {
31e50 20 22 70 72 69 6e 74 5f 65 78 70 6c 61 69 6e 5f   "print_explain_
31e60 71 75 65 72 79 5f 70 6c 61 6e 22 2c 20 74 65 73  query_plan", tes
31e70 74 5f 70 72 69 6e 74 5f 65 71 70 2c 20 30 20 20  t_print_eqp, 0  
31e80 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
31e90 20 22 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63   "sqlite3_test_c
31ea0 6f 6e 74 72 6f 6c 22 2c 20 74 65 73 74 5f 74 65  ontrol", test_te
31eb0 73 74 5f 63 6f 6e 74 72 6f 6c 20 7d 2c 0a 23 69  st_control },.#i
31ec0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49 58  f SQLITE_OS_UNIX
31ed0 0a 20 20 20 20 20 7b 20 22 67 65 74 72 75 73 61  .     { "getrusa
31ee0 67 65 22 2c 20 74 65 73 74 5f 67 65 74 72 75 73  ge", test_getrus
31ef0 61 67 65 20 7d 2c 0a 23 65 6e 64 69 66 0a 20 20  age },.#endif.  
31f00 20 20 20 7b 20 22 6c 6f 61 64 5f 73 74 61 74 69     { "load_stati
31f10 63 5f 65 78 74 65 6e 73 69 6f 6e 22 2c 20 74 63  c_extension", tc
31f20 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65 6e  lLoadStaticExten
31f30 73 69 6f 6e 43 6d 64 20 7d 2c 0a 20 20 20 20 20  sionCmd },.     
31f40 7b 20 22 73 6f 72 74 65 72 5f 74 65 73 74 5f 66  { "sorter_test_f
31f50 61 6b 65 68 65 61 70 22 2c 20 73 6f 72 74 65 72  akeheap", sorter
31f60 5f 74 65 73 74 5f 66 61 6b 65 68 65 61 70 20 7d  _test_fakeheap }
31f70 2c 0a 20 20 20 20 20 7b 20 22 73 6f 72 74 65 72  ,.     { "sorter
31f80 5f 74 65 73 74 5f 73 6f 72 74 34 5f 68 65 6c 70  _test_sort4_help
31f90 65 72 22 2c 20 73 6f 72 74 65 72 5f 74 65 73 74  er", sorter_test
31fa0 5f 73 6f 72 74 34 5f 68 65 6c 70 65 72 20 7d 2c  _sort4_helper },
31fb0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 55  .#ifdef SQLITE_U
31fc0 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
31fd0 4f 4e 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  ON.     { "sqlit
31fe0 65 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69  e3_user_authenti
31ff0 63 61 74 65 22 2c 20 74 65 73 74 5f 75 73 65 72  cate", test_user
32000 5f 61 75 74 68 65 6e 74 69 63 61 74 65 2c 20 30  _authenticate, 0
32010 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
32020 74 65 33 5f 75 73 65 72 5f 61 64 64 22 2c 20 20  te3_user_add",  
32030 20 20 20 20 20 20 20 20 74 65 73 74 5f 75 73 65          test_use
32040 72 5f 61 64 64 2c 20 20 20 20 20 20 20 20 20 20  r_add,          
32050 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
32060 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65  ite3_user_change
32070 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 75 73  ",       test_us
32080 65 72 5f 63 68 61 6e 67 65 2c 20 20 20 20 20 20  er_change,      
32090 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71   0 },.     { "sq
320a0 6c 69 74 65 33 5f 75 73 65 72 5f 64 65 6c 65 74  lite3_user_delet
320b0 65 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f 75  e",       test_u
320c0 73 65 72 5f 64 65 6c 65 74 65 2c 20 20 20 20 20  ser_delete,     
320d0 20 20 30 20 7d 2c 0a 23 65 6e 64 69 66 0a 23 69    0 },.#endif.#i
320e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
320f0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
32100 55 53 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  US.     { "sqlit
32110 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
32120 75 73 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  us",       test_
32130 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 2c  stmt_scanstatus,
32140 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
32150 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
32160 6e 73 74 61 74 75 73 5f 72 65 73 65 74 22 2c 20  nstatus_reset", 
32170 74 65 73 74 5f 73 74 6d 74 5f 73 63 61 6e 73 74  test_stmt_scanst
32180 61 74 75 73 5f 72 65 73 65 74 2c 20 20 20 30 20  atus_reset,   0 
32190 7d 2c 0a 23 65 6e 64 69 66 0a 0a 20 20 7d 3b 0a  },.#endif..  };.
321a0 20 20 73 74 61 74 69 63 20 69 6e 74 20 62 69 74    static int bit
321b0 6d 61 73 6b 5f 73 69 7a 65 20 3d 20 73 69 7a 65  mask_size = size
321c0 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 3b 0a 20  of(Bitmask)*8;. 
321d0 20 69 6e 74 20 69 3b 0a 20 20 65 78 74 65 72 6e   int i;.  extern
321e0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73 79 6e   int sqlite3_syn
321f0 63 5f 63 6f 75 6e 74 2c 20 73 71 6c 69 74 65 33  c_count, sqlite3
32200 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b  _fullsync_count;
32210 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71  .  extern int sq
32220 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
32230 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
32240 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6b 65 5f  nt sqlite3_like_
32250 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
32260 69 6e 74 20 73 71 6c 69 74 65 33 5f 78 66 65 72  int sqlite3_xfer
32270 6f 70 74 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74  opt_count;.  ext
32280 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
32290 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75  pager_readdb_cou
322a0 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74  nt;.  extern int
322b0 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77   sqlite3_pager_w
322c0 72 69 74 65 64 62 5f 63 6f 75 6e 74 3b 0a 20 20  ritedb_count;.  
322d0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
322e0 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
322f0 63 6f 75 6e 74 3b 0a 23 69 66 20 53 51 4c 49 54  count;.#if SQLIT
32300 45 5f 4f 53 5f 57 49 4e 0a 20 20 65 78 74 65 72  E_OS_WIN.  exter
32310 6e 20 4c 4f 4e 47 20 76 6f 6c 61 74 69 6c 65 20  n LONG volatile 
32320 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70 65 3b  sqlite3_os_type;
32330 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
32340 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 65 78  QLITE_DEBUG.  ex
32350 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
32360 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20 65 78  WhereTrace;.  ex
32370 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
32380 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74 65 72  OSTrace;.  exter
32390 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c  n int sqlite3Wal
323a0 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
323b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
323c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
323d0 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 65 78 74  NABLE_FTS3.  ext
323e0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
323f0 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61 72 65  fts3_enable_pare
32400 6e 74 68 65 73 65 73 3b 0a 23 65 6e 64 69 66 0a  ntheses;.#endif.
32410 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28 69 3d  #endif..  for(i=
32420 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43 6d 64  0; i<sizeof(aCmd
32430 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b 30 5d  )/sizeof(aCmd[0]
32440 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ); i++){.    Tcl
32450 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28 69  _CreateCommand(i
32460 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d 2e 7a  nterp, aCmd[i].z
32470 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e 78 50  Name, aCmd[i].xP
32480 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  roc, 0, 0);.  }.
32490 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
324a0 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73 69 7a  eof(aObjCmd)/siz
324b0 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d 29 3b  eof(aObjCmd[0]);
324c0 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c 5f 43   i++){.    Tcl_C
324d0 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e 64 28  reateObjCommand(
324e0 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d 64 5b  interp, aObjCmd[
324f0 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20 20 20  i].zName, .     
32500 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e 78 50     aObjCmd[i].xP
32510 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e  roc, aObjCmd[i].
32520 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29 3b 0a  clientData, 0);.
32530 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61    }.  Tcl_LinkVa
32540 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
32550 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74 22 2c  e_search_count",
32560 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
32570 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68 5f 63  sqlite3_search_c
32580 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  ount, TCL_LINK_I
32590 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
325a0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
325b0 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74 22 2c  te_found_count",
325c0 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
325d0 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f 63 6f  sqlite3_found_co
325e0 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  unt, TCL_LINK_IN
325f0 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  T);.  Tcl_LinkVa
32600 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
32610 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c 20 0a  e_sort_count", .
32620 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
32630 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75 6e 74  lite3_sort_count
32640 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
32650 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
32660 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f  nterp, "sqlite3_
32670 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c 20 0a  max_blobsize", .
32680 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
32690 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62 73 69  lite3_max_blobsi
326a0 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  ze, TCL_LINK_INT
326b0 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
326c0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
326d0 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20 0a 20  _like_count", . 
326e0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
326f0 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e 74 2c  ite3_like_count,
32700 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
32710 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
32720 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 69 6e  terp, "sqlite_in
32730 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22 2c 20  terrupt_count", 
32740 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
32750 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
32760 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
32770 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
32780 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
32790 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  lite_open_file_c
327a0 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20 28 63  ount", .      (c
327b0 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 70  har*)&sqlite3_op
327c0 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c 20 54  en_file_count, T
327d0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
327e0 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
327f0 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75 72 72  rp, "sqlite_curr
32800 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20 20 20  ent_time", .    
32810 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
32820 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65 2c 20  3_current_time, 
32830 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
32840 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55 4e 49  if SQLITE_OS_UNI
32850 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f 5f 41  X && defined(__A
32860 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c 49 54  PPLE__) && SQLIT
32870 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
32880 5f 53 54 59 4c 45 0a 20 20 54 63 6c 5f 4c 69 6e  _STYLE.  Tcl_Lin
32890 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
328a0 6c 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75 6d 22  lite_hostid_num"
328b0 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
328c0 26 73 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f  &sqlite3_hostid_
328d0 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  num, TCL_LINK_IN
328e0 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c  T);.#endif.  Tcl
328f0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
32900 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70   "sqlite3_xferop
32910 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  t_count",.      
32920 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
32930 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c 20 54  xferopt_count, T
32940 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
32950 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
32960 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67  rp, "sqlite3_pag
32970 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 22  er_readdb_count"
32980 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
32990 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
329a0 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  addb_count, TCL_
329b0 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
329c0 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
329d0 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f   "sqlite3_pager_
329e0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22 2c 0a  writedb_count",.
329f0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
32a00 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
32a10 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c  edb_count, TCL_L
32a20 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f  INK_INT);.  Tcl_
32a30 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20  LinkVar(interp, 
32a40 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77  "sqlite3_pager_w
32a50 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a 20 20  ritej_count",.  
32a60 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
32a70 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a  te3_pager_writej
32a80 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
32a90 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53  _INT);.#ifndef S
32aa0 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
32ab0 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69  .  Tcl_LinkVar(i
32ac0 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67 6e 65  nterp, "unaligne
32ad0 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72  d_string_counter
32ae0 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
32af0 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e  &unaligned_strin
32b00 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c 5f 4c  g_counter, TCL_L
32b10 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66  INK_INT);.#endif
32b20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
32b30 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54 63 6c  OMIT_UTF16.  Tcl
32b40 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
32b50 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f 6e 65   "sqlite_last_ne
32b60 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e 22 2c  eded_collation",
32b70 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 70  .      (char*)&p
32b80 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e  zNeededCollation
32b90 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
32ba0 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f  G|TCL_LINK_READ_
32bb0 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ONLY);.#endif.#i
32bc0 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a  f SQLITE_OS_WIN.
32bd0 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
32be0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73  terp, "sqlite_os
32bf0 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20 28 63  _type",.      (c
32c00 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f 6f 73  har*)&sqlite3_os
32c10 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  _type, TCL_LINK_
32c20 4c 4f 4e 47 29 3b 0a 23 65 6e 64 69 66 0a 23 69  LONG);.#endif.#i
32c30 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
32c40 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63 20  .  {.    static 
32c50 63 6f 6e 73 74 20 63 68 61 72 20 2a 71 75 65 72  const char *quer
32c60 79 5f 70 6c 61 6e 20 3d 20 22 2a 2a 2a 20 4f 42  y_plan = "*** OB
32c70 53 4f 4c 45 54 45 20 56 41 52 49 41 42 4c 45 20  SOLETE VARIABLE 
32c80 2a 2a 2a 22 3b 0a 20 20 20 20 54 63 6c 5f 4c 69  ***";.    Tcl_Li
32c90 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
32ca0 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61 6e  qlite_query_plan
32cb0 22 2c 0a 20 20 20 20 20 20 20 28 63 68 61 72 2a  ",.       (char*
32cc0 29 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54 43  )&query_plan, TC
32cd0 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54 43  L_LINK_STRING|TC
32ce0 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59  L_LINK_READ_ONLY
32cf0 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  );.  }.#endif.#i
32d00 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
32d10 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  G.  Tcl_LinkVar(
32d20 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
32d30 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20 20  where_trace",.  
32d40 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
32d50 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20 54  te3WhereTrace, T
32d60 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
32d70 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
32d80 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f 74  rp, "sqlite_os_t
32d90 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
32da0 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54 72  ar*)&sqlite3OSTr
32db0 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
32dc0 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  T);.#ifndef SQLI
32dd0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54 63  TE_OMIT_WAL.  Tc
32de0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
32df0 2c 20 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74 72  , "sqlite_wal_tr
32e00 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  ace",.      (cha
32e10 72 2a 29 26 73 71 6c 69 74 65 33 57 61 6c 54 72  r*)&sqlite3WalTr
32e20 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e  ace, TCL_LINK_IN
32e30 54 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  T);.#endif.#endi
32e40 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
32e50 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20 54  _OMIT_DISKIO.  T
32e60 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
32e70 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e 74  p, "sqlite_opent
32e80 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  emp_count",.    
32e90 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
32ea0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
32eb0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
32ec0 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c 69  .#endif.  Tcl_Li
32ed0 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
32ee0 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69 6e  qlite_static_bin
32ef0 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20 20  d_value",.      
32f00 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f 73  (char*)&sqlite_s
32f10 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65  tatic_bind_value
32f20 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
32f30 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  G);.  Tcl_LinkVa
32f40 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
32f50 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62  e_static_bind_nb
32f60 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68 61  yte",.      (cha
32f70 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74 69  r*)&sqlite_stati
32f80 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54 43  c_bind_nbyte, TC
32f90 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
32fa0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
32fb0 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  p, "sqlite_temp_
32fc0 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20 20  directory",.    
32fd0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
32fe0 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79  3_temp_directory
32ff0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e  , TCL_LINK_STRIN
33000 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61  G);.  Tcl_LinkVa
33010 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74  r(interp, "sqlit
33020 65 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79  e_data_directory
33030 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
33040 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64 69  &sqlite3_data_di
33050 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49 4e  rectory, TCL_LIN
33060 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63 6c  K_STRING);.  Tcl
33070 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
33080 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22 2c   "bitmask_size",
33090 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 62  .      (char*)&b
330a0 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43 4c  itmask_size, TCL
330b0 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c 49  _LINK_INT|TCL_LI
330c0 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a 20  NK_READ_ONLY);. 
330d0 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
330e0 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 79 6e  erp, "sqlite_syn
330f0 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  c_count",.      
33100 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
33110 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f  sync_count, TCL_
33120 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c  LINK_INT);.  Tcl
33130 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c  _LinkVar(interp,
33140 20 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79 6e   "sqlite_fullsyn
33150 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20 20  c_count",.      
33160 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
33170 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c 20  fullsync_count, 
33180 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23  TCL_LINK_INT);.#
33190 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
331a0 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20 26  E_ENABLE_FTS3) &
331b0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
331c0 5f 54 45 53 54 29 0a 20 20 54 63 6c 5f 4c 69 6e  _TEST).  Tcl_Lin
331d0 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
331e0 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c 65  lite_fts3_enable
331f0 5f 70 61 72 65 6e 74 68 65 73 65 73 22 2c 0a 20  _parentheses",. 
33200 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
33210 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65  ite3_fts3_enable
33220 5f 70 61 72 65 6e 74 68 65 73 65 73 2c 20 54 43  _parentheses, TC
33230 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e  L_LINK_INT);.#en
33240 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
33250 5f 4f 4b 3b 0a 7d 0a                             _OK;.}.