/ Hex Artifact Content
Login

Artifact 8d96df19f045c629311751ed89c02c374d108e51:


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 65 78 74 65 72 6e  CL_OK;.}..extern
0b10: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c   const char *sql
0b20: 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 29  ite3ErrName(int)
0b30: 3b 0a 23 64 65 66 69 6e 65 20 74 31 45 72 72 6f  ;.#define t1Erro
0b40: 72 4e 61 6d 65 20 73 71 6c 69 74 65 33 45 72 72  rName sqlite3Err
0b50: 4e 61 6d 65 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76  Name../*.** Conv
0b60: 65 72 74 20 61 6e 20 73 71 6c 69 74 65 33 5f 73  ert an sqlite3_s
0b70: 74 6d 74 2a 20 69 6e 74 6f 20 61 6e 20 73 71 6c  tmt* into an sql
0b80: 69 74 65 33 2a 2e 20 20 54 68 69 73 20 64 65 70  ite3*.  This dep
0b90: 65 6e 64 73 20 6f 6e 20 74 68 65 0a 2a 2a 20 66  ends on the.** f
0ba0: 61 63 74 20 74 68 61 74 20 74 68 65 20 73 71 6c  act that the sql
0bb0: 69 74 65 33 2a 20 69 73 20 74 68 65 20 66 69 72  ite3* is the fir
0bc0: 73 74 20 66 69 65 6c 64 20 69 6e 20 74 68 65 20  st field in the 
0bd0: 56 64 62 65 20 73 74 72 75 63 74 75 72 65 2e 0a  Vdbe structure..
0be0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 74 6d 74 54  */.#define StmtT
0bf0: 6f 44 62 28 58 29 20 20 20 73 71 6c 69 74 65 33  oDb(X)   sqlite3
0c00: 5f 64 62 5f 68 61 6e 64 6c 65 28 58 29 0a 0a 2f  _db_handle(X)../
0c10: 2a 0a 2a 2a 20 43 68 65 63 6b 20 61 20 72 65 74  *.** Check a ret
0c20: 75 72 6e 20 76 61 6c 75 65 20 74 6f 20 6d 61 6b  urn value to mak
0c30: 65 20 73 75 72 65 20 69 74 20 61 67 72 65 65 73  e sure it agrees
0c40: 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74   with the result
0c50: 73 0a 2a 2a 20 66 72 6f 6d 20 73 71 6c 69 74 65  s.** from sqlite
0c60: 33 5f 65 72 72 63 6f 64 65 2e 0a 2a 2f 0a 69 6e  3_errcode..*/.in
0c70: 74 20 73 71 6c 69 74 65 33 54 65 73 74 45 72 72  t sqlite3TestErr
0c80: 43 6f 64 65 28 54 63 6c 5f 49 6e 74 65 72 70 20  Code(Tcl_Interp 
0c90: 2a 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  *interp, sqlite3
0ca0: 20 2a 64 62 2c 20 69 6e 74 20 72 63 29 7b 0a 20   *db, int rc){. 
0cb0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 68 72   if( sqlite3_thr
0cc0: 65 61 64 73 61 66 65 28 29 3d 3d 30 20 26 26 20  eadsafe()==0 && 
0cd0: 72 63 21 3d 53 51 4c 49 54 45 5f 4d 49 53 55 53  rc!=SQLITE_MISUS
0ce0: 45 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  E && rc!=SQLITE_
0cf0: 4f 4b 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  OK.   && sqlite3
0d00: 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 72 63  _errcode(db)!=rc
0d10: 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
0d20: 66 5b 32 30 30 5d 3b 0a 20 20 20 20 69 6e 74 20  f[200];.    int 
0d30: 72 32 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  r2 = sqlite3_err
0d40: 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 73 70  code(db);.    sp
0d50: 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 65 72 72  rintf(zBuf, "err
0d60: 6f 72 20 63 6f 64 65 20 25 73 20 28 25 64 29 20  or code %s (%d) 
0d70: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 73  does not match s
0d80: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 20 25  qlite3_errcode %
0d90: 73 20 28 25 64 29 22 2c 0a 20 20 20 20 20 20 20  s (%d)",.       
0da0: 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c  t1ErrorName(rc),
0db0: 20 72 63 2c 20 74 31 45 72 72 6f 72 4e 61 6d 65   rc, t1ErrorName
0dc0: 28 72 32 29 2c 20 72 32 29 3b 0a 20 20 20 20 54  (r2), r2);.    T
0dd0: 63 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69  cl_ResetResult(i
0de0: 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f  nterp);.    Tcl_
0df0: 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
0e00: 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20  erp, zBuf, 0);. 
0e10: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
0e20: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
0e30: 2f 2a 0a 2a 2a 20 44 65 63 6f 64 65 20 61 20 70  /*.** Decode a p
0e40: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 73 71 6c  ointer to an sql
0e50: 69 74 65 33 5f 73 74 6d 74 20 6f 62 6a 65 63 74  ite3_stmt object
0e60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0e70: 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 0a  getStmtPointer(.
0e80: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
0e90: 74 65 72 70 2c 20 0a 20 20 63 6f 6e 73 74 20 63  terp, .  const c
0ea0: 68 61 72 20 2a 7a 41 72 67 2c 20 20 0a 20 20 73  har *zArg,  .  s
0eb0: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
0ec0: 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d  Stmt.){.  *ppStm
0ed0: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 73 74 6d  t = (sqlite3_stm
0ee0: 74 2a 29 73 71 6c 69 74 65 33 54 65 73 74 54 65  t*)sqlite3TestTe
0ef0: 78 74 54 6f 50 74 72 28 7a 41 72 67 29 3b 0a 20  xtToPtr(zArg);. 
0f00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
0f10: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
0f20: 65 20 61 20 74 65 78 74 20 72 65 70 72 65 73 65  e a text represe
0f30: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 70 6f 69  ntation of a poi
0f40: 6e 74 65 72 20 74 68 61 74 20 63 61 6e 20 62 65  nter that can be
0f50: 20 75 6e 64 65 72 73 74 6f 6f 64 0a 2a 2a 20 62   understood.** b
0f60: 79 20 74 68 65 20 67 65 74 44 62 50 6f 69 6e 74  y the getDbPoint
0f70: 65 72 20 61 6e 64 20 67 65 74 56 6d 50 6f 69 6e  er and getVmPoin
0f80: 74 65 72 20 72 6f 75 74 69 6e 65 73 20 61 62 6f  ter routines abo
0f90: 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 72  ve..**.** The pr
0fa0: 6f 62 6c 65 6d 20 69 73 2c 20 6f 6e 20 73 6f 6d  oblem is, on som
0fb0: 65 20 6d 61 63 68 69 6e 65 73 20 28 53 6f 6c 61  e machines (Sola
0fc0: 72 69 73 29 20 69 66 20 79 6f 75 20 64 6f 20 61  ris) if you do a
0fd0: 20 70 72 69 6e 74 66 20 77 69 74 68 0a 2a 2a 20   printf with.** 
0fe0: 22 25 70 22 20 79 6f 75 20 63 61 6e 6e 6f 74 20  "%p" you cannot 
0ff0: 74 75 72 6e 20 61 72 6f 75 6e 64 20 61 6e 64 20  turn around and 
1000: 64 6f 20 61 20 73 63 61 6e 66 20 77 69 74 68 20  do a scanf with 
1010: 74 68 65 20 73 61 6d 65 20 22 25 70 22 20 61 6e  the same "%p" an
1020: 64 0a 2a 2a 20 67 65 74 20 79 6f 75 72 20 70 6f  d.** get your po
1030: 69 6e 74 65 72 20 62 61 63 6b 2e 20 20 59 6f 75  inter back.  You
1040: 20 68 61 76 65 20 74 6f 20 70 72 65 70 65 6e 64   have to prepend
1050: 20 61 20 22 30 78 22 20 62 65 66 6f 72 65 20 69   a "0x" before i
1060: 74 20 77 69 6c 6c 0a 2a 2a 20 77 6f 72 6b 2e 20  t will.** work. 
1070: 20 4f 72 20 61 74 20 6c 65 61 73 74 20 74 68 61   Or at least tha
1080: 74 20 69 73 20 77 68 61 74 20 69 73 20 72 65 70  t is what is rep
1090: 6f 72 74 65 64 20 74 6f 20 6d 65 20 28 64 72 68  orted to me (drh
10a0: 29 2e 20 20 42 75 74 20 74 68 69 73 0a 2a 2a 20  ).  But this.** 
10b0: 62 65 68 61 76 69 6f 72 20 76 61 72 69 65 73 20  behavior varies 
10c0: 66 72 6f 6d 20 6d 61 63 68 69 6e 65 20 74 6f 20  from machine to 
10d0: 6d 61 63 68 69 6e 65 2e 20 20 54 68 65 20 73 6f  machine.  The so
10e0: 6c 75 74 69 6f 6e 20 75 73 65 64 20 68 65 72 20  lution used her 
10f0: 69 73 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68  is.** to test th
1100: 65 20 73 74 72 69 6e 67 20 72 69 67 68 74 20 61  e string right a
1110: 66 74 65 72 20 69 74 20 69 73 20 67 65 6e 65 72  fter it is gener
1120: 61 74 65 64 20 74 6f 20 73 65 65 20 69 66 20 69  ated to see if i
1130: 74 20 63 61 6e 20 62 65 0a 2a 2a 20 75 6e 64 65  t can be.** unde
1140: 72 73 74 6f 6f 64 20 62 79 20 73 63 61 6e 66 2c  rstood by scanf,
1150: 20 61 6e 64 20 69 66 20 6e 6f 74 2c 20 74 72 79   and if not, try
1160: 20 70 72 65 70 65 6e 64 69 6e 67 20 61 6e 20 22   prepending an "
1170: 30 78 22 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a  0x" to see if.**
1180: 20 74 68 61 74 20 68 65 6c 70 73 2e 20 20 49 66   that helps.  If
1190: 20 6e 6f 74 68 69 6e 67 20 77 6f 72 6b 73 2c 20   nothing works, 
11a0: 61 20 66 61 74 61 6c 20 65 72 72 6f 72 20 69 73  a fatal error is
11b0: 20 67 65 6e 65 72 61 74 65 64 2e 0a 2a 2f 0a 69   generated..*/.i
11c0: 6e 74 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61  nt sqlite3TestMa
11d0: 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 54 63 6c  kePointerStr(Tcl
11e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
11f0: 20 63 68 61 72 20 2a 7a 50 74 72 2c 20 76 6f 69   char *zPtr, voi
1200: 64 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  d *p){.  sqlite3
1210: 5f 73 6e 70 72 69 6e 74 66 28 31 30 30 2c 20 7a  _snprintf(100, z
1220: 50 74 72 2c 20 22 25 70 22 2c 20 70 29 3b 0a 20  Ptr, "%p", p);. 
1230: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1240: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 63 61 6c  }../*.** The cal
1250: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 6f  lback routine fo
1260: 72 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70  r sqlite3_exec_p
1270: 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 73 74 61 74  rintf()..*/.stat
1280: 69 63 20 69 6e 74 20 65 78 65 63 5f 70 72 69 6e  ic int exec_prin
1290: 74 66 5f 63 62 28 76 6f 69 64 20 2a 70 41 72 67  tf_cb(void *pArg
12a0: 2c 20 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72  , int argc, char
12b0: 20 2a 2a 61 72 67 76 2c 20 63 68 61 72 20 2a 2a   **argv, char **
12c0: 6e 61 6d 65 29 7b 0a 20 20 54 63 6c 5f 44 53 74  name){.  Tcl_DSt
12d0: 72 69 6e 67 20 2a 73 74 72 20 3d 20 28 54 63 6c  ring *str = (Tcl
12e0: 5f 44 53 74 72 69 6e 67 2a 29 70 41 72 67 3b 0a  _DString*)pArg;.
12f0: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20    int i;..  if( 
1300: 54 63 6c 5f 44 53 74 72 69 6e 67 4c 65 6e 67 74  Tcl_DStringLengt
1310: 68 28 73 74 72 29 3d 3d 30 20 29 7b 0a 20 20 20  h(str)==0 ){.   
1320: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 61 72 67 63   for(i=0; i<argc
1330: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 54 63  ; i++){.      Tc
1340: 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e 64 45  l_DStringAppendE
1350: 6c 65 6d 65 6e 74 28 73 74 72 2c 20 6e 61 6d 65  lement(str, name
1360: 5b 69 5d 20 3f 20 6e 61 6d 65 5b 69 5d 20 3a 20  [i] ? name[i] : 
1370: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20  "NULL");.    }. 
1380: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
1390: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
13a0: 54 63 6c 5f 44 53 74 72 69 6e 67 41 70 70 65 6e  Tcl_DStringAppen
13b0: 64 45 6c 65 6d 65 6e 74 28 73 74 72 2c 20 61 72  dElement(str, ar
13c0: 67 76 5b 69 5d 20 3f 20 61 72 67 76 5b 69 5d 20  gv[i] ? argv[i] 
13d0: 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 7d 0a 20  : "NULL");.  }. 
13e0: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
13f0: 0a 2a 2a 20 54 68 65 20 49 2f 4f 20 74 72 61 63  .** The I/O trac
1400: 69 6e 67 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2f  ing callback..*/
1410: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1420: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29  LITE_OMIT_TRACE)
1430: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
1440: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
1450: 45 29 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a  E).static FILE *
1460: 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 30  iotrace_file = 0
1470: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6f  ;.static void io
1480: 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28  _trace_callback(
1490: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
14a0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
14b0: 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
14c0: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29  art(ap, zFormat)
14d0: 3b 0a 20 20 76 66 70 72 69 6e 74 66 28 69 6f 74  ;.  vfprintf(iot
14e0: 72 61 63 65 5f 66 69 6c 65 2c 20 7a 46 6f 72 6d  race_file, zForm
14f0: 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e  at, ap);.  va_en
1500: 64 28 61 70 29 3b 0a 20 20 66 66 6c 75 73 68 28  d(ap);.  fflush(
1510: 69 6f 74 72 61 63 65 5f 66 69 6c 65 29 3b 0a 7d  iotrace_file);.}
1520: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
1530: 73 61 67 65 3a 20 20 69 6f 5f 74 72 61 63 65 20  sage:  io_trace 
1540: 46 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 54  FILENAME.**.** T
1550: 75 72 6e 20 49 2f 4f 20 74 72 61 63 69 6e 67 20  urn I/O tracing 
1560: 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 49 66 20 46  on or off.  If F
1570: 49 4c 45 4e 41 4d 45 20 69 73 20 6e 6f 74 20 61  ILENAME is not a
1580: 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2c 0a  n empty string,.
1590: 2a 2a 20 49 2f 4f 20 74 72 61 63 69 6e 67 20 62  ** I/O tracing b
15a0: 65 67 69 6e 73 20 67 6f 69 6e 67 20 69 6e 74 6f  egins going into
15b0: 20 46 49 4c 45 4e 41 4d 45 2e 20 49 66 20 46 49   FILENAME. If FI
15c0: 4c 45 4e 41 4d 45 20 69 73 20 61 6e 20 65 6d 70  LENAME is an emp
15d0: 74 79 0a 2a 2a 20 73 74 72 69 6e 67 2c 20 49 2f  ty.** string, I/
15e0: 4f 20 74 72 61 63 69 6e 67 20 69 73 20 74 75 72  O tracing is tur
15f0: 6e 65 64 20 6f 66 66 2e 0a 2a 2f 0a 73 74 61 74  ned off..*/.stat
1600: 69 63 20 69 6e 74 20 74 65 73 74 5f 69 6f 5f 74  ic int test_io_t
1610: 72 61 63 65 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  race(.  void *No
1620: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
1630: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
1640: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
1650: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
1660: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
1670: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1690: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
16a0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
16b0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
16c0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
16d0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 23  argument */.){.#
16e0: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
16f0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
1700: 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
1710: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 29  _ENABLE_IOTRACE)
1720: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
1730: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1740: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1750: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1760: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
1770: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  v[0],.          
1780: 22 20 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30  " FILENAME\"", 0
1790: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
17a0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
17b0: 66 28 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20  f( iotrace_file 
17c0: 29 7b 0a 20 20 20 20 69 66 28 20 69 6f 74 72 61  ){.    if( iotra
17d0: 63 65 5f 66 69 6c 65 21 3d 73 74 64 6f 75 74 20  ce_file!=stdout 
17e0: 26 26 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 21  && iotrace_file!
17f0: 3d 73 74 64 65 72 72 20 29 7b 0a 20 20 20 20 20  =stderr ){.     
1800: 20 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 5f   fclose(iotrace_
1810: 66 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  file);.    }.   
1820: 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20   iotrace_file = 
1830: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 49 6f  0;.    sqlite3Io
1840: 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Trace = 0;.  }. 
1850: 20 69 66 28 20 61 72 67 76 5b 31 5d 5b 30 5d 20   if( argv[1][0] 
1860: 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  ){.    if( strcm
1870: 70 28 61 72 67 76 5b 31 5d 2c 22 73 74 64 6f 75  p(argv[1],"stdou
1880: 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
1890: 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d 20 73  iotrace_file = s
18a0: 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65  tdout;.    }else
18b0: 20 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76   if( strcmp(argv
18c0: 5b 31 5d 2c 22 73 74 64 65 72 72 22 29 3d 3d 30  [1],"stderr")==0
18d0: 20 29 7b 0a 20 20 20 20 20 20 69 6f 74 72 61 63   ){.      iotrac
18e0: 65 5f 66 69 6c 65 20 3d 20 73 74 64 65 72 72 3b  e_file = stderr;
18f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1900: 20 20 69 6f 74 72 61 63 65 5f 66 69 6c 65 20 3d    iotrace_file =
1910: 20 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 20   fopen(argv[1], 
1920: 22 77 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  "w");.    }.    
1930: 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
1940: 20 69 6f 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61   io_trace_callba
1950: 63 6b 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ck;.  }.#endif. 
1960: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1970: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  }.../*.** Usage:
1980: 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 5f 70    sqlite3_exec_p
1990: 72 69 6e 74 66 20 20 44 42 20 20 46 4f 52 4d 41  rintf  DB  FORMA
19a0: 54 20 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20  T  STRING.**.** 
19b0: 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74  Invoke the sqlit
19c0: 65 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 29  e3_exec_printf()
19d0: 20 69 6e 74 65 72 66 61 63 65 20 75 73 69 6e 67   interface using
19e0: 20 74 68 65 20 6f 70 65 6e 20 64 61 74 61 62 61   the open databa
19f0: 73 65 0a 2a 2a 20 44 42 2e 20 20 54 68 65 20 53  se.** DB.  The S
1a00: 51 4c 20 69 73 20 74 68 65 20 73 74 72 69 6e 67  QL is the string
1a10: 20 46 4f 52 4d 41 54 2e 20 20 54 68 65 20 66 6f   FORMAT.  The fo
1a20: 72 6d 61 74 20 73 74 72 69 6e 67 20 73 68 6f 75  rmat string shou
1a30: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 6f 6e  ld contain.** on
1a40: 65 20 25 73 20 6f 72 20 25 71 2e 20 20 53 54 52  e %s or %q.  STR
1a50: 49 4e 47 20 69 73 20 74 68 65 20 76 61 6c 75 65  ING is the value
1a60: 20 69 6e 73 65 72 74 65 64 20 69 6e 74 6f 20 25   inserted into %
1a70: 73 20 6f 72 20 25 71 2e 0a 2a 2f 0a 73 74 61 74  s or %q..*/.stat
1a80: 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63  ic int test_exec
1a90: 5f 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20  _printf(.  void 
1aa0: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
1ab0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
1ac0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
1ad0: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
1ae0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
1af0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
1b00: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
1b10: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
1b20: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
1b30: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
1b40: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
1b50: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
1b60: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1b70: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
1b80: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
1b90: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
1ba0: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1bb0: 63 68 61 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20  char zBuf[30];. 
1bc0: 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a   if( argc!=4 ){.
1bd0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1be0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1bf0: 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1c00: 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1c10: 30 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42  0], .       " DB
1c20: 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47 22 2c   FORMAT STRING",
1c30: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1c40: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1c50: 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1c60: 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1c70: 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1c80: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
1c90: 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28 26 73  l_DStringInit(&s
1ca0: 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71  tr);.  zSql = sq
1cb0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72  lite3_mprintf(ar
1cc0: 67 76 5b 32 5d 2c 20 61 72 67 76 5b 33 5d 29 3b  gv[2], argv[3]);
1cd0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
1ce0: 65 78 65 63 28 64 62 2c 20 7a 53 71 6c 2c 20 65  exec(db, zSql, e
1cf0: 78 65 63 5f 70 72 69 6e 74 66 5f 63 62 2c 20 26  xec_printf_cb, &
1d00: 73 74 72 2c 20 26 7a 45 72 72 29 3b 0a 20 20 73  str, &zErr);.  s
1d10: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1d20: 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42 75  );.  sprintf(zBu
1d30: 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20 20  f, "%d", rc);.  
1d40: 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e  Tcl_AppendElemen
1d50: 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b  t(interp, zBuf);
1d60: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65  .  Tcl_AppendEle
1d70: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63 3d  ment(interp, rc=
1d80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63 6c  =SQLITE_OK ? Tcl
1d90: 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26 73  _DStringValue(&s
1da0: 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20 54  tr) : zErr);.  T
1db0: 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28 26  cl_DStringFree(&
1dc0: 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  str);.  if( zErr
1dd0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
1de0: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c  zErr);.  if( sql
1df0: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
1e00: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
1e10: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1e20: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
1e30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e40: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65 78  age:  sqlite3_ex
1e50: 65 63 5f 68 65 78 20 20 44 42 20 20 48 45 58 0a  ec_hex  DB  HEX.
1e60: 2a 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  **.** Invoke the
1e70: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
1e80: 6f 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  on a string that
1e90: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 62 79 20   is obtained by 
1ea0: 74 72 61 6e 73 6c 61 74 69 6e 67 0a 2a 2a 20 48  translating.** H
1eb0: 45 58 20 69 6e 74 6f 20 41 53 43 49 49 2e 20 20  EX into ASCII.  
1ec0: 4d 6f 73 74 20 63 68 61 72 61 63 74 65 72 73 20  Most characters 
1ed0: 61 72 65 20 74 72 61 6e 73 6c 61 74 65 64 20 61  are translated a
1ee0: 73 20 69 73 2e 20 20 25 48 48 20 62 65 63 6f 6d  s is.  %HH becom
1ef0: 65 73 0a 2a 2a 20 61 20 68 65 78 20 63 68 61 72  es.** a hex char
1f00: 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  acter..*/.static
1f10: 20 69 6e 74 20 74 65 73 74 5f 65 78 65 63 5f 68   int test_exec_h
1f20: 65 78 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  ex(.  void *NotU
1f30: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
1f40: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
1f50: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
1f60: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
1f70: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
1f80: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
1f90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1fa0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
1fb0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
1fc0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
1fd0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
1fe0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73  gument */.){.  s
1ff0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 54 63  qlite3 *db;.  Tc
2000: 6c 5f 44 53 74 72 69 6e 67 20 73 74 72 3b 0a 20  l_DString str;. 
2010: 20 69 6e 74 20 72 63 2c 20 69 2c 20 6a 3b 0a 20   int rc, i, j;. 
2020: 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b   char *zErr = 0;
2030: 0a 20 20 63 68 61 72 20 2a 7a 48 65 78 3b 0a 20  .  char *zHex;. 
2040: 20 63 68 61 72 20 7a 53 71 6c 5b 35 30 30 5d 3b   char zSql[500];
2050: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 33 30 5d  .  char zBuf[30]
2060: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20  ;.  if( argc!=3 
2070: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
2080: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
2090: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
20a0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
20b0: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
20c0: 20 44 42 20 48 45 58 22 2c 20 30 29 3b 0a 20 20   DB HEX", 0);.  
20d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
20e0: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
20f0: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
2100: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
2110: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2120: 52 4f 52 3b 0a 20 20 7a 48 65 78 20 3d 20 61 72  ROR;.  zHex = ar
2130: 67 76 5b 32 5d 3b 0a 20 20 66 6f 72 28 69 3d 6a  gv[2];.  for(i=j
2140: 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 7a 53 71  =0; i<sizeof(zSq
2150: 6c 29 20 26 26 20 7a 48 65 78 5b 6a 5d 3b 20 69  l) && zHex[j]; i
2160: 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66  ++, j++){.    if
2170: 28 20 7a 48 65 78 5b 6a 5d 3d 3d 27 25 27 20 26  ( zHex[j]=='%' &
2180: 26 20 7a 48 65 78 5b 6a 2b 32 5d 20 26 26 20 7a  & zHex[j+2] && z
2190: 48 65 78 5b 6a 2b 32 5d 20 29 7b 0a 20 20 20 20  Hex[j+2] ){.    
21a0: 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 28 74 65 73    zSql[i] = (tes
21b0: 74 48 65 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a  tHexToInt(zHex[j
21c0: 2b 31 5d 29 3c 3c 34 29 20 2b 20 74 65 73 74 48  +1])<<4) + testH
21d0: 65 78 54 6f 49 6e 74 28 7a 48 65 78 5b 6a 2b 32  exToInt(zHex[j+2
21e0: 5d 29 3b 0a 20 20 20 20 20 20 6a 20 2b 3d 20 32  ]);.      j += 2
21f0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2200: 20 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 7a 48 65     zSql[i] = zHe
2210: 78 5b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  x[j];.    }.  }.
2220: 20 20 7a 53 71 6c 5b 69 5d 20 3d 20 30 3b 0a 20    zSql[i] = 0;. 
2230: 20 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74   Tcl_DStringInit
2240: 28 26 73 74 72 29 3b 0a 20 20 72 63 20 3d 20 73  (&str);.  rc = s
2250: 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
2260: 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e 74  zSql, exec_print
2270: 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45 72  f_cb, &str, &zEr
2280: 72 29 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a 42  r);.  sprintf(zB
2290: 75 66 2c 20 22 25 64 22 2c 20 72 63 29 3b 0a 20  uf, "%d", rc);. 
22a0: 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65   Tcl_AppendEleme
22b0: 6e 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 29  nt(interp, zBuf)
22c0: 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c  ;.  Tcl_AppendEl
22d0: 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 72 63  ement(interp, rc
22e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 54 63  ==SQLITE_OK ? Tc
22f0: 6c 5f 44 53 74 72 69 6e 67 56 61 6c 75 65 28 26  l_DStringValue(&
2300: 73 74 72 29 20 3a 20 7a 45 72 72 29 3b 0a 20 20  str) : zErr);.  
2310: 54 63 6c 5f 44 53 74 72 69 6e 67 46 72 65 65 28  Tcl_DStringFree(
2320: 26 73 74 72 29 3b 0a 20 20 69 66 28 20 7a 45 72  &str);.  if( zEr
2330: 72 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65  r ) sqlite3_free
2340: 28 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71  (zErr);.  if( sq
2350: 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
2360: 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
2370: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2380: 52 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ROR;.  return TC
2390: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
23a0: 73 61 67 65 3a 20 20 64 62 5f 65 6e 74 65 72 20  sage:  db_enter 
23b0: 44 42 0a 2a 2a 20 20 20 20 20 20 20 20 20 64 62  DB.**         db
23c0: 5f 6c 65 61 76 65 20 44 42 0a 2a 2a 0a 2a 2a 20  _leave DB.**.** 
23d0: 45 6e 74 65 72 20 6f 72 20 6c 65 61 76 65 20 74  Enter or leave t
23e0: 68 65 20 6d 75 74 65 78 20 6f 6e 20 61 20 64 61  he mutex on a da
23f0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2400: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
2410: 20 64 62 5f 65 6e 74 65 72 28 0a 20 20 76 6f 69   db_enter(.  voi
2420: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
2430: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
2440: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
2450: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
2460: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
2470: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
2480: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
2490: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
24a0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
24b0: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
24c0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
24d0: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
24e0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
24f0: 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32  b;.  if( argc!=2
2500: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2510: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2520: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2530: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2540: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2550: 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72  " DB", 0);.    r
2560: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
2570: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
2580: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
2590: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
25a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
25b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
25c0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
25d0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  x);.  return TCL
25e0: 5f 4f 4b 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  _OK;.}.static in
25f0: 74 20 64 62 5f 6c 65 61 76 65 28 0a 20 20 76 6f  t db_leave(.  vo
2600: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
2610: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
2620: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
2630: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
2640: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
2650: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
2660: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
2670: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2680: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
2690: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
26a0: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
26b0: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
26c0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
26d0: 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d  db;.  if( argc!=
26e0: 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
26f0: 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
2700: 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
2710: 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
2720: 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20  argv[0], .      
2730: 20 22 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20   " DB", 0);.    
2740: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2750: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
2760: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
2770: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
2780: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
2790: 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  R;.  sqlite3_mut
27a0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
27b0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  ex);.  return TC
27c0: 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
27d0: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 65  sage:  sqlite3_e
27e0: 78 65 63 20 20 44 42 20 20 53 51 4c 0a 2a 2a 0a  xec  DB  SQL.**.
27f0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2800: 6c 69 74 65 33 5f 65 78 65 63 20 69 6e 74 65 72  lite3_exec inter
2810: 66 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f  face using the o
2820: 70 65 6e 20 64 61 74 61 62 61 73 65 20 44 42 0a  pen database DB.
2830: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
2840: 73 74 5f 65 78 65 63 28 0a 20 20 76 6f 69 64 20  st_exec(.  void 
2850: 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f  *NotUsed,.  Tcl_
2860: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
2870: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
2880: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
2890: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
28a0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67  and */.  int arg
28b0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
28c0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
28d0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
28e0: 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20   **argv         
28f0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
2900: 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29  ch argument */.)
2910: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
2920: 0a 20 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73  .  Tcl_DString s
2930: 74 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  tr;.  int rc;.  
2940: 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
2950: 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2960: 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72  int i, j;.  char
2970: 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 69 66 28   zBuf[30];.  if(
2980: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
2990: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
29a0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
29b0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
29c0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20  e \"", argv[0], 
29d0: 0a 20 20 20 20 20 20 20 22 20 44 42 20 53 51 4c  .       " DB SQL
29e0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
29f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a00: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
2a10: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
2a20: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
2a30: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a40: 54 63 6c 5f 44 53 74 72 69 6e 67 49 6e 69 74 28  Tcl_DStringInit(
2a50: 26 73 74 72 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  &str);.  zSql = 
2a60: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
2a70: 22 25 73 22 2c 20 61 72 67 76 5b 32 5d 29 3b 0a  "%s", argv[2]);.
2a80: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 7a 53 71    for(i=j=0; zSq
2a90: 6c 5b 69 5d 3b 29 7b 0a 20 20 20 20 69 66 28 20  l[i];){.    if( 
2aa0: 7a 53 71 6c 5b 69 5d 3d 3d 27 25 27 20 29 7b 0a  zSql[i]=='%' ){.
2ab0: 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20        zSql[j++] 
2ac0: 3d 20 28 74 65 73 74 48 65 78 54 6f 49 6e 74 28  = (testHexToInt(
2ad0: 7a 53 71 6c 5b 69 2b 31 5d 29 3c 3c 34 29 20 2b  zSql[i+1])<<4) +
2ae0: 20 74 65 73 74 48 65 78 54 6f 49 6e 74 28 7a 53   testHexToInt(zS
2af0: 71 6c 5b 69 2b 32 5d 29 3b 0a 20 20 20 20 20 20  ql[i+2]);.      
2b00: 69 20 2b 3d 20 33 3b 0a 20 20 20 20 7d 65 6c 73  i += 3;.    }els
2b10: 65 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  e{.      zSql[j+
2b20: 2b 5d 20 3d 20 7a 53 71 6c 5b 69 2b 2b 5d 3b 0a  +] = zSql[i++];.
2b30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 7a 53 71 6c      }.  }.  zSql
2b40: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20  [j] = 0;.  rc = 
2b50: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c  sqlite3_exec(db,
2b60: 20 7a 53 71 6c 2c 20 65 78 65 63 5f 70 72 69 6e   zSql, exec_prin
2b70: 74 66 5f 63 62 2c 20 26 73 74 72 2c 20 26 7a 45  tf_cb, &str, &zE
2b80: 72 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  rr);.  sqlite3_f
2b90: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 73 70 72  ree(zSql);.  spr
2ba0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
2bb0: 20 72 63 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65   rc);.  Tcl_Appe
2bc0: 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
2bd0: 2c 20 7a 42 75 66 29 3b 0a 20 20 54 63 6c 5f 41  , zBuf);.  Tcl_A
2be0: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
2bf0: 65 72 70 2c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  erp, rc==SQLITE_
2c00: 4f 4b 20 3f 20 54 63 6c 5f 44 53 74 72 69 6e 67  OK ? Tcl_DString
2c10: 56 61 6c 75 65 28 26 73 74 72 29 20 3a 20 7a 45  Value(&str) : zE
2c20: 72 72 29 3b 0a 20 20 54 63 6c 5f 44 53 74 72 69  rr);.  Tcl_DStri
2c30: 6e 67 46 72 65 65 28 26 73 74 72 29 3b 0a 20 20  ngFree(&str);.  
2c40: 69 66 28 20 7a 45 72 72 20 29 20 73 71 6c 69 74  if( zErr ) sqlit
2c50: 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20  e3_free(zErr);. 
2c60: 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
2c70: 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
2c80: 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
2c90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
2ca0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
2cb0: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
2cc0: 6c 69 74 65 33 5f 65 78 65 63 5f 6e 72 20 20 44  lite3_exec_nr  D
2cd0: 42 20 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 49 6e 76  B  SQL.**.** Inv
2ce0: 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 5f  oke the sqlite3_
2cf0: 65 78 65 63 20 69 6e 74 65 72 66 61 63 65 20 75  exec interface u
2d00: 73 69 6e 67 20 74 68 65 20 6f 70 65 6e 20 64 61  sing the open da
2d10: 74 61 62 61 73 65 20 44 42 2e 20 20 44 69 73 63  tabase DB.  Disc
2d20: 61 72 64 0a 2a 2a 20 61 6c 6c 20 72 65 73 75 6c  ard.** all resul
2d30: 74 73 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  ts.*/.static int
2d40: 20 74 65 73 74 5f 65 78 65 63 5f 6e 72 28 0a 20   test_exec_nr(. 
2d50: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
2d60: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
2d70: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
2d80: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
2d90: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
2da0: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
2db0: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
2dc0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2dd0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
2de0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
2df0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
2e00: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
2e10: 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  t */.){.  sqlite
2e20: 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
2e30: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
2e40: 30 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  0;.  if( argc!=3
2e50: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2e60: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2e70: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
2e80: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
2e90: 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
2ea0: 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a 20  " DB SQL", 0);. 
2eb0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2ec0: 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2ed0: 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2ee0: 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
2ef0: 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2f00: 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
2f10: 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61 72  ite3_exec(db, ar
2f20: 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 26 7a 45  gv[2], 0, 0, &zE
2f30: 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  rr);.  if( sqlit
2f40: 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e  e3TestErrCode(in
2f50: 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20  terp, db, rc) ) 
2f60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
2f70: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2f80: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
2f90: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e:  sqlite3_mpri
2fa0: 6e 74 66 5f 7a 5f 74 65 73 74 20 20 53 45 50 41  ntf_z_test  SEPA
2fb0: 52 41 54 4f 52 20 20 41 52 47 30 20 20 41 52 47  RATOR  ARG0  ARG
2fc0: 31 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74  1 ....**.** Test
2fd0: 20 74 68 65 20 25 7a 20 66 6f 72 6d 61 74 20 6f   the %z format o
2fe0: 66 20 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74 66  f sqlite_mprintf
2ff0: 28 29 2e 20 20 55 73 65 20 6d 75 6c 74 69 70 6c  ().  Use multipl
3000: 65 20 6d 70 72 69 6e 74 66 28 29 20 63 61 6c 6c  e mprintf() call
3010: 73 20 74 6f 20 0a 2a 2a 20 63 6f 6e 63 61 74 65  s to .** concate
3020: 6e 61 74 65 20 61 72 67 30 20 74 68 72 6f 75 67  nate arg0 throug
3030: 68 20 61 72 67 6e 20 75 73 69 6e 67 20 73 65 70  h argn using sep
3040: 61 72 61 74 6f 72 20 61 73 20 74 68 65 20 73 65  arator as the se
3050: 70 61 72 61 74 6f 72 2e 0a 2a 2a 20 52 65 74 75  parator..** Retu
3060: 72 6e 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  rn the result..*
3070: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  /.static int tes
3080: 74 5f 6d 70 72 69 6e 74 66 5f 7a 28 0a 20 20 76  t_mprintf_z(.  v
3090: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
30a0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
30b0: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
30c0: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
30d0: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
30e0: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
30f0: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
3100: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3110: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
3120: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
3130: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
3140: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
3150: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 52  */.){.  char *zR
3160: 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 69 6e 74  esult = 0;.  int
3170: 20 69 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20   i;..  for(i=2; 
3180: 69 3c 61 72 67 63 20 26 26 20 28 69 3d 3d 32 20  i<argc && (i==2 
3190: 7c 7c 20 7a 52 65 73 75 6c 74 29 3b 20 69 2b 2b  || zResult); i++
31a0: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  ){.    zResult =
31b0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
31c0: 28 22 25 7a 25 73 25 73 22 2c 20 7a 52 65 73 75  ("%z%s%s", zResu
31d0: 6c 74 2c 20 61 72 67 76 5b 31 5d 2c 20 61 72 67  lt, argv[1], arg
31e0: 76 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 54 63 6c  v[i]);.  }.  Tcl
31f0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
3200: 74 65 72 70 2c 20 7a 52 65 73 75 6c 74 2c 20 30  terp, zResult, 0
3210: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
3220: 65 28 7a 52 65 73 75 6c 74 29 3b 0a 20 20 72 65  e(zResult);.  re
3230: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
3240: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71  /*.** Usage:  sq
3250: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f  lite3_mprintf_n_
3260: 74 65 73 74 20 20 53 54 52 49 4e 47 0a 2a 2a 0a  test  STRING.**.
3270: 2a 2a 20 54 65 73 74 20 74 68 65 20 25 6e 20 66  ** Test the %n f
3280: 6f 72 6d 61 74 20 6f 66 20 73 71 6c 69 74 65 5f  ormat of sqlite_
3290: 6d 70 72 69 6e 74 66 28 29 2e 20 20 52 65 74 75  mprintf().  Retu
32a0: 72 6e 20 74 68 65 20 6c 65 6e 67 74 68 20 6f 66  rn the length of
32b0: 20 74 68 65 0a 2a 2a 20 69 6e 70 75 74 20 73 74   the.** input st
32c0: 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ring..*/.static 
32d0: 69 6e 74 20 74 65 73 74 5f 6d 70 72 69 6e 74 66  int test_mprintf
32e0: 5f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  _n(.  void *NotU
32f0: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
3300: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
3310: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
3320: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3330: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3340: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3350: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3360: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
3370: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
3380: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
3390: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
33a0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
33b0: 68 61 72 20 2a 7a 53 74 72 3b 0a 20 20 69 6e 74  har *zStr;.  int
33c0: 20 6e 20 3d 20 30 3b 0a 20 20 7a 53 74 72 20 3d   n = 0;.  zStr =
33d0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
33e0: 28 22 25 73 25 6e 22 2c 20 61 72 67 76 5b 31 5d  ("%s%n", argv[1]
33f0: 2c 20 26 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  , &n);.  sqlite3
3400: 5f 66 72 65 65 28 7a 53 74 72 29 3b 0a 20 20 54  _free(zStr);.  T
3410: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
3420: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49  interp, Tcl_NewI
3430: 6e 74 4f 62 6a 28 6e 29 29 3b 0a 20 20 72 65 74  ntObj(n));.  ret
3440: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
3450: 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
3460: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e  ite3_snprintf_in
3470: 74 20 20 53 49 5a 45 20 46 4f 52 4d 41 54 20 20  t  SIZE FORMAT  
3480: 49 4e 54 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74  INT.**.** Test t
3490: 68 65 20 6f 66 20 73 71 6c 69 74 65 33 5f 73 6e  he of sqlite3_sn
34a0: 70 72 69 6e 74 66 28 29 20 72 6f 75 74 69 6e 65  printf() routine
34b0: 2e 20 20 53 49 5a 45 20 69 73 20 74 68 65 20 73  .  SIZE is the s
34c0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  ize of the.** ou
34d0: 74 70 75 74 20 62 75 66 66 65 72 20 69 6e 20 62  tput buffer in b
34e0: 79 74 65 73 2e 20 20 54 68 65 20 6d 61 78 69 6d  ytes.  The maxim
34f0: 75 6d 20 73 69 7a 65 20 69 73 20 31 30 30 2e 20  um size is 100. 
3500: 20 46 4f 52 4d 41 54 20 69 73 20 74 68 65 0a 2a   FORMAT is the.*
3510: 2a 20 66 6f 72 6d 61 74 20 73 74 72 69 6e 67 2e  * format string.
3520: 20 20 49 4e 54 20 69 73 20 61 20 73 69 6e 67 6c    INT is a singl
3530: 65 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65  e integer argume
3540: 6e 74 2e 20 20 54 68 65 20 46 4f 52 4d 41 54 0a  nt.  The FORMAT.
3550: 2a 2a 20 73 74 72 69 6e 67 20 6d 75 73 74 20 72  ** string must r
3560: 65 71 75 69 72 65 20 6e 6f 20 6d 6f 72 65 20 74  equire no more t
3570: 68 61 6e 20 74 68 69 73 20 6f 6e 65 20 69 6e 74  han this one int
3580: 65 67 65 72 20 61 72 67 75 6d 65 6e 74 2e 20 20  eger argument.  
3590: 49 66 0a 2a 2a 20 59 6f 75 20 70 61 73 73 20 69  If.** You pass i
35a0: 6e 20 61 20 66 6f 72 6d 61 74 20 73 74 72 69 6e  n a format strin
35b0: 67 20 74 68 61 74 20 72 65 71 75 69 72 65 73 20  g that requires 
35c0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 61 72  more than one ar
35d0: 67 75 6d 65 6e 74 2c 0a 2a 2a 20 62 61 64 20 74  gument,.** bad t
35e0: 68 69 6e 67 73 20 77 69 6c 6c 20 68 61 70 70 65  hings will happe
35f0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
3600: 20 74 65 73 74 5f 73 6e 70 72 69 6e 74 66 5f 69   test_snprintf_i
3610: 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55  nt(.  void *NotU
3620: 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  sed,.  Tcl_Inter
3630: 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
3640: 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
3650: 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
3660: 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
3670: 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20  /.  int argc,   
3680: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3690: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
36a0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72  s */.  char **ar
36b0: 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  gv            /*
36c0: 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61 72   Text of each ar
36d0: 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63  gument */.){.  c
36e0: 68 61 72 20 7a 53 74 72 5b 31 30 30 5d 3b 0a 20  har zStr[100];. 
36f0: 20 69 6e 74 20 6e 20 3d 20 61 74 6f 69 28 61 72   int n = atoi(ar
3700: 67 76 5b 31 5d 29 3b 0a 20 20 63 6f 6e 73 74 20  gv[1]);.  const 
3710: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 20 3d 20  char *zFormat = 
3720: 61 72 67 76 5b 32 5d 3b 0a 20 20 69 6e 74 20 61  argv[2];.  int a
3730: 31 20 3d 20 61 74 6f 69 28 61 72 67 76 5b 33 5d  1 = atoi(argv[3]
3740: 29 3b 0a 20 20 69 66 28 20 6e 3e 73 69 7a 65 6f  );.  if( n>sizeo
3750: 66 28 7a 53 74 72 29 20 29 20 6e 20 3d 20 73 69  f(zStr) ) n = si
3760: 7a 65 6f 66 28 7a 53 74 72 29 3b 0a 20 20 73 71  zeof(zStr);.  sq
3770: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
3780: 69 7a 65 6f 66 28 7a 53 74 72 29 2c 20 7a 53 74  izeof(zStr), zSt
3790: 72 2c 20 22 61 62 63 64 65 66 67 68 69 6a 6b 6c  r, "abcdefghijkl
37a0: 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 22 29  mnopqrstuvwxyz")
37b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  ;.  sqlite3_snpr
37c0: 69 6e 74 66 28 6e 2c 20 7a 53 74 72 2c 20 7a 46  intf(n, zStr, zF
37d0: 6f 72 6d 61 74 2c 20 61 31 29 3b 0a 20 20 54 63  ormat, a1);.  Tc
37e0: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
37f0: 6e 74 65 72 70 2c 20 7a 53 74 72 2c 20 30 29 3b  nterp, zStr, 0);
3800: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
3810: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
3820: 49 54 45 5f 4f 4d 49 54 5f 47 45 54 5f 54 41 42  ITE_OMIT_GET_TAB
3830: 4c 45 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  LE../*.** Usage:
3840: 20 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 74 61    sqlite3_get_ta
3850: 62 6c 65 5f 70 72 69 6e 74 66 20 20 44 42 20 20  ble_printf  DB  
3860: 46 4f 52 4d 41 54 20 20 53 54 52 49 4e 47 20 20  FORMAT  STRING  
3870: 3f 2d 2d 6e 6f 2d 63 6f 75 6e 74 73 3f 0a 2a 2a  ?--no-counts?.**
3880: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73  .** Invoke the s
3890: 71 6c 69 74 65 33 5f 67 65 74 5f 74 61 62 6c 65  qlite3_get_table
38a0: 5f 70 72 69 6e 74 66 28 29 20 69 6e 74 65 72 66  _printf() interf
38b0: 61 63 65 20 75 73 69 6e 67 20 74 68 65 20 6f 70  ace using the op
38c0: 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 44  en database.** D
38d0: 42 2e 20 20 54 68 65 20 53 51 4c 20 69 73 20 74  B.  The SQL is t
38e0: 68 65 20 73 74 72 69 6e 67 20 46 4f 52 4d 41 54  he string FORMAT
38f0: 2e 20 20 54 68 65 20 66 6f 72 6d 61 74 20 73 74  .  The format st
3900: 72 69 6e 67 20 73 68 6f 75 6c 64 20 63 6f 6e 74  ring should cont
3910: 61 69 6e 0a 2a 2a 20 6f 6e 65 20 25 73 20 6f 72  ain.** one %s or
3920: 20 25 71 2e 20 20 53 54 52 49 4e 47 20 69 73 20   %q.  STRING is 
3930: 74 68 65 20 76 61 6c 75 65 20 69 6e 73 65 72 74  the value insert
3940: 65 64 20 69 6e 74 6f 20 25 73 20 6f 72 20 25 71  ed into %s or %q
3950: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3960: 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65 5f 70  test_get_table_p
3970: 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a 4e  rintf(.  void *N
3980: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
3990: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
39a0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
39b0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
39c0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
39d0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
39f0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
3a00: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
3a10: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
3a20: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
3a30: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
3a40: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
3a50: 20 54 63 6c 5f 44 53 74 72 69 6e 67 20 73 74 72   Tcl_DString str
3a60: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  ;.  int rc;.  ch
3a70: 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
3a80: 69 6e 74 20 6e 52 6f 77 2c 20 6e 43 6f 6c 3b 0a  int nRow, nCol;.
3a90: 20 20 63 68 61 72 20 2a 2a 61 52 65 73 75 6c 74    char **aResult
3aa0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  ;.  int i;.  cha
3ab0: 72 20 7a 42 75 66 5b 33 30 5d 3b 0a 20 20 63 68  r zBuf[30];.  ch
3ac0: 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
3ad0: 72 65 73 43 6f 75 6e 74 20 3d 20 2d 31 3b 0a 20  resCount = -1;. 
3ae0: 20 69 66 28 20 61 72 67 63 3d 3d 35 20 29 7b 0a   if( argc==5 ){.
3af0: 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49      if( Tcl_GetI
3b00: 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
3b10: 34 5d 2c 20 26 72 65 73 43 6f 75 6e 74 29 20 29  4], &resCount) )
3b20: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
3b30: 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 61 72 67  R;.  }.  if( arg
3b40: 63 21 3d 34 20 26 26 20 61 72 67 63 21 3d 35 20  c!=4 && argc!=5 
3b50: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
3b60: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
3b70: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
3b80: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
3b90: 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20 22  gv[0], .       "
3ba0: 20 44 42 20 46 4f 52 4d 41 54 20 53 54 52 49 4e   DB FORMAT STRIN
3bb0: 47 20 3f 43 4f 55 4e 54 3f 22 2c 20 30 29 3b 0a  G ?COUNT?", 0);.
3bc0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
3bd0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
3be0: 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
3bf0: 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
3c00: 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
3c10: 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 44 53 74  ERROR;.  Tcl_DSt
3c20: 72 69 6e 67 49 6e 69 74 28 26 73 74 72 29 3b 0a  ringInit(&str);.
3c30: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
3c40: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 32 5d  _mprintf(argv[2]
3c50: 2c 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69 66 28  ,argv[3]);.  if(
3c60: 20 61 72 67 63 3d 3d 35 20 29 7b 0a 20 20 20 20   argc==5 ){.    
3c70: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  rc = sqlite3_get
3c80: 5f 74 61 62 6c 65 28 64 62 2c 20 7a 53 71 6c 2c  _table(db, zSql,
3c90: 20 26 61 52 65 73 75 6c 74 2c 20 30 2c 20 30 2c   &aResult, 0, 0,
3ca0: 20 26 7a 45 72 72 29 3b 0a 20 20 7d 65 6c 73 65   &zErr);.  }else
3cb0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
3cc0: 65 33 5f 67 65 74 5f 74 61 62 6c 65 28 64 62 2c  e3_get_table(db,
3cd0: 20 7a 53 71 6c 2c 20 26 61 52 65 73 75 6c 74 2c   zSql, &aResult,
3ce0: 20 26 6e 52 6f 77 2c 20 26 6e 43 6f 6c 2c 20 26   &nRow, &nCol, &
3cf0: 7a 45 72 72 29 3b 0a 20 20 20 20 72 65 73 43 6f  zErr);.    resCo
3d00: 75 6e 74 20 3d 20 28 6e 52 6f 77 2b 31 29 2a 6e  unt = (nRow+1)*n
3d10: 43 6f 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  Col;.  }.  sqlit
3d20: 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
3d30: 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
3d40: 25 64 22 2c 20 72 63 29 3b 0a 20 20 54 63 6c 5f  %d", rc);.  Tcl_
3d50: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
3d60: 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20 20 69  terp, zBuf);.  i
3d70: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
3d80: 20 29 7b 0a 20 20 20 20 69 66 28 20 61 72 67 63   ){.    if( argc
3d90: 3d 3d 34 20 29 7b 0a 20 20 20 20 20 20 73 70 72  ==4 ){.      spr
3da0: 69 6e 74 66 28 7a 42 75 66 2c 20 22 25 64 22 2c  intf(zBuf, "%d",
3db0: 20 6e 52 6f 77 29 3b 0a 20 20 20 20 20 20 54 63   nRow);.      Tc
3dc0: 6c 5f 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  l_AppendElement(
3dd0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 29 3b 0a 20  interp, zBuf);. 
3de0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75       sprintf(zBu
3df0: 66 2c 20 22 25 64 22 2c 20 6e 43 6f 6c 29 3b 0a  f, "%d", nCol);.
3e00: 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
3e10: 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
3e20: 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zBuf);.    }.   
3e30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 72 65 73 43   for(i=0; i<resC
3e40: 6f 75 6e 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ount; i++){.    
3e50: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
3e60: 65 6e 74 28 69 6e 74 65 72 70 2c 20 61 52 65 73  ent(interp, aRes
3e70: 75 6c 74 5b 69 5d 20 3f 20 61 52 65 73 75 6c 74  ult[i] ? aResult
3e80: 5b 69 5d 20 3a 20 22 4e 55 4c 4c 22 29 3b 0a 20  [i] : "NULL");. 
3e90: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
3ea0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 45 6c 65 6d    Tcl_AppendElem
3eb0: 65 6e 74 28 69 6e 74 65 72 70 2c 20 7a 45 72 72  ent(interp, zErr
3ec0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
3ed0: 5f 66 72 65 65 5f 74 61 62 6c 65 28 61 52 65 73  _free_table(aRes
3ee0: 75 6c 74 29 3b 0a 20 20 69 66 28 20 7a 45 72 72  ult);.  if( zErr
3ef0: 20 29 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28   ) sqlite3_free(
3f00: 7a 45 72 72 29 3b 0a 20 20 69 66 28 20 73 71 6c  zErr);.  if( sql
3f10: 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28  ite3TestErrCode(
3f20: 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20  interp, db, rc) 
3f30: 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
3f40: 4f 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  OR;.  return TCL
3f50: 5f 4f 4b 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f  _OK;.}..#endif /
3f60: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 45  * SQLITE_OMIT_GE
3f70: 54 5f 54 41 42 4c 45 20 2a 2f 0a 0a 0a 2f 2a 0a  T_TABLE */.../*.
3f80: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
3f90: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
3fa0: 6f 77 69 64 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65  owid DB.**.** Re
3fb0: 74 75 72 6e 73 20 74 68 65 20 69 6e 74 65 67 65  turns the intege
3fc0: 72 20 52 4f 57 49 44 20 6f 66 20 74 68 65 20 6d  r ROWID of the m
3fd0: 6f 73 74 20 72 65 63 65 6e 74 20 69 6e 73 65 72  ost recent inser
3fe0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
3ff0: 20 74 65 73 74 5f 6c 61 73 74 5f 72 6f 77 69 64   test_last_rowid
4000: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
4010: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
4020: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
4030: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
4040: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
4050: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
4060: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
4070: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
4080: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
4090: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
40a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
40b0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
40c0: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ment */.){.  sql
40d0: 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
40e0: 20 7a 42 75 66 5b 33 30 5d 3b 0a 0a 20 20 69 66   zBuf[30];..  if
40f0: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
4100: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
4110: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
4120: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
4130: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
4140: 20 22 20 44 42 5c 22 22 2c 20 30 29 3b 0a 20 20   " DB\"", 0);.  
4150: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4160: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
4170: 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
4180: 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29  p, argv[1], &db)
4190: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
41a0: 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28 7a  ROR;.  sprintf(z
41b0: 42 75 66 2c 20 22 25 6c 6c 64 22 2c 20 73 71 6c  Buf, "%lld", sql
41c0: 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74  ite3_last_insert
41d0: 5f 72 6f 77 69 64 28 64 62 29 29 3b 0a 20 20 54  _rowid(db));.  T
41e0: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
41f0: 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
4200: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
4210: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  E_OK;.}../*.** U
4220: 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6b  sage:  sqlite3_k
4230: 65 79 20 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20  ey DB KEY.**.** 
4240: 53 65 74 20 74 68 65 20 63 6f 64 65 63 20 6b 65  Set the codec ke
4250: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
4260: 20 74 65 73 74 5f 6b 65 79 28 0a 20 20 76 6f 69   test_key(.  voi
4270: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
4280: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
4290: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
42a0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
42b0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
42c0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
42d0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
42e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
42f0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
4300: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
4310: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
4320: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
4330: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
4340: 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 73 71  E_HAS_CODEC.  sq
4350: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
4360: 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b 0a 20  st char *zKey;. 
4370: 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69 66 28   int nKey;.  if(
4380: 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20   argc!=3 ){.    
4390: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
43a0: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
43b0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
43c0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
43d0: 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41 4d         " FILENAM
43e0: 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  E\"", 0);.    re
43f0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
4400: 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
4410: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61  ointer(interp, a
4420: 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72  rgv[1], &db) ) r
4430: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4440: 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76 5b 32  .  zKey = argv[2
4450: 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74 72 6c  ];.  nKey = strl
4460: 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 73 71 6c 69  en(zKey);.  sqli
4470: 74 65 33 5f 6b 65 79 28 64 62 2c 20 7a 4b 65 79  te3_key(db, zKey
4480: 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e 64 69 66 0a  , nKey);.#endif.
4490: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
44a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
44b0: 20 20 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 20    sqlite3_rekey 
44c0: 44 42 20 4b 45 59 0a 2a 2a 0a 2a 2a 20 43 68 61  DB KEY.**.** Cha
44d0: 6e 67 65 20 74 68 65 20 63 6f 64 65 63 20 6b 65  nge the codec ke
44e0: 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
44f0: 20 74 65 73 74 5f 72 65 6b 65 79 28 0a 20 20 76   test_rekey(.  v
4500: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
4510: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
4520: 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
4530: 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
4540: 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
4550: 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
4560: 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20   argc,          
4570: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4580: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
4590: 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20  char **argv     
45a0: 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f         /* Text o
45b0: 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20  f each argument 
45c0: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
45d0: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
45e0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
45f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4b 65 79 3b  onst char *zKey;
4600: 0a 20 20 69 6e 74 20 6e 4b 65 79 3b 0a 20 20 69  .  int nKey;.  i
4610: 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20 20  f( argc!=3 ){.  
4620: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
4630: 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
4640: 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
4650: 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d   be \"", argv[0]
4660: 2c 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e  ,.       " FILEN
4670: 41 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  AME\"", 0);.    
4680: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4690: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
46a0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
46b0: 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29   argv[1], &db) )
46c0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
46d0: 52 3b 0a 20 20 7a 4b 65 79 20 3d 20 61 72 67 76  R;.  zKey = argv
46e0: 5b 32 5d 3b 0a 20 20 6e 4b 65 79 20 3d 20 73 74  [2];.  nKey = st
46f0: 72 6c 65 6e 28 7a 4b 65 79 29 3b 0a 20 20 73 71  rlen(zKey);.  sq
4700: 6c 69 74 65 33 5f 72 65 6b 65 79 28 64 62 2c 20  lite3_rekey(db, 
4710: 7a 4b 65 79 2c 20 6e 4b 65 79 29 3b 0a 23 65 6e  zKey, nKey);.#en
4720: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
4730: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
4740: 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 6c  age:  sqlite3_cl
4750: 6f 73 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 6c 6f  ose DB.**.** Clo
4760: 73 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ses the database
4770: 20 6f 70 65 6e 65 64 20 62 79 20 73 71 6c 69 74   opened by sqlit
4780: 65 33 5f 6f 70 65 6e 2e 0a 2a 2f 0a 73 74 61 74  e3_open..*/.stat
4790: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f 74 65  ic int sqlite_te
47a0: 73 74 5f 63 6c 6f 73 65 28 0a 20 20 76 6f 69 64  st_close(.  void
47b0: 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c   *NotUsed,.  Tcl
47c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
47d0: 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
47e0: 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
47f0: 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
4800: 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72  mand */.  int ar
4810: 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gc,             
4820: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
4830: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61  guments */.  cha
4840: 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20  r **argv        
4850: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
4860: 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a  ach argument */.
4870: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
4880: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66  ;.  int rc;.  if
4890: 28 20 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20  ( argc!=2 ){.   
48a0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
48b0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
48c0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
48d0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
48e0: 0a 20 20 20 20 20 20 20 22 20 46 49 4c 45 4e 41  .       " FILENA
48f0: 4d 45 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72  ME\"", 0);.    r
4900: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
4910: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
4920: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
4930: 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20 29 20  argv[1], &db) ) 
4940: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
4950: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
4960: 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 54 63  _close(db);.  Tc
4970: 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65  l_SetResult(inte
4980: 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72  rp, (char *)t1Er
4990: 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c  rorName(rc), TCL
49a0: 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75  _STATIC);.  retu
49b0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
49c0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
49d0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 20 44 42 0a  te3_close_v2 DB.
49e0: 2a 2a 0a 2a 2a 20 43 6c 6f 73 65 73 20 74 68 65  **.** Closes the
49f0: 20 64 61 74 61 62 61 73 65 20 6f 70 65 6e 65 64   database opened
4a00: 20 62 79 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e   by sqlite3_open
4a10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4a20: 73 71 6c 69 74 65 5f 74 65 73 74 5f 63 6c 6f 73  sqlite_test_clos
4a30: 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  e_v2(.  void *No
4a40: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
4a50: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
4a60: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
4a70: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
4a80: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
4a90: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
4aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4ab0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
4ac0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
4ad0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
4ae0: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
4af0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
4b00: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
4b10: 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 61 72  int rc;.  if( ar
4b20: 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=2 ){.    Tcl
4b30: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
4b40: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
4b50: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
4b60: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
4b70: 20 20 20 20 22 20 46 49 4c 45 4e 41 4d 45 5c 22      " FILENAME\"
4b80: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
4b90: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
4ba0: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
4bb0: 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
4bc0: 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75  [1], &db) ) retu
4bd0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
4be0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f  rc = sqlite3_clo
4bf0: 73 65 5f 76 32 28 64 62 29 3b 0a 20 20 54 63 6c  se_v2(db);.  Tcl
4c00: 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
4c10: 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45 72 72  p, (char *)t1Err
4c20: 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f  orName(rc), TCL_
4c30: 53 54 41 54 49 43 29 3b 0a 20 20 72 65 74 75 72  STATIC);.  retur
4c40: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
4c50: 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
4c60: 6e 20 6f 66 20 74 68 65 20 78 5f 63 6f 61 6c 65  n of the x_coale
4c70: 73 63 65 28 29 20 66 75 6e 63 74 69 6f 6e 2e 0a  sce() function..
4c80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
4c90: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 6e 6f 6e  rst argument non
4ca0: 2d 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a  -NULL argument..
4cb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
4cc0: 31 5f 69 66 6e 75 6c 6c 46 75 6e 63 28 0a 20 20  1_ifnullFunc(.  
4cd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
4ce0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
4cf0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
4d00: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
4d10: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
4d20: 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29  =0; i<argc; i++)
4d30: 7b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  {.    if( SQLITE
4d40: 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33 5f 76  _NULL!=sqlite3_v
4d50: 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 69  alue_type(argv[i
4d60: 5d 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ]) ){.      int 
4d70: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
4d80: 65 5f 62 79 74 65 73 28 61 72 67 76 5b 69 5d 29  e_bytes(argv[i])
4d90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
4da0: 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e 74  result_text(cont
4db0: 65 78 74 2c 20 28 63 68 61 72 2a 29 73 71 6c 69  ext, (char*)sqli
4dc0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
4dd0: 72 67 76 5b 69 5d 29 2c 0a 20 20 20 20 20 20 20  rgv[i]),.       
4de0: 20 20 20 6e 2c 20 53 51 4c 49 54 45 5f 54 52 41     n, SQLITE_TRA
4df0: 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 62  NSIENT);.      b
4e00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
4e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  }../*.** These a
4e20: 72 65 20 74 65 73 74 20 66 75 6e 63 74 69 6f 6e  re test function
4e30: 73 2e 20 20 20 20 68 65 78 38 28 29 20 69 6e 74  s.    hex8() int
4e40: 65 72 70 72 65 74 73 20 69 74 73 20 61 72 67 75  erprets its argu
4e50: 6d 65 6e 74 20 61 73 0a 2a 2a 20 55 54 46 38 20  ment as.** UTF8 
4e60: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 68 65  and returns a he
4e70: 78 20 65 6e 63 6f 64 69 6e 67 2e 20 20 68 65 78  x encoding.  hex
4e80: 31 36 6c 65 28 29 20 69 6e 74 65 72 70 72 65 74  16le() interpret
4e90: 73 20 69 74 73 20 61 72 67 75 6d 65 6e 74 0a 2a  s its argument.*
4ea0: 2a 20 61 73 20 55 54 46 31 36 6c 65 20 61 6e 64  * as UTF16le and
4eb0: 20 72 65 74 75 72 6e 73 20 61 20 68 65 78 20 65   returns a hex e
4ec0: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
4ed0: 69 63 20 76 6f 69 64 20 68 65 78 38 46 75 6e 63  ic void hex8Func
4ee0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
4ef0: 20 2a 70 2c 20 69 6e 74 20 61 72 67 63 2c 20 73   *p, int argc, s
4f00: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
4f10: 72 67 76 29 7b 0a 20 20 63 6f 6e 73 74 20 75 6e  rgv){.  const un
4f20: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 3b 0a  signed char *z;.
4f30: 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
4f40: 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 7a 20 3d  zBuf[200];.  z =
4f50: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
4f60: 65 78 74 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  ext(argv[0]);.  
4f70: 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65 6f  for(i=0; i<sizeo
4f80: 66 28 7a 42 75 66 29 2f 32 20 2d 20 32 20 26 26  f(zBuf)/2 - 2 &&
4f90: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
4fa0: 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b 69   sprintf(&zBuf[i
4fb0: 2a 32 5d 2c 20 22 25 30 32 78 22 2c 20 7a 5b 69  *2], "%02x", z[i
4fc0: 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a 20 20 7a  ]&0xff);.  }.  z
4fd0: 42 75 66 5b 69 2a 32 5d 20 3d 20 30 3b 0a 20 20  Buf[i*2] = 0;.  
4fe0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
4ff0: 65 78 74 28 70 2c 20 28 63 68 61 72 2a 29 7a 42  ext(p, (char*)zB
5000: 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  uf, -1, SQLITE_T
5010: 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a 23 69 66  RANSIENT);.}.#if
5020: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5030: 5f 55 54 46 31 36 0a 73 74 61 74 69 63 20 76 6f  _UTF16.static vo
5040: 69 64 20 68 65 78 31 36 46 75 6e 63 28 73 71 6c  id hex16Func(sql
5050: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 2c  ite3_context *p,
5060: 20 69 6e 74 20 61 72 67 63 2c 20 73 71 6c 69 74   int argc, sqlit
5070: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 29  e3_value **argv)
5080: 7b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  {.  const unsign
5090: 65 64 20 73 68 6f 72 74 20 69 6e 74 20 2a 7a 3b  ed short int *z;
50a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
50b0: 20 7a 42 75 66 5b 34 30 30 5d 3b 0a 20 20 7a 20   zBuf[400];.  z 
50c0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
50d0: 74 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b  text16(argv[0]);
50e0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69  .  for(i=0; i<si
50f0: 7a 65 6f 66 28 7a 42 75 66 29 2f 34 20 2d 20 34  zeof(zBuf)/4 - 4
5100: 20 26 26 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   && z[i]; i++){.
5110: 20 20 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75      sprintf(&zBu
5120: 66 5b 69 2a 34 5d 2c 20 22 25 30 34 78 22 2c 20  f[i*4], "%04x", 
5130: 7a 5b 69 5d 26 30 78 66 66 29 3b 0a 20 20 7d 0a  z[i]&0xff);.  }.
5140: 20 20 7a 42 75 66 5b 69 2a 34 5d 20 3d 20 30 3b    zBuf[i*4] = 0;
5150: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5160: 74 5f 74 65 78 74 28 70 2c 20 28 63 68 61 72 2a  t_text(p, (char*
5170: 29 7a 42 75 66 2c 20 2d 31 2c 20 53 51 4c 49 54  )zBuf, -1, SQLIT
5180: 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 7d 0a  E_TRANSIENT);.}.
5190: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
51a0: 73 74 72 75 63 74 75 72 65 20 69 6e 74 6f 20 77  structure into w
51b0: 68 69 63 68 20 74 6f 20 61 63 63 75 6d 75 6c 61  hich to accumula
51c0: 74 65 20 74 65 78 74 2e 0a 2a 2f 0a 73 74 72 75  te text..*/.stru
51d0: 63 74 20 64 73 74 72 20 7b 0a 20 20 69 6e 74 20  ct dstr {.  int 
51e0: 6e 41 6c 6c 6f 63 3b 20 20 2f 2a 20 53 70 61 63  nAlloc;  /* Spac
51f0: 65 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  e allocated */. 
5200: 20 69 6e 74 20 6e 55 73 65 64 3b 20 20 20 2f 2a   int nUsed;   /*
5210: 20 53 70 61 63 65 20 75 73 65 64 20 2a 2f 0a 20   Space used */. 
5220: 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 2f 2a   char *z;     /*
5230: 20 54 68 65 20 73 70 61 63 65 20 2a 2f 0a 7d 3b   The space */.};
5240: 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 74  ../*.** Append t
5250: 65 78 74 20 74 6f 20 61 20 64 73 74 72 0a 2a 2f  ext to a dstr.*/
5260: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 73 74  .static void dst
5270: 72 41 70 70 65 6e 64 28 73 74 72 75 63 74 20 64  rAppend(struct d
5280: 73 74 72 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  str *p, const ch
5290: 61 72 20 2a 7a 2c 20 69 6e 74 20 64 69 76 69 64  ar *z, int divid
52a0: 65 72 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 28  er){.  int n = (
52b0: 69 6e 74 29 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  int)strlen(z);. 
52c0: 20 69 66 28 20 70 2d 3e 6e 55 73 65 64 20 2b 20   if( p->nUsed + 
52d0: 6e 20 2b 20 32 20 3e 20 70 2d 3e 6e 41 6c 6c 6f  n + 2 > p->nAllo
52e0: 63 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  c ){.    char *z
52f0: 4e 65 77 3b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  New;.    p->nAll
5300: 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc = p->nAlloc*2
5310: 20 2b 20 6e 20 2b 20 32 30 30 3b 0a 20 20 20 20   + n + 200;.    
5320: 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72  zNew = sqlite3_r
5330: 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e  ealloc(p->z, p->
5340: 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
5350: 20 7a 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   zNew==0 ){.    
5360: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
5370: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73  ->z);.      mems
5380: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
5390: 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75  *p));.      retu
53a0: 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  rn;.    }.    p-
53b0: 3e 7a 20 3d 20 7a 4e 65 77 3b 0a 20 20 7d 0a 20  >z = zNew;.  }. 
53c0: 20 69 66 28 20 64 69 76 69 64 65 72 20 26 26 20   if( divider && 
53d0: 70 2d 3e 6e 55 73 65 64 3e 30 20 29 7b 0a 20 20  p->nUsed>0 ){.  
53e0: 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 55 73 65 64 2b    p->z[p->nUsed+
53f0: 2b 5d 20 3d 20 64 69 76 69 64 65 72 3b 0a 20 20  +] = divider;.  
5400: 7d 0a 20 20 6d 65 6d 63 70 79 28 26 70 2d 3e 7a  }.  memcpy(&p->z
5410: 5b 70 2d 3e 6e 55 73 65 64 5d 2c 20 7a 2c 20 6e  [p->nUsed], z, n
5420: 2b 31 29 3b 0a 20 20 70 2d 3e 6e 55 73 65 64 20  +1);.  p->nUsed 
5430: 2b 3d 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  += n;.}../*.** I
5440: 6e 76 6f 6b 65 64 20 66 6f 72 20 65 61 63 68 20  nvoked for each 
5450: 63 61 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 73 71  callback from sq
5460: 6c 69 74 65 33 45 78 65 63 46 75 6e 63 0a 2a 2f  lite3ExecFunc.*/
5470: 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 65 63  .static int exec
5480: 46 75 6e 63 43 61 6c 6c 62 61 63 6b 28 76 6f 69  FuncCallback(voi
5490: 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 61 72  d *pData, int ar
54a0: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 2c  gc, char **argv,
54b0: 20 63 68 61 72 20 2a 2a 4e 6f 74 55 73 65 64 29   char **NotUsed)
54c0: 7b 0a 20 20 73 74 72 75 63 74 20 64 73 74 72 20  {.  struct dstr 
54d0: 2a 70 20 3d 20 28 73 74 72 75 63 74 20 64 73 74  *p = (struct dst
54e0: 72 2a 29 70 44 61 74 61 3b 0a 20 20 69 6e 74 20  r*)pData;.  int 
54f0: 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
5500: 61 72 67 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  argc; i++){.    
5510: 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29  if( argv[i]==0 )
5520: 7b 0a 20 20 20 20 20 20 64 73 74 72 41 70 70 65  {.      dstrAppe
5530: 6e 64 28 70 2c 20 22 4e 55 4c 4c 22 2c 20 27 20  nd(p, "NULL", ' 
5540: 27 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ');.    }else{. 
5550: 20 20 20 20 20 64 73 74 72 41 70 70 65 6e 64 28       dstrAppend(
5560: 70 2c 20 61 72 67 76 5b 69 5d 2c 20 27 20 27 29  p, argv[i], ' ')
5570: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
5580: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5590: 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
55a0: 6f 66 20 74 68 65 20 78 5f 73 71 6c 69 74 65 5f  of the x_sqlite_
55b0: 65 78 65 63 28 29 20 66 75 6e 63 74 69 6f 6e 2e  exec() function.
55c0: 20 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20    This function 
55d0: 74 61 6b 65 73 0a 2a 2a 20 61 20 73 69 6e 67 6c  takes.** a singl
55e0: 65 20 61 72 67 75 6d 65 6e 74 20 61 6e 64 20 61  e argument and a
55f0: 74 74 65 6d 70 74 73 20 74 6f 20 65 78 65 63 75  ttempts to execu
5600: 74 65 20 74 68 61 74 20 61 72 67 75 6d 65 6e 74  te that argument
5610: 20 61 73 20 53 51 4c 20 63 6f 64 65 2e 0a 2a 2a   as SQL code..**
5620: 20 54 68 69 73 20 69 73 20 69 6c 6c 65 67 61 6c   This is illegal
5630: 20 61 6e 64 20 73 68 6f 75 6c 64 20 73 65 74 20   and should set 
5640: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
5650: 45 20 66 6c 61 67 20 6f 6e 20 74 68 65 20 64 61  E flag on the da
5660: 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 32 30  tabase..**.** 20
5670: 30 34 2d 4a 61 6e 2d 30 37 3a 20 20 57 65 20 68  04-Jan-07:  We h
5680: 61 76 65 20 63 68 61 6e 67 65 64 20 74 68 69 73  ave changed this
5690: 20 74 6f 20 6d 61 6b 65 20 69 74 20 6c 65 67 61   to make it lega
56a0: 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c 69 74 65  l to call sqlite
56b0: 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 72 6f 6d  3_exec().** from
56c0: 20 77 69 74 68 69 6e 20 61 20 66 75 6e 63 74 69   within a functi
56d0: 6f 6e 20 63 61 6c 6c 2e 20 20 0a 2a 2a 20 0a 2a  on call.  .** .*
56e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
56f0: 69 6d 75 6c 61 74 65 73 20 74 68 65 20 65 66 66  imulates the eff
5700: 65 63 74 20 6f 66 20 68 61 76 69 6e 67 20 74 77  ect of having tw
5710: 6f 20 74 68 72 65 61 64 73 20 61 74 74 65 6d 70  o threads attemp
5720: 74 20 74 6f 0a 2a 2a 20 75 73 65 20 74 68 65 20  t to.** use the 
5730: 73 61 6d 65 20 64 61 74 61 62 61 73 65 20 61 74  same database at
5740: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
5750: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
5760: 71 6c 69 74 65 33 45 78 65 63 46 75 6e 63 28 0a  qlite3ExecFunc(.
5770: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5780: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
5790: 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c  nt argc,  .  sql
57a0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
57b0: 76 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 64 73  v.){.  struct ds
57c0: 74 72 20 78 3b 0a 20 20 6d 65 6d 73 65 74 28 26  tr x;.  memset(&
57d0: 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 78 29 29  x, 0, sizeof(x))
57e0: 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ;.  (void)sqlite
57f0: 33 5f 65 78 65 63 28 28 73 71 6c 69 74 65 33 2a  3_exec((sqlite3*
5800: 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
5810: 74 61 28 63 6f 6e 74 65 78 74 29 2c 0a 20 20 20  ta(context),.   
5820: 20 20 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65     (char*)sqlite
5830: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
5840: 76 5b 30 5d 29 2c 0a 20 20 20 20 20 20 65 78 65  v[0]),.      exe
5850: 63 46 75 6e 63 43 61 6c 6c 62 61 63 6b 2c 20 26  cFuncCallback, &
5860: 78 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  x, 0);.  sqlite3
5870: 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 63 6f 6e  _result_text(con
5880: 74 65 78 74 2c 20 78 2e 7a 2c 20 78 2e 6e 55 73  text, x.z, x.nUs
5890: 65 64 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53  ed, SQLITE_TRANS
58a0: 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65 33  IENT);.  sqlite3
58b0: 5f 66 72 65 65 28 78 2e 7a 29 3b 0a 7d 0a 0a 2f  _free(x.z);.}../
58c0: 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
58d0: 69 6f 6e 20 6f 66 20 74 6b 74 32 32 31 33 66 75  ion of tkt2213fu
58e0: 6e 63 28 29 2c 20 61 20 73 63 61 6c 61 72 20 66  nc(), a scalar f
58f0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 74 61 6b  unction that tak
5900: 65 73 20 65 78 61 63 74 6c 79 0a 2a 2a 20 6f 6e  es exactly.** on
5910: 65 20 61 72 67 75 6d 65 6e 74 2e 20 49 74 20 68  e argument. It h
5920: 61 73 20 74 77 6f 20 69 6e 74 65 72 65 73 74 69  as two interesti
5930: 6e 67 20 66 65 61 74 75 72 65 73 3a 0a 2a 2a 0a  ng features:.**.
5940: 2a 2a 20 2a 20 49 74 20 63 61 6c 6c 73 20 73 71  ** * It calls sq
5950: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5960: 28 29 20 33 20 74 69 6d 65 73 20 6f 6e 20 74 68  () 3 times on th
5970: 65 20 61 72 67 75 6d 65 6e 74 20 73 71 6c 69 74  e argument sqlit
5980: 65 33 5f 76 61 6c 75 65 2a 2e 0a 2a 2a 20 20 20  e3_value*..**   
5990: 49 66 20 74 68 65 20 74 68 72 65 65 20 70 6f 69  If the three poi
59a0: 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64 20 61  nters returned a
59b0: 72 65 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20  re not the same 
59c0: 61 6e 20 53 51 4c 20 65 72 72 6f 72 20 69 73 20  an SQL error is 
59d0: 72 61 69 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 2a 20  raised..**.** * 
59e0: 4f 74 68 65 72 77 69 73 65 20 69 74 20 72 65 74  Otherwise it ret
59f0: 75 72 6e 73 20 61 20 63 6f 70 79 20 6f 66 20 74  urns a copy of t
5a00: 68 65 20 74 65 78 74 20 72 65 70 72 65 73 65 6e  he text represen
5a10: 74 61 74 69 6f 6e 20 6f 66 20 69 74 73 20 0a 2a  tation of its .*
5a20: 2a 20 20 20 61 72 67 75 6d 65 6e 74 20 69 6e 20  *   argument in 
5a30: 73 75 63 68 20 61 20 77 61 79 20 61 73 20 74 68  such a way as th
5a40: 65 20 56 44 42 45 20 72 65 70 72 65 73 65 6e 74  e VDBE represent
5a50: 61 74 69 6f 6e 20 69 73 20 61 20 4d 65 6d 2a 20  ation is a Mem* 
5a60: 63 65 6c 6c 20 0a 2a 2a 20 20 20 77 69 74 68 20  cell .**   with 
5a70: 74 68 65 20 4d 45 4d 5f 54 65 72 6d 20 66 6c 61  the MEM_Term fla
5a80: 67 20 63 6c 65 61 72 2e 20 0a 2a 2a 0a 2a 2a 20  g clear. .**.** 
5a90: 54 69 63 6b 65 74 20 23 32 32 31 33 20 63 61 6e  Ticket #2213 can
5aa0: 20 74 68 65 72 65 66 6f 72 65 20 62 65 20 74 65   therefore be te
5ab0: 73 74 65 64 20 62 79 20 65 76 61 6c 75 61 74 69  sted by evaluati
5ac0: 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ng the following
5ad0: 0a 2a 2a 20 53 51 4c 20 65 78 70 72 65 73 73 69  .** SQL expressi
5ae0: 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 74 6b 74 32  on:.**.**   tkt2
5af0: 32 31 33 66 75 6e 63 28 74 6b 74 32 32 31 33 66  213func(tkt2213f
5b00: 75 6e 63 28 27 61 20 73 74 72 69 6e 67 27 29 29  unc('a string'))
5b10: 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ;.*/.static void
5b20: 20 74 6b 74 32 32 31 33 46 75 6e 63 74 69 6f 6e   tkt2213Function
5b30: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
5b40: 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20  ext *context, . 
5b50: 20 69 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73   int argc,  .  s
5b60: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5b70: 72 67 76 0a 29 7b 0a 20 20 69 6e 74 20 6e 54 65  rgv.){.  int nTe
5b80: 78 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  xt;.  unsigned c
5b90: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74  har const *zText
5ba0: 31 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  1;.  unsigned ch
5bb0: 61 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 32  ar const *zText2
5bc0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
5bd0: 72 20 63 6f 6e 73 74 20 2a 7a 54 65 78 74 33 3b  r const *zText3;
5be0: 0a 0a 20 20 6e 54 65 78 74 20 3d 20 73 71 6c 69  ..  nText = sqli
5bf0: 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73 28  te3_value_bytes(
5c00: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78  argv[0]);.  zTex
5c10: 74 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  t1 = sqlite3_val
5c20: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
5c30: 3b 0a 20 20 7a 54 65 78 74 32 20 3d 20 73 71 6c  ;.  zText2 = sql
5c40: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
5c50: 61 72 67 76 5b 30 5d 29 3b 0a 20 20 7a 54 65 78  argv[0]);.  zTex
5c60: 74 33 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c  t3 = sqlite3_val
5c70: 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
5c80: 3b 0a 0a 20 20 69 66 28 20 7a 54 65 78 74 31 21  ;..  if( zText1!
5c90: 3d 7a 54 65 78 74 32 20 7c 7c 20 7a 54 65 78 74  =zText2 || zText
5ca0: 32 21 3d 7a 54 65 78 74 33 20 29 7b 0a 20 20 20  2!=zText3 ){.   
5cb0: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
5cc0: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
5cd0: 74 6b 74 32 32 31 33 20 69 73 20 6e 6f 74 20 66  tkt2213 is not f
5ce0: 69 78 65 64 22 2c 20 2d 31 29 3b 0a 20 20 7d 65  ixed", -1);.  }e
5cf0: 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
5d00: 43 6f 70 79 20 3d 20 28 63 68 61 72 20 2a 29 73  Copy = (char *)s
5d10: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 54  qlite3_malloc(nT
5d20: 65 78 74 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ext);.    memcpy
5d30: 28 7a 43 6f 70 79 2c 20 7a 54 65 78 74 31 2c 20  (zCopy, zText1, 
5d40: 6e 54 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69  nText);.    sqli
5d50: 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
5d60: 63 6f 6e 74 65 78 74 2c 20 7a 43 6f 70 79 2c 20  context, zCopy, 
5d70: 6e 54 65 78 74 2c 20 73 71 6c 69 74 65 33 5f 66  nText, sqlite3_f
5d80: 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ree);.  }.}../*.
5d90: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
5da0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 74 61   SQL function ta
5db0: 6b 65 73 20 34 20 61 72 67 75 6d 65 6e 74 73 2e  kes 4 arguments.
5dc0: 20 20 54 68 65 20 32 6e 64 20 61 6e 64 0a 2a 2a    The 2nd and.**
5dd0: 20 34 74 68 20 61 72 67 75 6d 65 6e 74 20 6d 75   4th argument mu
5de0: 73 74 20 62 65 20 6f 6e 65 20 6f 66 20 74 68 65  st be one of the
5df0: 73 65 20 73 74 72 69 6e 67 73 3a 20 20 27 74 65  se strings:  'te
5e00: 78 74 27 2c 20 27 74 65 78 74 31 36 27 2c 0a 2a  xt', 'text16',.*
5e10: 2a 20 6f 72 20 27 62 6c 6f 62 27 20 63 6f 72 72  * or 'blob' corr
5e20: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 41 50 49  esponding to API
5e30: 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 0a 2a 2a   functions.**.**
5e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 61        sqlite3_va
5e50: 6c 75 65 5f 74 65 78 74 28 29 0a 2a 2a 20 20 20  lue_text().**   
5e60: 20 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65     sqlite3_value
5e70: 5f 74 65 78 74 31 36 28 29 0a 2a 2a 20 20 20 20  _text16().**    
5e80: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f    sqlite3_value_
5e90: 62 6c 6f 62 28 29 0a 2a 2a 0a 2a 2a 20 54 68 65  blob().**.** The
5ea0: 20 74 68 69 72 64 20 61 72 67 75 6d 65 6e 74 20   third argument 
5eb0: 69 73 20 61 20 73 74 72 69 6e 67 2c 20 65 69 74  is a string, eit
5ec0: 68 65 72 20 27 62 79 74 65 73 27 20 6f 72 20 27  her 'bytes' or '
5ed0: 62 79 74 65 73 31 36 27 20 6f 72 20 27 6e 6f 6f  bytes16' or 'noo
5ee0: 70 27 2c 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  p',.** correspon
5ef0: 64 69 6e 67 20 74 6f 20 41 50 49 73 3a 0a 2a 2a  ding to APIs:.**
5f00: 0a 2a 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33  .**      sqlite3
5f10: 5f 76 61 6c 75 65 5f 62 79 74 65 73 28 29 0a 2a  _value_bytes().*
5f20: 2a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76  *      sqlite3_v
5f30: 61 6c 75 65 5f 62 79 74 65 73 31 36 28 29 0a 2a  alue_bytes16().*
5f40: 2a 20 20 20 20 20 20 6e 6f 6f 70 0a 2a 2a 0a 2a  *      noop.**.*
5f50: 2a 20 54 68 65 20 41 50 49 73 20 64 65 73 69 67  * The APIs desig
5f60: 6e 61 74 65 64 20 62 79 20 74 68 65 20 32 6e 64  nated by the 2nd
5f70: 20 74 68 72 6f 75 67 68 20 34 74 68 20 61 72 67   through 4th arg
5f80: 75 6d 65 6e 74 73 20 61 72 65 20 61 70 70 6c 69  uments are appli
5f90: 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72  ed.** to the fir
5fa0: 73 74 20 61 72 67 75 6d 65 6e 74 20 69 6e 20 6f  st argument in o
5fb0: 72 64 65 72 2e 20 20 49 66 20 74 68 65 20 70 6f  rder.  If the po
5fc0: 69 6e 74 65 72 73 20 72 65 74 75 72 6e 65 64 20  inters returned 
5fd0: 62 79 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  by the.** second
5fe0: 20 61 6e 64 20 66 6f 75 72 74 68 20 61 72 65 20   and fourth are 
5ff0: 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69 73 20  different, this 
6000: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6010: 31 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  1.  Otherwise,.*
6020: 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * this routine r
6030: 65 74 75 72 6e 73 20 30 2e 0a 2a 2a 0a 2a 2a 20  eturns 0..**.** 
6040: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
6050: 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 6f   used to test to
6060: 20 73 65 65 20 77 68 65 6e 20 72 65 74 75 72 6e   see when return
6070: 65 64 20 70 6f 69 6e 74 65 72 73 20 66 72 6f 6d  ed pointers from
6080: 0a 2a 2a 20 74 68 65 20 5f 74 65 78 74 28 29 2c  .** the _text(),
6090: 20 5f 74 65 78 74 31 36 28 29 20 61 6e 64 20 5f   _text16() and _
60a0: 62 6c 6f 62 28 29 20 41 50 49 73 20 62 65 63 6f  blob() APIs beco
60b0: 6d 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  me invalidated..
60c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
60d0: 74 72 43 68 6e 67 46 75 6e 63 74 69 6f 6e 28 0a  trChngFunction(.
60e0: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
60f0: 74 20 2a 63 6f 6e 74 65 78 74 2c 20 0a 20 20 69  t *context, .  i
6100: 6e 74 20 61 72 67 63 2c 20 20 0a 20 20 73 71 6c  nt argc,  .  sql
6110: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
6120: 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 76 6f 69  v.){.  const voi
6130: 64 20 2a 70 31 2c 20 2a 70 32 3b 0a 20 20 63 6f  d *p1, *p2;.  co
6140: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a  nst char *zCmd;.
6150: 20 20 69 66 28 20 61 72 67 63 21 3d 34 20 29 20    if( argc!=4 ) 
6160: 72 65 74 75 72 6e 3b 0a 20 20 7a 43 6d 64 20 3d  return;.  zCmd =
6170: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
6180: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6190: 28 61 72 67 76 5b 31 5d 29 3b 0a 20 20 69 66 28  (argv[1]);.  if(
61a0: 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72   zCmd==0 ) retur
61b0: 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  n;.  if( strcmp(
61c0: 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d 30 20  zCmd,"text")==0 
61d0: 29 7b 0a 20 20 20 20 70 31 20 3d 20 28 63 6f 6e  ){.    p1 = (con
61e0: 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  st void*)sqlite3
61f0: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
6200: 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  [0]);.#ifndef SQ
6210: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
6220: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
6230: 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74 31 36  mp(zCmd, "text16
6240: 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70 31 20  ")==0 ){.    p1 
6250: 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a 29 73  = (const void*)s
6260: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
6270: 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65  t16(argv[0]);.#e
6280: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28  ndif.  }else if(
6290: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 62   strcmp(zCmd, "b
62a0: 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lob")==0 ){.    
62b0: 70 31 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  p1 = (const void
62c0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
62d0: 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b 0a 20  blob(argv[0]);. 
62e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
62f0: 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d  rn;.  }.  zCmd =
6300: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
6310: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
6320: 28 61 72 67 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (argv[2]);.  if(
6330: 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74 75 72   zCmd==0 ) retur
6340: 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28  n;.  if( strcmp(
6350: 7a 43 6d 64 2c 22 62 79 74 65 73 22 29 3d 3d 30  zCmd,"bytes")==0
6360: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
6370: 76 61 6c 75 65 5f 62 79 74 65 73 28 61 72 67 76  value_bytes(argv
6380: 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  [0]);.#ifndef SQ
6390: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
63a0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
63b0: 6d 70 28 7a 43 6d 64 2c 20 22 62 79 74 65 73 31  mp(zCmd, "bytes1
63c0: 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  6")==0 ){.    sq
63d0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65  lite3_value_byte
63e0: 73 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a 23 65  s16(argv[0]);.#e
63f0: 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69 66 28  ndif.  }else if(
6400: 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20 22 6e   strcmp(zCmd, "n
6410: 6f 6f 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  oop")==0 ){.    
6420: 2f 2a 20 64 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* do nothing */
6430: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
6440: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64  turn;.  }.  zCmd
6450: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
6460: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
6470: 78 74 28 61 72 67 76 5b 33 5d 29 3b 0a 20 20 69  xt(argv[3]);.  i
6480: 66 28 20 7a 43 6d 64 3d 3d 30 20 29 20 72 65 74  f( zCmd==0 ) ret
6490: 75 72 6e 3b 0a 20 20 69 66 28 20 73 74 72 63 6d  urn;.  if( strcm
64a0: 70 28 7a 43 6d 64 2c 22 74 65 78 74 22 29 3d 3d  p(zCmd,"text")==
64b0: 30 20 29 7b 0a 20 20 20 20 70 32 20 3d 20 28 63  0 ){.    p2 = (c
64c0: 6f 6e 73 74 20 76 6f 69 64 2a 29 73 71 6c 69 74  onst void*)sqlit
64d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
64e0: 67 76 5b 30 5d 29 3b 0a 23 69 66 6e 64 65 66 20  gv[0]);.#ifndef 
64f0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
6500: 36 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  6.  }else if( st
6510: 72 63 6d 70 28 7a 43 6d 64 2c 20 22 74 65 78 74  rcmp(zCmd, "text
6520: 31 36 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 70  16")==0 ){.    p
6530: 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64 2a  2 = (const void*
6540: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6550: 65 78 74 31 36 28 61 72 67 76 5b 30 5d 29 3b 0a  ext16(argv[0]);.
6560: 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 20 69  #endif.  }else i
6570: 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64 2c 20  f( strcmp(zCmd, 
6580: 22 62 6c 6f 62 22 29 3d 3d 30 20 29 7b 0a 20 20  "blob")==0 ){.  
6590: 20 20 70 32 20 3d 20 28 63 6f 6e 73 74 20 76 6f    p2 = (const vo
65a0: 69 64 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  id*)sqlite3_valu
65b0: 65 5f 62 6c 6f 62 28 61 72 67 76 5b 30 5d 29 3b  e_blob(argv[0]);
65c0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65  .  }else{.    re
65d0: 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  turn;.  }.  sqli
65e0: 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74 28 63  te3_result_int(c
65f0: 6f 6e 74 65 78 74 2c 20 70 31 21 3d 70 32 29 3b  ontext, p1!=p2);
6600: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
6610: 3a 20 20 73 71 6c 69 74 65 5f 74 65 73 74 5f 63  :  sqlite_test_c
6620: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 44  reate_function D
6630: 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65  B.**.** Call the
6640: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6650: 66 75 6e 63 74 69 6f 6e 20 41 50 49 20 6f 6e 20  function API on 
6660: 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62 61  the given databa
6670: 73 65 20 69 6e 20 6f 72 64 65 72 0a 2a 2a 20 74  se in order.** t
6680: 6f 20 63 72 65 61 74 65 20 61 20 66 75 6e 63 74  o create a funct
6690: 69 6f 6e 20 6e 61 6d 65 64 20 22 78 5f 63 6f 61  ion named "x_coa
66a0: 6c 65 73 63 65 22 2e 20 20 54 68 69 73 20 66 75  lesce".  This fu
66b0: 6e 63 74 69 6f 6e 20 64 6f 65 73 20 74 68 65 20  nction does the 
66c0: 73 61 6d 65 20 74 68 69 6e 67 0a 2a 2a 20 61 73  same thing.** as
66d0: 20 74 68 65 20 22 63 6f 61 6c 65 73 63 65 22 20   the "coalesce" 
66e0: 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 69 73 20  function.  This 
66f0: 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 72 65  function also re
6700: 67 69 73 74 65 72 73 20 61 6e 20 53 51 4c 20 66  gisters an SQL f
6710: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6e 61 6d 65 64  unction.** named
6720: 20 22 78 5f 73 71 6c 69 74 65 5f 65 78 65 63 22   "x_sqlite_exec"
6730: 20 74 68 61 74 20 69 6e 76 6f 6b 65 73 20 73 71   that invokes sq
6740: 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 20 20 49  lite3_exec().  I
6750: 6e 76 6f 6b 69 6e 67 20 73 71 6c 69 74 65 33 5f  nvoking sqlite3_
6760: 65 78 65 63 28 29 0a 2a 2a 20 69 6e 20 74 68 69  exec().** in thi
6770: 73 20 77 61 79 20 69 73 20 69 6c 6c 65 67 61 6c  s way is illegal
6780: 20 72 65 63 75 72 73 69 6f 6e 20 61 6e 64 20 73   recursion and s
6790: 68 6f 75 6c 64 20 72 61 69 73 65 20 61 6e 20 53  hould raise an S
67a0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 65 72 72  QLITE_MISUSE err
67b0: 6f 72 2e 0a 2a 2a 20 54 68 65 20 65 66 66 65 63  or..** The effec
67c0: 74 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20  t is similar to 
67d0: 74 72 79 69 6e 67 20 74 6f 20 75 73 65 20 74 68  trying to use th
67e0: 65 20 73 61 6d 65 20 64 61 74 61 62 61 73 65 20  e same database 
67f0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 72 6f 6d 0a  connection from.
6800: 2a 2a 20 74 77 6f 20 74 68 72 65 61 64 73 20 61  ** two threads a
6810: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
6820: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67 69  .**.** The origi
6830: 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20 66  nal motivation f
6840: 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  or this routine 
6850: 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20 74  was to be able t
6860: 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73 71  o call the.** sq
6870: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6880: 63 74 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 77  ction function w
6890: 68 69 6c 65 20 61 20 71 75 65 72 79 20 69 73 20  hile a query is 
68a0: 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e 20 6f  in progress in o
68b0: 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73 74 20  rder.** to test 
68c0: 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  the SQLITE_MISUS
68d0: 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f 67 69  E detection logi
68e0: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
68f0: 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e   test_create_fun
6900: 63 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a 4e  ction(.  void *N
6910: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
6920: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
6930: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
6940: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
6950: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
6960: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
6980: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
6990: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
69a0: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
69b0: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
69c0: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
69d0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
69e0: 74 65 33 20 2a 64 62 3b 0a 0a 20 20 69 66 28 20  te3 *db;..  if( 
69f0: 61 72 67 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  argc!=2 ){.    T
6a00: 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
6a10: 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
6a20: 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
6a30: 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20   \"", argv[0],. 
6a40: 20 20 20 20 20 20 22 20 44 42 5c 22 22 2c 20 30        " DB\"", 0
6a50: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
6a60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
6a70: 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
6a80: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c  interp, argv[1],
6a90: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
6aa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
6ab0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
6ac0: 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f  function(db, "x_
6ad0: 63 6f 61 6c 65 73 63 65 22 2c 20 2d 31 2c 20 53  coalesce", -1, S
6ae0: 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20 0a 20  QLITE_ANY, 0, . 
6af0: 20 20 20 20 20 20 20 74 31 5f 69 66 6e 75 6c 6c         t1_ifnull
6b00: 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 69  Func, 0, 0);.  i
6b10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6b20: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
6b30: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6b40: 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 38 22 2c  tion(db, "hex8",
6b50: 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20   1, SQLITE_ANY, 
6b60: 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 68 65  0, .          he
6b70: 78 38 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  x8Func, 0, 0);. 
6b80: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6b90: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 69  E_OMIT_UTF16.  i
6ba0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
6bb0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
6bc0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6bd0: 74 69 6f 6e 28 64 62 2c 20 22 68 65 78 31 36 22  tion(db, "hex16"
6be0: 2c 20 31 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 1, SQLITE_ANY,
6bf0: 20 30 2c 20 0a 20 20 20 20 20 20 20 20 20 20 68   0, .          h
6c00: 65 78 31 36 46 75 6e 63 2c 20 30 2c 20 30 29 3b  ex16Func, 0, 0);
6c10: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 69 66  .  }.#endif.  if
6c20: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6c30: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
6c40: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
6c50: 69 6f 6e 28 64 62 2c 20 22 74 6b 74 32 32 31 33  ion(db, "tkt2213
6c60: 66 75 6e 63 22 2c 20 31 2c 20 53 51 4c 49 54 45  func", 1, SQLITE
6c70: 5f 41 4e 59 2c 20 30 2c 20 0a 20 20 20 20 20 20  _ANY, 0, .      
6c80: 20 20 20 20 74 6b 74 32 32 31 33 46 75 6e 63 74      tkt2213Funct
6c90: 69 6f 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  ion, 0, 0);.  }.
6ca0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
6cb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
6cc0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
6cd0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 70 6f 69  unction(db, "poi
6ce0: 6e 74 65 72 5f 63 68 61 6e 67 65 22 2c 20 34 2c  nter_change", 4,
6cf0: 20 53 51 4c 49 54 45 5f 41 4e 59 2c 20 30 2c 20   SQLITE_ANY, 0, 
6d00: 0a 20 20 20 20 20 20 20 20 20 20 70 74 72 43 68  .          ptrCh
6d10: 6e 67 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30  ngFunction, 0, 0
6d20: 29 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  );.  }..#ifndef 
6d30: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
6d40: 36 0a 20 20 2f 2a 20 55 73 65 20 74 68 65 20 73  6.  /* Use the s
6d50: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
6d60: 6e 63 74 69 6f 6e 31 36 28 29 20 41 50 49 20 68  nction16() API h
6d70: 65 72 65 2e 20 4d 61 69 6e 6c 79 20 66 6f 72 20  ere. Mainly for 
6d80: 66 75 6e 2c 20 62 75 74 20 61 6c 73 6f 20 0a 20  fun, but also . 
6d90: 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20 69   ** because it i
6da0: 73 20 6e 6f 74 20 74 65 73 74 65 64 20 61 6e 79  s not tested any
6db0: 77 68 65 72 65 20 65 6c 73 65 2e 20 2a 2f 0a 20  where else. */. 
6dc0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6dd0: 4f 4b 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OK ){.    const 
6de0: 76 6f 69 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20  void *zUtf16;.  
6df0: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
6e00: 2a 70 56 61 6c 3b 0a 20 20 20 20 73 71 6c 69 74  *pVal;.    sqlit
6e10: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
6e20: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 70  b->mutex);.    p
6e30: 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
6e40: 75 65 4e 65 77 28 64 62 29 3b 0a 20 20 20 20 73  ueNew(db);.    s
6e50: 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
6e60: 72 28 70 56 61 6c 2c 20 2d 31 2c 20 22 78 5f 73  r(pVal, -1, "x_s
6e70: 71 6c 69 74 65 5f 65 78 65 63 22 2c 20 53 51 4c  qlite_exec", SQL
6e80: 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45  ITE_UTF8, SQLITE
6e90: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a 55  _STATIC);.    zU
6ea0: 74 66 31 36 20 3d 20 73 71 6c 69 74 65 33 56 61  tf16 = sqlite3Va
6eb0: 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
6ec0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
6ed0: 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
6ee0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
6ef0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6f00: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
6f10: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  e{.      rc = sq
6f20: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6f30: 63 74 69 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66  ction16(db, zUtf
6f40: 31 36 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  16, .           
6f50: 20 20 20 20 20 31 2c 20 53 51 4c 49 54 45 5f 55       1, SQLITE_U
6f60: 54 46 31 36 2c 20 64 62 2c 20 73 71 6c 69 74 65  TF16, db, sqlite
6f70: 33 45 78 65 63 46 75 6e 63 2c 20 30 2c 20 30 29  3ExecFunc, 0, 0)
6f80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
6f90: 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
6fa0: 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
6fb0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
6fc0: 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64  mutex);.  }.#end
6fd0: 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65  if..  if( sqlite
6fe0: 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
6ff0: 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
7000: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
7010: 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
7020: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
7030: 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
7040: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  , 0);.  return T
7050: 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
7060: 52 6f 75 74 69 6e 65 73 20 74 6f 20 69 6d 70 6c  Routines to impl
7070: 65 6d 65 6e 74 20 74 68 65 20 78 5f 63 6f 75 6e  ement the x_coun
7080: 74 28 29 20 61 67 67 72 65 67 61 74 65 20 66 75  t() aggregate fu
7090: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 78 5f  nction..**.** x_
70a0: 63 6f 75 6e 74 28 29 20 63 6f 75 6e 74 73 20 74  count() counts t
70b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 6e 6f 6e  he number of non
70c0: 2d 6e 75 6c 6c 20 61 72 67 75 6d 65 6e 74 73 2e  -null arguments.
70d0: 20 20 42 75 74 20 74 68 65 72 65 20 61 72 65 0a    But there are.
70e0: 2a 2a 20 73 6f 6d 65 20 74 77 69 73 74 73 20 66  ** some twists f
70f0: 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
7100: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ses..**.** If th
7110: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 5f  e argument to x_
7120: 63 6f 75 6e 74 28 29 20 69 73 20 34 30 20 74 68  count() is 40 th
7130: 65 6e 20 61 20 55 54 46 2d 38 20 65 72 72 6f 72  en a UTF-8 error
7140: 20 69 73 20 72 65 70 6f 72 74 65 64 0a 2a 2a 20   is reported.** 
7150: 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75 6e 63  on the step func
7160: 74 69 6f 6e 2e 20 20 49 66 20 78 5f 63 6f 75 6e  tion.  If x_coun
7170: 74 28 34 31 29 20 69 73 20 73 65 65 6e 2c 20 74  t(41) is seen, t
7180: 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65 72 72  hen a UTF-16 err
7190: 6f 72 0a 2a 2a 20 69 73 20 72 65 70 6f 72 74 65  or.** is reporte
71a0: 64 20 6f 6e 20 74 68 65 20 73 74 65 70 20 66 75  d on the step fu
71b0: 6e 63 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20  nction.  If the 
71c0: 74 6f 74 61 6c 20 63 6f 75 6e 74 20 69 73 20 34  total count is 4
71d0: 32 2c 20 74 68 65 6e 0a 2a 2a 20 61 20 55 54 46  2, then.** a UTF
71e0: 2d 38 20 65 72 72 6f 72 20 69 73 20 72 65 70 6f  -8 error is repo
71f0: 72 74 65 64 20 6f 6e 20 74 68 65 20 66 69 6e 61  rted on the fina
7200: 6c 69 7a 65 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  lize function..*
7210: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
7220: 20 74 31 43 6f 75 6e 74 43 74 78 20 74 31 43 6f   t1CountCtx t1Co
7230: 75 6e 74 43 74 78 3b 0a 73 74 72 75 63 74 20 74  untCtx;.struct t
7240: 31 43 6f 75 6e 74 43 74 78 20 7b 0a 20 20 69 6e  1CountCtx {.  in
7250: 74 20 6e 3b 0a 7d 3b 0a 73 74 61 74 69 63 20 76  t n;.};.static v
7260: 6f 69 64 20 74 31 43 6f 75 6e 74 53 74 65 70 28  oid t1CountStep(
7270: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
7280: 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69  xt *context,.  i
7290: 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c 69 74  nt argc,.  sqlit
72a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a  e3_value **argv.
72b0: 29 7b 0a 20 20 74 31 43 6f 75 6e 74 43 74 78 20  ){.  t1CountCtx 
72c0: 2a 70 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65  *p;.  p = sqlite
72d0: 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f 6e 74  3_aggregate_cont
72e0: 65 78 74 28 63 6f 6e 74 65 78 74 2c 20 73 69 7a  ext(context, siz
72f0: 65 6f 66 28 2a 70 29 29 3b 0a 20 20 69 66 28 20  eof(*p));.  if( 
7300: 28 61 72 67 63 3d 3d 30 20 7c 7c 20 53 51 4c 49  (argc==0 || SQLI
7310: 54 45 5f 4e 55 4c 4c 21 3d 73 71 6c 69 74 65 33  TE_NULL!=sqlite3
7320: 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72 67 76  _value_type(argv
7330: 5b 30 5d 29 20 29 20 26 26 20 70 20 29 7b 0a 20  [0]) ) && p ){. 
7340: 20 20 20 70 2d 3e 6e 2b 2b 3b 0a 20 20 7d 0a 20     p->n++;.  }. 
7350: 20 69 66 28 20 61 72 67 63 3e 30 20 29 7b 0a 20   if( argc>0 ){. 
7360: 20 20 20 69 6e 74 20 76 20 3d 20 73 71 6c 69 74     int v = sqlit
7370: 65 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67  e3_value_int(arg
7380: 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20 76  v[0]);.    if( v
7390: 3d 3d 34 30 20 29 7b 0a 20 20 20 20 20 20 73 71  ==40 ){.      sq
73a0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
73b0: 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 76 61 6c  or(context, "val
73c0: 75 65 20 6f 66 20 34 30 20 68 61 6e 64 65 64 20  ue of 40 handed 
73d0: 74 6f 20 78 5f 63 6f 75 6e 74 22 2c 20 2d 31 29  to x_count", -1)
73e0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
73f0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 20 20  _OMIT_UTF16.    
7400: 7d 65 6c 73 65 20 69 66 28 20 76 3d 3d 34 31 20  }else if( v==41 
7410: 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
7420: 68 61 72 20 7a 55 74 66 31 36 45 72 72 4d 73 67  har zUtf16ErrMsg
7430: 5b 5d 20 3d 20 7b 20 30 2c 20 30 78 36 31 2c 20  [] = { 0, 0x61, 
7440: 30 2c 20 30 78 36 32 2c 20 30 2c 20 30 78 36 33  0, 0x62, 0, 0x63
7450: 2c 20 30 2c 20 30 2c 20 30 7d 3b 0a 20 20 20 20  , 0, 0, 0};.    
7460: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
7470: 5f 65 72 72 6f 72 31 36 28 63 6f 6e 74 65 78 74  _error16(context
7480: 2c 20 26 7a 55 74 66 31 36 45 72 72 4d 73 67 5b  , &zUtf16ErrMsg[
7490: 31 2d 53 51 4c 49 54 45 5f 42 49 47 45 4e 44 49  1-SQLITE_BIGENDI
74a0: 41 4e 5d 2c 20 2d 31 29 3b 0a 23 65 6e 64 69 66  AN], -1);.#endif
74b0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 20 20 20 0a  .    }.  }.}   .
74c0: 73 74 61 74 69 63 20 76 6f 69 64 20 74 31 43 6f  static void t1Co
74d0: 75 6e 74 46 69 6e 61 6c 69 7a 65 28 73 71 6c 69  untFinalize(sqli
74e0: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e  te3_context *con
74f0: 74 65 78 74 29 7b 0a 20 20 74 31 43 6f 75 6e 74  text){.  t1Count
7500: 43 74 78 20 2a 70 3b 0a 20 20 70 20 3d 20 73 71  Ctx *p;.  p = sq
7510: 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f  lite3_aggregate_
7520: 63 6f 6e 74 65 78 74 28 63 6f 6e 74 65 78 74 2c  context(context,
7530: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 20 20   sizeof(*p));.  
7540: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
7550: 20 70 2d 3e 6e 3d 3d 34 32 20 29 7b 0a 20 20 20   p->n==42 ){.   
7560: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
7570: 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c  t_error(context,
7580: 20 22 78 5f 63 6f 75 6e 74 20 74 6f 74 61 6c 73   "x_count totals
7590: 20 74 6f 20 34 32 22 2c 20 2d 31 29 3b 0a 20 20   to 42", -1);.  
75a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
75b0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e  qlite3_result_in
75c0: 74 28 63 6f 6e 74 65 78 74 2c 20 70 20 3f 20 70  t(context, p ? p
75d0: 2d 3e 6e 20 3a 20 30 29 3b 0a 20 20 20 20 7d 0a  ->n : 0);.    }.
75e0: 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53    }.}..#ifndef S
75f0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
7600: 43 41 54 45 44 0a 73 74 61 74 69 63 20 76 6f 69  CATED.static voi
7610: 64 20 6c 65 67 61 63 79 43 6f 75 6e 74 53 74 65  d legacyCountSte
7620: 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e  p(.  sqlite3_con
7630: 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 2c 0a 20  text *context,. 
7640: 20 69 6e 74 20 61 72 67 63 2c 0a 20 20 73 71 6c   int argc,.  sql
7650: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 72 67  ite3_value **arg
7660: 76 0a 29 7b 0a 20 20 2f 2a 20 6e 6f 2d 6f 70 20  v.){.  /* no-op 
7670: 2a 2f 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69  */.}..static voi
7680: 64 20 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e  d legacyCountFin
7690: 61 6c 69 7a 65 28 73 71 6c 69 74 65 33 5f 63 6f  alize(sqlite3_co
76a0: 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74 29 7b  ntext *context){
76b0: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
76c0: 74 5f 69 6e 74 28 63 6f 6e 74 65 78 74 2c 20 73  t_int(context, s
76d0: 71 6c 69 74 65 33 5f 61 67 67 72 65 67 61 74 65  qlite3_aggregate
76e0: 5f 63 6f 75 6e 74 28 63 6f 6e 74 65 78 74 29 29  _count(context))
76f0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
7700: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
7710: 33 5f 63 72 65 61 74 65 5f 61 67 67 72 65 67 61  3_create_aggrega
7720: 74 65 20 44 42 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  te DB.**.** Call
7730: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 63 72 65   the sqlite3_cre
7740: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 20 41 50 49  ate_function API
7750: 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 64 61   on the given da
7760: 74 61 62 61 73 65 20 69 6e 20 6f 72 64 65 72 0a  tabase in order.
7770: 2a 2a 20 74 6f 20 63 72 65 61 74 65 20 61 20 66  ** to create a f
7780: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20 22 78  unction named "x
7790: 5f 63 6f 75 6e 74 22 2e 20 20 54 68 69 73 20 66  _count".  This f
77a0: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
77b0: 61 72 0a 2a 2a 20 74 6f 20 74 68 65 20 62 75 69  ar.** to the bui
77c0: 6c 74 2d 69 6e 20 63 6f 75 6e 74 28 29 20 66 75  lt-in count() fu
77d0: 6e 63 74 69 6f 6e 2c 20 77 69 74 68 20 61 20 66  nction, with a f
77e0: 65 77 20 73 70 65 63 69 61 6c 20 71 75 69 72 6b  ew special quirk
77f0: 73 0a 2a 2a 20 66 6f 72 20 74 65 73 74 69 6e 67  s.** for testing
7800: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 72 65 73   the sqlite3_res
7810: 75 6c 74 5f 65 72 72 6f 72 28 29 20 41 50 49 73  ult_error() APIs
7820: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 72 69 67  ..**.** The orig
7830: 69 6e 61 6c 20 6d 6f 74 69 76 61 74 69 6f 6e 20  inal motivation 
7840: 66 6f 72 20 74 68 69 73 20 72 6f 75 74 69 6e 65  for this routine
7850: 20 77 61 73 20 74 6f 20 62 65 20 61 62 6c 65 20   was to be able 
7860: 74 6f 20 63 61 6c 6c 20 74 68 65 0a 2a 2a 20 73  to call the.** s
7870: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 61 67  qlite3_create_ag
7880: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
7890: 20 77 68 69 6c 65 20 61 20 71 75 65 72 79 20 69   while a query i
78a0: 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 69 6e  s in progress in
78b0: 20 6f 72 64 65 72 0a 2a 2a 20 74 6f 20 74 65 73   order.** to tes
78c0: 74 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 49 53  t the SQLITE_MIS
78d0: 55 53 45 20 64 65 74 65 63 74 69 6f 6e 20 6c 6f  USE detection lo
78e0: 67 69 63 2e 20 20 53 65 65 20 6d 69 73 75 73 65  gic.  See misuse
78f0: 2e 74 65 73 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  .test..**.** Thi
7900: 73 20 72 6f 75 74 69 6e 65 20 77 61 73 20 6c 61  s routine was la
7910: 74 65 72 20 65 78 74 65 6e 64 65 64 20 74 6f 20  ter extended to 
7920: 74 65 73 74 20 74 68 65 20 75 73 65 20 6f 66 20  test the use of 
7930: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
7940: 72 72 6f 72 28 29 0a 2a 2a 20 77 69 74 68 69 6e  rror().** within
7950: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
7960: 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 4c 61 74 65  ions..**.** Late
7970: 72 3a 20 49 74 20 69 73 20 6e 6f 77 20 61 6c 73  r: It is now als
7980: 6f 20 65 78 74 65 6e 64 65 64 20 74 6f 20 72 65  o extended to re
7990: 67 69 73 74 65 72 20 74 68 65 20 61 67 67 72 65  gister the aggre
79a0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
79b0: 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74 28 29   "legacy_count()
79c0: 22 20 77 69 74 68 20 74 68 65 20 73 75 70 70 6c  " with the suppl
79d0: 69 65 64 20 64 61 74 61 62 61 73 65 20 68 61 6e  ied database han
79e0: 64 6c 65 2e 20 54 68 69 73 20 69 73 20 75 73 65  dle. This is use
79f0: 64 0a 2a 2a 20 74 6f 20 74 65 73 74 20 74 68 65  d.** to test the
7a00: 20 64 65 70 72 65 63 61 74 65 64 20 73 71 6c 69   deprecated sqli
7a10: 74 65 33 5f 61 67 67 72 65 67 61 74 65 5f 63 6f  te3_aggregate_co
7a20: 75 6e 74 28 29 20 41 50 49 2e 0a 2a 2f 0a 73 74  unt() API..*/.st
7a30: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 72  atic int test_cr
7a40: 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 28 0a  eate_aggregate(.
7a50: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
7a60: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
7a70: 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
7a80: 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
7a90: 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
7aa0: 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
7ab0: 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20  int argc,       
7ac0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
7ad0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
7ae0: 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20  .  char **argv  
7af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78            /* Tex
7b00: 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65  t of each argume
7b10: 6e 74 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  nt */.){.  sqlit
7b20: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
7b30: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
7b40: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
7b50: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
7b60: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
7b70: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
7b80: 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20  gv[0],.       " 
7b90: 46 49 4c 45 4e 41 4d 45 5c 22 22 2c 20 30 29 3b  FILENAME\"", 0);
7ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
7bb0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
7bc0: 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
7bd0: 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26  terp, argv[1], &
7be0: 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  db) ) return TCL
7bf0: 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
7c00: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
7c10: 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63 6f  nction(db, "x_co
7c20: 75 6e 74 22 2c 20 30 2c 20 53 51 4c 49 54 45 5f  unt", 0, SQLITE_
7c30: 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20 20  UTF8, 0, 0,.    
7c40: 20 20 74 31 43 6f 75 6e 74 53 74 65 70 2c 74 31    t1CountStep,t1
7c50: 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65 29 3b 0a  CountFinalize);.
7c60: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7c70: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
7c80: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
7c90: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 78 5f 63  unction(db, "x_c
7ca0: 6f 75 6e 74 22 2c 20 31 2c 20 53 51 4c 49 54 45  ount", 1, SQLITE
7cb0: 5f 55 54 46 38 2c 20 30 2c 20 30 2c 0a 20 20 20  _UTF8, 0, 0,.   
7cc0: 20 20 20 20 20 74 31 43 6f 75 6e 74 53 74 65 70       t1CountStep
7cd0: 2c 74 31 43 6f 75 6e 74 46 69 6e 61 6c 69 7a 65  ,t1CountFinalize
7ce0: 29 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  );.  }.#ifndef S
7cf0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
7d00: 43 41 54 45 44 0a 20 20 69 66 28 20 72 63 3d 3d  CATED.  if( rc==
7d10: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
7d20: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
7d30: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
7d40: 2c 20 22 6c 65 67 61 63 79 5f 63 6f 75 6e 74 22  , "legacy_count"
7d50: 2c 20 30 2c 20 53 51 4c 49 54 45 5f 41 4e 59 2c  , 0, SQLITE_ANY,
7d60: 20 30 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 6c   0, 0,.        l
7d70: 65 67 61 63 79 43 6f 75 6e 74 53 74 65 70 2c 20  egacyCountStep, 
7d80: 6c 65 67 61 63 79 43 6f 75 6e 74 46 69 6e 61 6c  legacyCountFinal
7d90: 69 7a 65 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 23  ize.    );.  }.#
7da0: 65 6e 64 69 66 0a 20 20 69 66 28 20 73 71 6c 69  endif.  if( sqli
7db0: 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
7dc0: 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
7dd0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
7de0: 52 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75  R;.  Tcl_SetResu
7df0: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
7e00: 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72   *)t1ErrorName(r
7e10: 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  c), 0);.  return
7e20: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a   TCL_OK;.}.../*.
7e30: 2a 2a 20 55 73 61 67 65 3a 20 20 70 72 69 6e 74  ** Usage:  print
7e40: 66 20 54 45 58 54 0a 2a 2a 0a 2a 2a 20 53 65 6e  f TEXT.**.** Sen
7e50: 64 20 6f 75 74 70 75 74 20 74 6f 20 70 72 69 6e  d output to prin
7e60: 74 66 2e 20 20 55 73 65 20 74 68 69 73 20 72 61  tf.  Use this ra
7e70: 74 68 65 72 20 74 68 61 6e 20 70 75 74 73 20 74  ther than puts t
7e80: 6f 20 6d 65 72 67 65 20 74 68 65 20 6f 75 74 70  o merge the outp
7e90: 75 74 0a 2a 2a 20 69 6e 20 74 68 65 20 63 6f 72  ut.** in the cor
7ea0: 72 65 63 74 20 73 65 71 75 65 6e 63 65 20 77 69  rect sequence wi
7eb0: 74 68 20 64 65 62 75 67 67 69 6e 67 20 70 72 69  th debugging pri
7ec0: 6e 74 66 73 20 69 6e 73 65 72 74 65 64 20 69 6e  ntfs inserted in
7ed0: 74 6f 20 43 20 63 6f 64 65 2e 0a 2a 2a 20 50 75  to C code..** Pu
7ee0: 74 73 20 75 73 65 73 20 61 20 73 65 70 61 72 61  ts uses a separa
7ef0: 74 65 20 62 75 66 66 65 72 20 61 6e 64 20 64 65  te buffer and de
7f00: 62 75 67 67 69 6e 67 20 73 74 61 74 65 6d 65 6e  bugging statemen
7f10: 74 73 20 77 69 6c 6c 20 62 65 20 6f 75 74 20 6f  ts will be out o
7f20: 66 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 66  f.** sequence if
7f30: 20 69 74 20 69 73 20 75 73 65 64 2e 0a 2a 2f 0a   it is used..*/.
7f40: 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
7f50: 70 72 69 6e 74 66 28 0a 20 20 76 6f 69 64 20 2a  printf(.  void *
7f60: 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49  NotUsed,.  Tcl_I
7f70: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
7f80: 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
7f90: 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
7fa0: 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
7fb0: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63  nd */.  int argc
7fc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
7fd0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
7fe0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20  ments */.  char 
7ff0: 2a 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20  **argv          
8000: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
8010: 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b  h argument */.){
8020: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
8030: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
8040: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
8050: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
8060: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
8070: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 54  v[0],.       " T
8080: 45 58 54 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20  EXT\"", 0);.    
8090: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
80a0: 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 28 22  ;.  }.  printf("
80b0: 25 73 5c 6e 22 2c 20 61 72 67 76 5b 31 5d 29 3b  %s\n", argv[1]);
80c0: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
80d0: 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  ;.}..../*.** Usa
80e0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
80f0: 69 6e 74 66 5f 69 6e 74 20 46 4f 52 4d 41 54 20  intf_int FORMAT 
8100: 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45 52 20  INTEGER INTEGER 
8110: 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20 43 61  INTEGER.**.** Ca
8120: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
8130: 74 68 72 65 65 20 69 6e 74 65 67 65 72 20 61 72  three integer ar
8140: 67 75 6d 65 6e 74 73 0a 2a 2f 0a 73 74 61 74 69  guments.*/.stati
8150: 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70  c int sqlite3_mp
8160: 72 69 6e 74 66 5f 69 6e 74 28 0a 20 20 76 6f 69  rintf_int(.  voi
8170: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54 63  d *NotUsed,.  Tc
8180: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
8190: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
81a0: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
81b0: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
81c0: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 61  mmand */.  int a
81d0: 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  rgc,            
81e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
81f0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68  rguments */.  ch
8200: 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20 20  ar **argv       
8210: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20       /* Text of 
8220: 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a 2f  each argument */
8230: 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c 20  .){.  int a[3], 
8240: 69 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  i;.  char *z;.  
8250: 69 66 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20  if( argc!=5 ){. 
8260: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
8270: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
8280: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
8290: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
82a0: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
82b0: 41 54 20 49 4e 54 20 49 4e 54 20 49 4e 54 5c 22  AT INT INT INT\"
82c0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
82d0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
82e0: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 35 3b  .  for(i=2; i<5;
82f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
8300: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
8310: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
8320: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
8330: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 20  _ERROR;.  }.  z 
8340: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8350: 66 28 61 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c  f(argv[1], a[0],
8360: 20 61 5b 31 5d 2c 20 61 5b 32 5d 29 3b 0a 20 20   a[1], a[2]);.  
8370: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
8380: 28 69 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a  (interp, z, 0);.
8390: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
83a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
83b0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
83c0: 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72  ge:  sqlite3_mpr
83d0: 69 6e 74 66 5f 69 6e 74 36 34 20 46 4f 52 4d 41  intf_int64 FORMA
83e0: 54 20 49 4e 54 45 47 45 52 20 49 4e 54 45 47 45  T INTEGER INTEGE
83f0: 52 20 49 4e 54 45 47 45 52 0a 2a 2a 0a 2a 2a 20  R INTEGER.**.** 
8400: 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74  Call mprintf wit
8410: 68 20 74 68 72 65 65 20 36 34 2d 62 69 74 20 69  h three 64-bit i
8420: 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e 74 73  nteger arguments
8430: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
8440: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69  qlite3_mprintf_i
8450: 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  nt64(.  void *No
8460: 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74  tUsed,.  Tcl_Int
8470: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
8480: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
8490: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
84a0: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
84b0: 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20   */.  int argc, 
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84d0: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
84e0: 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  nts */.  char **
84f0: 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20  argv            
8500: 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20  /* Text of each 
8510: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
8520: 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
8530: 5f 69 6e 74 36 34 20 61 5b 33 5d 3b 0a 20 20 63  _int64 a[3];.  c
8540: 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72  har *z;.  if( ar
8550: 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63 6c  gc!=5 ){.    Tcl
8560: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8570: 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
8580: 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
8590: 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20  "", argv[0],.   
85a0: 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e 54      " FORMAT INT
85b0: 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29 3b   INT INT\"", 0);
85c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
85d0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
85e0: 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29 7b  (i=2; i<5; i++){
85f0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
8600: 41 74 6f 69 36 34 28 61 72 67 76 5b 69 5d 2c 20  Atoi64(argv[i], 
8610: 26 61 5b 69 2d 32 5d 2c 20 31 30 30 30 30 30 30  &a[i-2], 1000000
8620: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 20 29  , SQLITE_UTF8) )
8630: 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65  {.      Tcl_Appe
8640: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8650: 20 22 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f   "argument is no
8660: 74 20 61 20 76 61 6c 69 64 20 36 34 2d 62 69 74  t a valid 64-bit
8670: 20 69 6e 74 65 67 65 72 22 2c 20 30 29 3b 0a 20   integer", 0);. 
8680: 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
8690: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
86a0: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
86b0: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
86c0: 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d  a[0], a[1], a[2]
86d0: 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  );.  Tcl_AppendR
86e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c  esult(interp, z,
86f0: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
8700: 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e  ree(z);.  return
8710: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
8720: 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65  * Usage:  sqlite
8730: 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 20 46  3_mprintf_long F
8740: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
8750: 54 45 47 45 52 20 49 4e 54 45 47 45 52 0a 2a 2a  TEGER INTEGER.**
8760: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8770: 20 77 69 74 68 20 74 68 72 65 65 20 6c 6f 6e 67   with three long
8780: 20 69 6e 74 65 67 65 72 20 61 72 67 75 6d 65 6e   integer argumen
8790: 74 73 2e 20 20 20 54 68 69 73 20 6d 69 67 68 74  ts.   This might
87a0: 20 62 65 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20   be the.** same 
87b0: 61 73 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  as sqlite3_mprin
87c0: 74 66 5f 69 6e 74 20 6f 72 20 73 71 6c 69 74 65  tf_int or sqlite
87d0: 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36 34 2c  3_mprintf_int64,
87e0: 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 0a 2a 2a   depending on.**
87f0: 20 70 6c 61 74 66 6f 72 6d 2e 0a 2a 2f 0a 73 74   platform..*/.st
8800: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33  atic int sqlite3
8810: 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67 28 0a 20  _mprintf_long(. 
8820: 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a   void *NotUsed,.
8830: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8840: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
8850: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
8860: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
8870: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
8880: 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20  nt argc,        
8890: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
88a0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
88b0: 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20    char **argv   
88c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74           /* Text
88d0: 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e   of each argumen
88e0: 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  t */.){.  int i;
88f0: 0a 20 20 6c 6f 6e 67 20 69 6e 74 20 61 5b 33 5d  .  long int a[3]
8900: 3b 0a 20 20 69 6e 74 20 62 5b 33 5d 3b 0a 20 20  ;.  int b[3];.  
8910: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 61  char *z;.  if( a
8920: 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20 54 63  rgc!=5 ){.    Tc
8930: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
8940: 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
8950: 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
8960: 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a 20 20  \"", argv[0],.  
8970: 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20 49 4e       " FORMAT IN
8980: 54 20 49 4e 54 20 49 4e 54 5c 22 22 2c 20 30 29  T INT INT\"", 0)
8990: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
89a0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f  _ERROR;.  }.  fo
89b0: 72 28 69 3d 32 3b 20 69 3c 35 3b 20 69 2b 2b 29  r(i=2; i<5; i++)
89c0: 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65  {.    if( Tcl_Ge
89d0: 74 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67  tInt(interp, arg
89e0: 76 5b 69 5d 2c 20 26 62 5b 69 2d 32 5d 29 20 29  v[i], &b[i-2]) )
89f0: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
8a00: 52 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20 3d 20  R;.    a[i-2] = 
8a10: 28 6c 6f 6e 67 20 69 6e 74 29 62 5b 69 2d 32 5d  (long int)b[i-2]
8a20: 3b 0a 20 20 20 20 61 5b 69 2d 32 5d 20 26 3d 20  ;.    a[i-2] &= 
8a30: 28 28 28 75 36 34 29 31 29 3c 3c 28 73 69 7a 65  (((u64)1)<<(size
8a40: 6f 66 28 69 6e 74 29 2a 38 29 29 2d 31 3b 0a 20  of(int)*8))-1;. 
8a50: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
8a60: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
8a70: 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b  , a[0], a[1], a[
8a80: 32 5d 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e  2]);.  Tcl_Appen
8a90: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
8aa0: 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  z, 0);.  sqlite3
8ab0: 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75  _free(z);.  retu
8ac0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
8ad0: 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
8ae0: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
8af0: 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49  FORMAT INTEGER I
8b00: 4e 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a  NTEGER STRING.**
8b10: 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66  .** Call mprintf
8b20: 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65   with two intege
8b30: 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  r arguments and 
8b40: 6f 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d  one string argum
8b50: 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ent.*/.static in
8b60: 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  t sqlite3_mprint
8b70: 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e  f_str(.  void *N
8b80: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
8b90: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
8ba0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
8bb0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
8bc0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
8bd0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
8be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8bf0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
8c00: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
8c10: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
8c20: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
8c30: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
8c40: 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20    int a[3], i;. 
8c50: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
8c60: 61 72 67 63 3c 34 20 7c 7c 20 61 72 67 63 3e 35  argc<4 || argc>5
8c70: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
8c80: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
8c90: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
8ca0: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
8cb0: 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22  rgv[0],.       "
8cc0: 20 46 4f 52 4d 41 54 20 49 4e 54 20 49 4e 54 20   FORMAT INT INT 
8cd0: 3f 53 54 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b  ?STRING?\"", 0);
8ce0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
8cf0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 66 6f 72  ERROR;.  }.  for
8d00: 28 69 3d 32 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b  (i=2; i<4; i++){
8d10: 0a 20 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74  .    if( Tcl_Get
8d20: 49 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76  Int(interp, argv
8d30: 5b 69 5d 2c 20 26 61 5b 69 2d 32 5d 29 20 29 20  [i], &a[i-2]) ) 
8d40: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
8d50: 3b 0a 20 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69  ;.  }.  z = sqli
8d60: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
8d70: 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 2c  [1], a[0], a[1],
8d80: 20 61 72 67 63 3e 34 20 3f 20 61 72 67 76 5b 34   argc>4 ? argv[4
8d90: 5d 20 3a 20 4e 55 4c 4c 29 3b 0a 20 20 54 63 6c  ] : NULL);.  Tcl
8da0: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
8db0: 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73  terp, z, 0);.  s
8dc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
8dd0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
8de0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
8df0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
8e00: 74 66 5f 73 74 72 20 49 4e 54 45 47 45 52 20 46  tf_str INTEGER F
8e10: 4f 52 4d 41 54 20 49 4e 54 45 47 45 52 20 49 4e  ORMAT INTEGER IN
8e20: 54 45 47 45 52 20 53 54 52 49 4e 47 0a 2a 2a 0a  TEGER STRING.**.
8e30: 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20  ** Call mprintf 
8e40: 77 69 74 68 20 74 77 6f 20 69 6e 74 65 67 65 72  with two integer
8e50: 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f   arguments and o
8e60: 6e 65 20 73 74 72 69 6e 67 20 61 72 67 75 6d 65  ne string argume
8e70: 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  nt.*/.static int
8e80: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
8e90: 66 5f 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 4e  f_str(.  void *N
8ea0: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
8eb0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
8ec0: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
8ed0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
8ee0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
8ef0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
8f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
8f10: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
8f20: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
8f30: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
8f40: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
8f50: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
8f60: 20 20 69 6e 74 20 61 5b 33 5d 2c 20 69 3b 0a 20    int a[3], i;. 
8f70: 20 69 6e 74 20 6e 3b 0a 20 20 63 68 61 72 20 2a   int n;.  char *
8f80: 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 3c 35 20  z;.  if( argc<5 
8f90: 7c 7c 20 61 72 67 63 3e 36 20 29 7b 0a 20 20 20  || argc>6 ){.   
8fa0: 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
8fb0: 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
8fc0: 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
8fd0: 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
8fe0: 0a 20 20 20 20 20 20 20 22 20 49 4e 54 20 46 4f  .       " INT FO
8ff0: 52 4d 41 54 20 49 4e 54 20 49 4e 54 20 3f 53 54  RMAT INT INT ?ST
9000: 52 49 4e 47 3f 5c 22 22 2c 20 30 29 3b 0a 20 20  RING?\"", 0);.  
9010: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
9020: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63  OR;.  }.  if( Tc
9030: 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70 2c  l_GetInt(interp,
9040: 20 61 72 67 76 5b 31 5d 2c 20 26 6e 29 20 29 20   argv[1], &n) ) 
9050: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
9060: 3b 0a 20 20 69 66 28 20 6e 3c 30 20 29 7b 0a 20  ;.  if( n<0 ){. 
9070: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9080: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 4e 20 6d  ult(interp, "N m
9090: 75 73 74 20 62 65 20 6e 6f 6e 2d 6e 65 67 61 74  ust be non-negat
90a0: 69 76 65 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  ive", 0);.    re
90b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
90c0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 33 3b 20 69    }.  for(i=3; i
90d0: 3c 35 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  <5; i++){.    if
90e0: 28 20 54 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74  ( Tcl_GetInt(int
90f0: 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61  erp, argv[i], &a
9100: 5b 69 2d 33 5d 29 20 29 20 72 65 74 75 72 6e 20  [i-3]) ) return 
9110: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9120: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   z = sqlite3_mal
9130: 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 73 71  loc( n+1 );.  sq
9140: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6e  lite3_snprintf(n
9150: 2c 20 7a 2c 20 61 72 67 76 5b 32 5d 2c 20 61 5b  , z, argv[2], a[
9160: 30 5d 2c 20 61 5b 31 5d 2c 20 61 72 67 63 3e 34  0], a[1], argc>4
9170: 20 3f 20 61 72 67 76 5b 35 5d 20 3a 20 4e 55 4c   ? argv[5] : NUL
9180: 4c 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  L);.  Tcl_Append
9190: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
91a0: 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  , 0);.  sqlite3_
91b0: 66 72 65 65 28 7a 29 3b 0a 20 20 72 65 74 75 72  free(z);.  retur
91c0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
91d0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
91e0: 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62 6c  e3_mprintf_doubl
91f0: 65 20 46 4f 52 4d 41 54 20 49 4e 54 45 47 45 52  e FORMAT INTEGER
9200: 20 49 4e 54 45 47 45 52 20 44 4f 55 42 4c 45 0a   INTEGER DOUBLE.
9210: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 6d 70 72 69 6e  **.** Call mprin
9220: 74 66 20 77 69 74 68 20 74 77 6f 20 69 6e 74 65  tf with two inte
9230: 67 65 72 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  ger arguments an
9240: 64 20 6f 6e 65 20 64 6f 75 62 6c 65 20 61 72 67  d one double arg
9250: 75 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ument.*/.static 
9260: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  int sqlite3_mpri
9270: 6e 74 66 5f 64 6f 75 62 6c 65 28 0a 20 20 76 6f  ntf_double(.  vo
9280: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
9290: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
92a0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
92b0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
92c0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
92d0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
92e0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
92f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
9300: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
9310: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
9320: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
9330: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
9340: 2f 0a 29 7b 0a 20 20 69 6e 74 20 61 5b 33 5d 2c  /.){.  int a[3],
9350: 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 3b 0a   i;.  double r;.
9360: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28    char *z;.  if(
9370: 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20 20   argc!=5 ){.    
9380: 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
9390: 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
93a0: 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
93b0: 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 0a  e \"", argv[0],.
93c0: 20 20 20 20 20 20 20 22 20 46 4f 52 4d 41 54 20         " FORMAT 
93d0: 49 4e 54 20 49 4e 54 20 44 4f 55 42 4c 45 5c 22  INT INT DOUBLE\"
93e0: 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
93f0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9400: 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 34 3b  .  for(i=2; i<4;
9410: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 54   i++){.    if( T
9420: 63 6c 5f 47 65 74 49 6e 74 28 69 6e 74 65 72 70  cl_GetInt(interp
9430: 2c 20 61 72 67 76 5b 69 5d 2c 20 26 61 5b 69 2d  , argv[i], &a[i-
9440: 32 5d 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  2]) ) return TCL
9450: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
9460: 28 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28  ( Tcl_GetDouble(
9470: 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 34 5d 2c  interp, argv[4],
9480: 20 26 72 29 20 29 20 72 65 74 75 72 6e 20 54 43   &r) ) return TC
9490: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 20 3d 20 73  L_ERROR;.  z = s
94a0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
94b0: 72 67 76 5b 31 5d 2c 20 61 5b 30 5d 2c 20 61 5b  rgv[1], a[0], a[
94c0: 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41 70  1], r);.  Tcl_Ap
94d0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
94e0: 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c 69  p, z, 0);.  sqli
94f0: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 72  te3_free(z);.  r
9500: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
9510: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
9520: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73  qlite3_mprintf_s
9530: 63 61 6c 65 64 20 46 4f 52 4d 41 54 20 44 4f 55  caled FORMAT DOU
9540: 42 4c 45 20 44 4f 55 42 4c 45 0a 2a 2a 0a 2a 2a  BLE DOUBLE.**.**
9550: 20 43 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69   Call mprintf wi
9560: 74 68 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62  th a single doub
9570: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
9580: 68 20 69 73 20 74 68 65 20 70 72 6f 64 75 63 74  h is the product
9590: 20 6f 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61   of the.** two a
95a0: 72 67 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61  rguments given a
95b0: 62 6f 76 65 2e 20 20 54 68 69 73 20 69 73 20 75  bove.  This is u
95c0: 73 65 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20  sed to generate 
95d0: 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64  overflow and und
95e0: 65 72 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65  erflow.** double
95f0: 73 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 74  s to test that t
9600: 68 65 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65  hey are converte
9610: 64 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73  d properly..*/.s
9620: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
9630: 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c 65 64  3_mprintf_scaled
9640: 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65  (.  void *NotUse
9650: 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  d,.  Tcl_Interp 
9660: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
9670: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
9680: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
9690: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
96a0: 20 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20    int argc,     
96b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
96c0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
96d0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76  */.  char **argv
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
96f0: 65 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75  ext of each argu
9700: 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ment */.){.  int
9710: 20 69 3b 0a 20 20 64 6f 75 62 6c 65 20 72 5b 32   i;.  double r[2
9720: 5d 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  ];.  char *z;.  
9730: 69 66 28 20 61 72 67 63 21 3d 34 20 29 7b 0a 20  if( argc!=4 ){. 
9740: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
9750: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
9760: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
9770: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
9780: 5d 2c 0a 20 20 20 20 20 20 20 22 20 46 4f 52 4d  ],.       " FORM
9790: 41 54 20 44 4f 55 42 4c 45 20 44 4f 55 42 4c 45  AT DOUBLE DOUBLE
97a0: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
97b0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
97c0: 20 7d 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c   }.  for(i=2; i<
97d0: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  4; i++){.    if(
97e0: 20 54 63 6c 5f 47 65 74 44 6f 75 62 6c 65 28 69   Tcl_GetDouble(i
97f0: 6e 74 65 72 70 2c 20 61 72 67 76 5b 69 5d 2c 20  nterp, argv[i], 
9800: 26 72 5b 69 2d 32 5d 29 20 29 20 72 65 74 75 72  &r[i-2]) ) retur
9810: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
9820: 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  .  z = sqlite3_m
9830: 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d 2c 20  printf(argv[1], 
9840: 72 5b 30 5d 2a 72 5b 31 5d 29 3b 0a 20 20 54 63  r[0]*r[1]);.  Tc
9850: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9860: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9870: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
9880: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
98a0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
98b0: 74 66 5f 73 74 72 6f 6e 6c 79 20 46 4f 52 4d 41  tf_stronly FORMA
98c0: 54 20 53 54 52 49 4e 47 0a 2a 2a 0a 2a 2a 20 43  T STRING.**.** C
98d0: 61 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68  all mprintf with
98e0: 20 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65   a single double
98f0: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
9900: 69 73 20 74 68 65 20 70 72 6f 64 75 63 74 20 6f  is the product o
9910: 66 20 74 68 65 0a 2a 2a 20 74 77 6f 20 61 72 67  f the.** two arg
9920: 75 6d 65 6e 74 73 20 67 69 76 65 6e 20 61 62 6f  uments given abo
9930: 76 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  ve.  This is use
9940: 64 20 74 6f 20 67 65 6e 65 72 61 74 65 20 6f 76  d to generate ov
9950: 65 72 66 6c 6f 77 20 61 6e 64 20 75 6e 64 65 72  erflow and under
9960: 66 6c 6f 77 0a 2a 2a 20 64 6f 75 62 6c 65 73 20  flow.** doubles 
9970: 74 6f 20 74 65 73 74 20 74 68 61 74 20 74 68 65  to test that the
9980: 79 20 61 72 65 20 63 6f 6e 76 65 72 74 65 64 20  y are converted 
9990: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 73 74 61  properly..*/.sta
99a0: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  tic int sqlite3_
99b0: 6d 70 72 69 6e 74 66 5f 73 74 72 6f 6e 6c 79 28  mprintf_stronly(
99c0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
99d0: 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
99e0: 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
99f0: 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
9a00: 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
9a10: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
9a20: 20 69 6e 74 20 61 72 67 63 2c 20 20 20 20 20 20   int argc,      
9a30: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
9a40: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
9a50: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 20  /.  char **argv 
9a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65             /* Te
9a70: 78 74 20 6f 66 20 65 61 63 68 20 61 72 67 75 6d  xt of each argum
9a80: 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  ent */.){.  char
9a90: 20 2a 7a 3b 0a 20 20 69 66 28 20 61 72 67 63 21   *z;.  if( argc!
9aa0: 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70  =3 ){.    Tcl_Ap
9ab0: 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
9ac0: 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73  p, "wrong # args
9ad0: 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c  : should be \"",
9ae0: 20 61 72 67 76 5b 30 5d 2c 0a 20 20 20 20 20 20   argv[0],.      
9af0: 20 22 20 46 4f 52 4d 41 54 20 53 54 52 49 4e 47   " FORMAT STRING
9b00: 5c 22 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  \"", 0);.    ret
9b10: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
9b20: 20 7d 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33   }.  z = sqlite3
9b30: 5f 6d 70 72 69 6e 74 66 28 61 72 67 76 5b 31 5d  _mprintf(argv[1]
9b40: 2c 20 61 72 67 76 5b 32 5d 29 3b 0a 20 20 54 63  , argv[2]);.  Tc
9b50: 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
9b60: 6e 74 65 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20  nterp, z, 0);.  
9b70: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
9b80: 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
9b90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
9ba0: 3a 20 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e  :  sqlite3_mprin
9bb0: 74 66 5f 68 65 78 64 6f 75 62 6c 65 20 46 4f 52  tf_hexdouble FOR
9bc0: 4d 41 54 20 48 45 58 0a 2a 2a 0a 2a 2a 20 43 61  MAT HEX.**.** Ca
9bd0: 6c 6c 20 6d 70 72 69 6e 74 66 20 77 69 74 68 20  ll mprintf with 
9be0: 61 20 73 69 6e 67 6c 65 20 64 6f 75 62 6c 65 20  a single double 
9bf0: 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69  argument which i
9c00: 73 20 64 65 72 69 76 65 64 20 66 72 6f 6d 20 74  s derived from t
9c10: 68 65 0a 2a 2a 20 68 65 78 61 64 65 63 69 6d 61  he.** hexadecima
9c20: 6c 20 65 6e 63 6f 64 69 6e 67 20 6f 66 20 61 6e  l encoding of an
9c30: 20 49 45 45 45 20 64 6f 75 62 6c 65 2e 0a 2a 2f   IEEE double..*/
9c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
9c50: 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64  te3_mprintf_hexd
9c60: 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 4e  ouble(.  void *N
9c70: 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
9c80: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
9c90: 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
9ca0: 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
9cb0: 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
9cc0: 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
9cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
9ce0: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
9cf0: 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
9d00: 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
9d10: 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
9d20: 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
9d30: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 64 6f 75    char *z;.  dou
9d40: 62 6c 65 20 72 3b 0a 20 20 75 6e 73 69 67 6e 65  ble r;.  unsigne
9d50: 64 20 69 6e 74 20 78 31 2c 20 78 32 3b 0a 20 20  d int x1, x2;.  
9d60: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 20 64 3b  sqlite_uint64 d;
9d70: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33 20 29  .  if( argc!=3 )
9d80: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
9d90: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
9da0: 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
9db0: 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67  ould be \"", arg
9dc0: 76 5b 30 5d 2c 0a 20 20 20 20 20 20 20 22 20 46  v[0],.       " F
9dd0: 4f 52 4d 41 54 20 53 54 52 49 4e 47 5c 22 22 2c  ORMAT STRING\"",
9de0: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
9df0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
9e00: 20 69 66 28 20 73 73 63 61 6e 66 28 61 72 67 76   if( sscanf(argv
9e10: 5b 32 5d 2c 20 22 25 30 38 78 25 30 38 78 22 2c  [2], "%08x%08x",
9e20: 20 26 78 32 2c 20 26 78 31 29 21 3d 32 20 29 7b   &x2, &x1)!=2 ){
9e30: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
9e40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 32  esult(interp, "2
9e50: 6e 64 20 61 72 67 75 6d 65 6e 74 20 73 68 6f 75  nd argument shou
9e60: 6c 64 20 62 65 20 31 36 2d 63 68 61 72 61 63 74  ld be 16-charact
9e70: 65 72 73 20 6f 66 20 68 65 78 22 2c 20 30 29 3b  ers of hex", 0);
9e80: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
9e90: 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 64 20 3d  ERROR;.  }.  d =
9ea0: 20 78 32 3b 0a 20 20 64 20 3d 20 28 64 3c 3c 33   x2;.  d = (d<<3
9eb0: 32 29 20 2b 20 78 31 3b 0a 20 20 6d 65 6d 63 70  2) + x1;.  memcp
9ec0: 79 28 26 72 2c 20 26 64 2c 20 73 69 7a 65 6f 66  y(&r, &d, sizeof
9ed0: 28 72 29 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  (r));.  z = sqli
9ee0: 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 72 67 76  te3_mprintf(argv
9ef0: 5b 31 5d 2c 20 72 29 3b 0a 20 20 54 63 6c 5f 41  [1], r);.  Tcl_A
9f00: 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
9f10: 72 70 2c 20 7a 2c 20 30 29 3b 0a 20 20 73 71 6c  rp, z, 0);.  sql
9f20: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
9f30: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
9f40: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
9f50: 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 73 68  qlite3_enable_sh
9f60: 61 72 65 64 5f 63 61 63 68 65 20 3f 42 4f 4f 4c  ared_cache ?BOOL
9f70: 45 41 4e 3f 0a 2a 2a 0a 2a 2f 0a 23 69 66 20 21  EAN?.**.*/.#if !
9f80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
9f90: 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
9fa0: 29 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73  ).static int tes
9fb0: 74 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 28  t_enable_shared(
9fc0: 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
9fd0: 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69  ientData, /* Poi
9fe0: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f  nter to sqlite3_
9ff0: 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74  enable_XXX funct
a000: 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  ion */.  Tcl_Int
a010: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
a020: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
a030: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
a040: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
a050: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
a060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a070: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
a080: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
a090: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
a0a0: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
a0b0: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  ents */.){.  int
a0c0: 20 72 63 3b 0a 20 20 69 6e 74 20 65 6e 61 62 6c   rc;.  int enabl
a0d0: 65 3b 0a 20 20 69 6e 74 20 72 65 74 20 3d 20 30  e;.  int ret = 0
a0e0: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
a0f0: 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a 20   && objc!=1 ){. 
a100: 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
a110: 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
a120: 62 6a 76 2c 20 22 3f 42 4f 4f 4c 45 41 4e 3f 22  bjv, "?BOOLEAN?"
a130: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
a140: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
a150: 65 74 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  et = sqlite3Glob
a160: 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
a170: 61 63 68 65 45 6e 61 62 6c 65 64 3b 0a 0a 20 20  acheEnabled;..  
a180: 69 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20  if( objc==2 ){. 
a190: 20 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42 6f     if( Tcl_GetBo
a1a0: 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e 74  oleanFromObj(int
a1b0: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 65  erp, objv[1], &e
a1c0: 6e 61 62 6c 65 29 20 29 7b 0a 20 20 20 20 20 20  nable) ){.      
a1d0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
a1f0: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
a200: 73 68 61 72 65 64 5f 63 61 63 68 65 28 65 6e 61  shared_cache(ena
a210: 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ble);.    if( rc
a220: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
a230: 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75       Tcl_SetResu
a240: 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72  lt(interp, (char
a250: 20 2a 29 73 71 6c 69 74 65 33 45 72 72 53 74 72   *)sqlite3ErrStr
a260: 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43  (rc), TCL_STATIC
a270: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
a280: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
a290: 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
a2a0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
a2b0: 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
a2c0: 6a 28 72 65 74 29 29 3b 0a 20 20 72 65 74 75 72  j(ret));.  retur
a2d0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  n TCL_OK;.}.#end
a2e0: 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  if..../*.** Usag
a2f0: 65 3a 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  e: sqlite3_exten
a300: 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
a310: 20 20 20 44 42 20 20 20 20 42 4f 4f 4c 45 41 4e     DB    BOOLEAN
a320: 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  .**.*/.static in
a330: 74 20 74 65 73 74 5f 65 78 74 65 6e 64 65 64 5f  t test_extended_
a340: 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 0a 20 20  result_codes(.  
a350: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
a360: 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
a370: 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
a380: 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
a390: 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
a3a0: 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
a3b0: 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
a3c0: 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
a3d0: 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
a3e0: 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
a3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a400: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
a410: 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
a420: 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
a430: 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
a440: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 65 6e  s */.){.  int en
a450: 61 62 6c 65 3b 0a 20 20 73 71 6c 69 74 65 33 20  able;.  sqlite3 
a460: 2a 64 62 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  *db;..  if( objc
a470: 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57  !=3 ){.    Tcl_W
a480: 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65  rongNumArgs(inte
a490: 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42  rp, 1, objv, "DB
a4a0: 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20 20 20 20   BOOLEAN");.    
a4b0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a4c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
a4d0: 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
a4e0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
a4f0: 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
a500: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
a510: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 42  ;.  if( Tcl_GetB
a520: 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a 28 69 6e  ooleanFromObj(in
a530: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
a540: 65 6e 61 62 6c 65 29 20 29 20 72 65 74 75 72 6e  enable) ) return
a550: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71   TCL_ERROR;.  sq
a560: 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
a570: 65 73 75 6c 74 5f 63 6f 64 65 73 28 64 62 2c 20  esult_codes(db, 
a580: 65 6e 61 62 6c 65 29 3b 0a 20 20 72 65 74 75 72  enable);.  retur
a590: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
a5a0: 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
a5b0: 33 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d  3_libversion_num
a5c0: 62 65 72 0a 2a 2a 0a 2a 2f 0a 73 74 61 74 69 63  ber.**.*/.static
a5d0: 20 69 6e 74 20 74 65 73 74 5f 6c 69 62 76 65 72   int test_libver
a5e0: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 0a 20 20 43  sion_number(.  C
a5f0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
a600: 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
a610: 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
a620: 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
a630: 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
a640: 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
a650: 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
a660: 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
a670: 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
a680: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
a690: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
a6a0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
a6b0: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
a6c0: 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
a6d0: 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
a6e0: 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 53 65 74   */.){.  Tcl_Set
a6f0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
a700: 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
a710: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
a720: 6f 6e 5f 6e 75 6d 62 65 72 28 29 29 29 3b 0a 20  on_number()));. 
a730: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
a740: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
a750: 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
a760: 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 20 44 42  lumn_metadata DB
a770: 20 64 62 6e 61 6d 65 20 74 62 6c 6e 61 6d 65 20   dbname tblname 
a780: 63 6f 6c 6e 61 6d 65 0a 2a 2a 0a 2a 2f 0a 23 69  colname.**.*/.#i
a790: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
a7a0: 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41  LE_COLUMN_METADA
a7b0: 54 41 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  TA.static int te
a7c0: 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  st_table_column_
a7d0: 6d 65 74 61 64 61 74 61 28 0a 20 20 43 6c 69 65  metadata(.  Clie
a7e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
a7f0: 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
a800: 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
a810: 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
a820: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
a830: 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
a840: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
a850: 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
a860: 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
a870: 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
a880: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
a890: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
a8a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
a8b0: 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
a8c0: 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
a8d0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
a8e0: 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
a8f0: 2a 7a 44 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68  *zDb;.  const ch
a900: 61 72 20 2a 7a 54 62 6c 3b 0a 20 20 63 6f 6e 73  ar *zTbl;.  cons
a910: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 3b 0a 20 20  t char *zCol;.  
a920: 69 6e 74 20 72 63 3b 0a 20 20 54 63 6c 5f 4f 62  int rc;.  Tcl_Ob
a930: 6a 20 2a 70 52 65 74 3b 0a 0a 20 20 63 6f 6e 73  j *pRet;..  cons
a940: 74 20 63 68 61 72 20 2a 7a 44 61 74 61 74 79 70  t char *zDatatyp
a950: 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e;.  const char 
a960: 2a 7a 43 6f 6c 6c 73 65 71 3b 0a 20 20 69 6e 74  *zCollseq;.  int
a970: 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 6e 74 20   notnull;.  int 
a980: 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 6e  primarykey;.  in
a990: 74 20 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 3b  t autoincrement;
a9a0: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 35 20  ..  if( objc!=5 
a9b0: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
a9c0: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
a9d0: 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20 64 62 6e  1, objv, "DB dbn
a9e0: 61 6d 65 20 74 62 6c 6e 61 6d 65 20 63 6f 6c 6e  ame tblname coln
a9f0: 61 6d 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ame");.    retur
aa00: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
aa10: 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
aa20: 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
aa30: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
aa40: 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
aa50: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a  n TCL_ERROR;.  z
aa60: 44 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  Db = Tcl_GetStri
aa70: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 7a  ng(objv[2]);.  z
aa80: 54 62 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  Tbl = Tcl_GetStr
aa90: 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20  ing(objv[3]);.  
aaa0: 7a 43 6f 6c 20 3d 20 54 63 6c 5f 47 65 74 53 74  zCol = Tcl_GetSt
aab0: 72 69 6e 67 28 6f 62 6a 76 5b 34 5d 29 3b 0a 0a  ring(objv[4]);..
aac0: 20 20 69 66 28 20 73 74 72 6c 65 6e 28 7a 44 62    if( strlen(zDb
aad0: 29 3d 3d 30 20 29 20 7a 44 62 20 3d 20 30 3b 0a  )==0 ) zDb = 0;.
aae0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
aaf0: 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
ab00: 61 64 61 74 61 28 64 62 2c 20 7a 44 62 2c 20 7a  adata(db, zDb, z
ab10: 54 62 6c 2c 20 7a 43 6f 6c 2c 20 0a 20 20 20 20  Tbl, zCol, .    
ab20: 20 20 26 7a 44 61 74 61 74 79 70 65 2c 20 26 7a    &zDatatype, &z
ab30: 43 6f 6c 6c 73 65 71 2c 20 26 6e 6f 74 6e 75 6c  Collseq, &notnul
ab40: 6c 2c 20 26 70 72 69 6d 61 72 79 6b 65 79 2c 20  l, &primarykey, 
ab50: 26 61 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 3b  &autoincrement);
ab60: 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
ab70: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c  TE_OK ){.    Tcl
ab80: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
ab90: 74 65 72 70 2c 20 73 71 6c 69 74 65 33 5f 65 72  terp, sqlite3_er
aba0: 72 6d 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20  rmsg(db), 0);.  
abb0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
abc0: 4f 52 3b 0a 20 20 7d 0a 0a 20 20 70 52 65 74 20  OR;.  }..  pRet 
abd0: 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a  = Tcl_NewObj();.
abe0: 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
abf0: 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52  endElement(0, pR
ac00: 65 74 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e  et, Tcl_NewStrin
ac10: 67 4f 62 6a 28 7a 44 61 74 61 74 79 70 65 2c 20  gObj(zDatatype, 
ac20: 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74  -1));.  Tcl_List
ac30: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
ac40: 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65  (0, pRet, Tcl_Ne
ac50: 77 53 74 72 69 6e 67 4f 62 6a 28 7a 43 6f 6c 6c  wStringObj(zColl
ac60: 73 65 71 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  seq, -1));.  Tcl
ac70: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
ac80: 65 6d 65 6e 74 28 30 2c 20 70 52 65 74 2c 20 54  ement(0, pRet, T
ac90: 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 6f 74  cl_NewIntObj(not
aca0: 6e 75 6c 6c 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  null));.  Tcl_Li
acb0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
acc0: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
acd0: 4e 65 77 49 6e 74 4f 62 6a 28 70 72 69 6d 61 72  NewIntObj(primar
ace0: 79 6b 65 79 29 29 3b 0a 20 20 54 63 6c 5f 4c 69  ykey));.  Tcl_Li
acf0: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65  stObjAppendEleme
ad00: 6e 74 28 30 2c 20 70 52 65 74 2c 20 54 63 6c 5f  nt(0, pRet, Tcl_
ad10: 4e 65 77 49 6e 74 4f 62 6a 28 61 75 74 6f 69 6e  NewIntObj(autoin
ad20: 63 72 65 6d 65 6e 74 29 29 3b 0a 20 20 54 63 6c  crement));.  Tcl
ad30: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
ad40: 74 65 72 70 2c 20 70 52 65 74 29 3b 0a 0a 20 20  terp, pRet);..  
ad50: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
ad60: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66  .#endif..#ifndef
ad70: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
ad80: 52 42 4c 4f 42 0a 0a 73 74 61 74 69 63 20 69 6e  RBLOB..static in
ad90: 74 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f 6d  t blobHandleFrom
ada0: 4f 62 6a 28 0a 20 20 54 63 6c 5f 49 6e 74 65 72  Obj(.  Tcl_Inter
adb0: 70 20 2a 69 6e 74 65 72 70 2c 20 0a 20 20 54 63  p *interp, .  Tc
adc0: 6c 5f 4f 62 6a 20 2a 70 4f 62 6a 2c 0a 20 20 73  l_Obj *pObj,.  s
add0: 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 2a 70 70  qlite3_blob **pp
ade0: 42 6c 6f 62 0a 29 7b 0a 20 20 63 68 61 72 20 2a  Blob.){.  char *
adf0: 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 0a 20 20 7a  z;.  int n;..  z
ae00: 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
ae10: 46 72 6f 6d 4f 62 6a 28 70 4f 62 6a 2c 20 26 6e  FromObj(pObj, &n
ae20: 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b  );.  if( n==0 ){
ae30: 0a 20 20 20 20 2a 70 70 42 6c 6f 62 20 3d 20 30  .    *ppBlob = 0
ae40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
ae50: 6e 74 20 6e 6f 74 55 73 65 64 3b 0a 20 20 20 20  nt notUsed;.    
ae60: 54 63 6c 5f 43 68 61 6e 6e 65 6c 20 63 68 61 6e  Tcl_Channel chan
ae70: 6e 65 6c 3b 0a 20 20 20 20 43 6c 69 65 6e 74 44  nel;.    ClientD
ae80: 61 74 61 20 69 6e 73 74 61 6e 63 65 44 61 74 61  ata instanceData
ae90: 3b 0a 20 20 20 20 0a 20 20 20 20 63 68 61 6e 6e  ;.    .    chann
aea0: 65 6c 20 3d 20 54 63 6c 5f 47 65 74 43 68 61 6e  el = Tcl_GetChan
aeb0: 6e 65 6c 28 69 6e 74 65 72 70 2c 20 7a 2c 20 26  nel(interp, z, &
aec0: 6e 6f 74 55 73 65 64 29 3b 0a 20 20 20 20 69 66  notUsed);.    if
aed0: 28 20 21 63 68 61 6e 6e 65 6c 20 29 20 72 65 74  ( !channel ) ret
aee0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
aef0: 20 20 20 20 54 63 6c 5f 46 6c 75 73 68 28 63 68      Tcl_Flush(ch
af00: 61 6e 6e 65 6c 29 3b 0a 20 20 20 20 54 63 6c 5f  annel);.    Tcl_
af10: 53 65 65 6b 28 63 68 61 6e 6e 65 6c 2c 20 30 2c  Seek(channel, 0,
af20: 20 53 45 45 4b 5f 53 45 54 29 3b 0a 0a 20 20 20   SEEK_SET);..   
af30: 20 69 6e 73 74 61 6e 63 65 44 61 74 61 20 3d 20   instanceData = 
af40: 54 63 6c 5f 47 65 74 43 68 61 6e 6e 65 6c 49 6e  Tcl_GetChannelIn
af50: 73 74 61 6e 63 65 44 61 74 61 28 63 68 61 6e 6e  stanceData(chann
af60: 65 6c 29 3b 0a 20 20 20 20 2a 70 70 42 6c 6f 62  el);.    *ppBlob
af70: 20 3d 20 2a 28 28 73 71 6c 69 74 65 33 5f 62 6c   = *((sqlite3_bl
af80: 6f 62 20 2a 2a 29 69 6e 73 74 61 6e 63 65 44 61  ob **)instanceDa
af90: 74 61 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  ta);.  }..  retu
afa0: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  rn TCL_OK;.}../*
afb0: 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  .** sqlite3_blob
afc0: 5f 62 79 74 65 73 20 20 43 48 41 4e 4e 45 4c 0a  _bytes  CHANNEL.
afd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
afe0: 73 74 5f 62 6c 6f 62 5f 62 79 74 65 73 28 0a 20  st_blob_bytes(. 
aff0: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
b000: 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75  ntData, /* Not u
b010: 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74  sed */.  Tcl_Int
b020: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20  erp *interp,    
b030: 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72  /* The TCL inter
b040: 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f  preter that invo
b050: 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64  ked this command
b060: 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20   */.  int objc, 
b070: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b080: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
b090: 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a  nts */.  Tcl_Obj
b0a0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20   *CONST objv[]  
b0b0: 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  /* Command argum
b0c0: 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  ents */.){.  sql
b0d0: 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62  ite3_blob *pBlob
b0e0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
b0f0: 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20   .  if( objc!=2 
b100: 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
b110: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
b120: 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e 45  1, objv, "CHANNE
b130: 4c 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  L");.    return 
b140: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
b150: 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65    if( blobHandle
b160: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b170: 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29  objv[1], &pBlob)
b180: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b190: 52 4f 52 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  ROR;.  nByte = s
b1a0: 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65  qlite3_blob_byte
b1b0: 73 28 70 42 6c 6f 62 29 3b 0a 20 20 54 63 6c 5f  s(pBlob);.  Tcl_
b1c0: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
b1d0: 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
b1e0: 62 6a 28 6e 42 79 74 65 29 29 3b 0a 0a 20 20 72  bj(nByte));..  r
b1f0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
b200: 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 62  ./*.** sqlite3_b
b210: 6c 6f 62 5f 63 6c 6f 73 65 20 20 43 48 41 4e 4e  lob_close  CHANN
b220: 45 4c 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  EL.*/.static int
b230: 20 74 65 73 74 5f 62 6c 6f 62 5f 63 6c 6f 73 65   test_blob_close
b240: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
b250: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
b260: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
b270: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
b280: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
b290: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
b2a0: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
b2b0: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
b2c0: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
b2d0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
b2e0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
b2f0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
b300: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
b310: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
b320: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
b330: 6c 6f 62 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62  lob;.  .  if( ob
b340: 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
b350: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
b360: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
b370: 43 48 41 4e 4e 45 4c 22 29 3b 0a 20 20 20 20 72  CHANNEL");.    r
b380: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b390: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62  .  }..  if( blob
b3a0: 48 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e  HandleFromObj(in
b3b0: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26  terp, objv[1], &
b3c0: 70 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20  pBlob) ) return 
b3d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c  TCL_ERROR;.  sql
b3e0: 69 74 65 33 5f 62 6c 6f 62 5f 63 6c 6f 73 65 28  ite3_blob_close(
b3f0: 70 42 6c 6f 62 29 3b 0a 0a 20 20 72 65 74 75 72  pBlob);..  retur
b400: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
b410: 2a 2a 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f  ** sqlite3_blob_
b420: 72 65 61 64 20 20 43 48 41 4e 4e 45 4c 20 4f 46  read  CHANNEL OF
b430: 46 53 45 54 20 4e 0a 2a 2a 0a 2a 2a 20 20 20 54  FSET N.**.**   T
b440: 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75  his command is u
b450: 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65 20  sed to test the 
b460: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61  sqlite3_blob_rea
b470: 64 28 29 20 69 6e 20 77 61 79 73 20 74 68 61 74  d() in ways that
b480: 0a 2a 2a 20 20 20 74 68 65 20 54 63 6c 20 63 68  .**   the Tcl ch
b490: 61 6e 6e 65 6c 20 69 6e 74 65 72 66 61 63 65 20  annel interface 
b4a0: 64 6f 65 73 20 6e 6f 74 2e 20 54 68 65 20 66 69  does not. The fi
b4b0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68 6f  rst argument sho
b4c0: 75 6c 64 0a 2a 2a 20 20 20 62 65 20 74 68 65 20  uld.**   be the 
b4d0: 6e 61 6d 65 20 6f 66 20 61 20 76 61 6c 69 64 20  name of a valid 
b4e0: 63 68 61 6e 6e 65 6c 20 63 72 65 61 74 65 64 20  channel created 
b4f0: 62 79 20 74 68 65 20 5b 69 6e 63 72 62 6c 6f 62  by the [incrblob
b500: 5d 20 6d 65 74 68 6f 64 0a 2a 2a 20 20 20 6f 66  ] method.**   of
b510: 20 61 20 64 61 74 61 62 61 73 65 20 68 61 6e 64   a database hand
b520: 6c 65 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  le. This functio
b530: 6e 20 63 61 6c 6c 73 20 73 71 6c 69 74 65 33 5f  n calls sqlite3_
b540: 62 6c 6f 62 5f 72 65 61 64 28 29 0a 2a 2a 20 20  blob_read().**  
b550: 20 74 6f 20 72 65 61 64 20 4e 20 62 79 74 65 73   to read N bytes
b560: 20 66 72 6f 6d 20 6f 66 66 73 65 74 20 4f 46 46   from offset OFF
b570: 53 45 54 20 66 72 6f 6d 20 74 68 65 20 75 6e 64  SET from the und
b580: 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65 0a 2a  erlying SQLite.*
b590: 2a 20 20 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e  *   blob handle.
b5a0: 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20 73 75 63 63  .**.**   On succ
b5b0: 65 73 73 2c 20 61 20 62 79 74 65 2d 61 72 72 61  ess, a byte-arra
b5c0: 79 20 6f 62 6a 65 63 74 20 63 6f 6e 74 61 69 6e  y object contain
b5d0: 69 6e 67 20 74 68 65 20 72 65 61 64 20 64 61 74  ing the read dat
b5e0: 61 20 69 73 20 0a 2a 2a 20 20 20 72 65 74 75 72  a is .**   retur
b5f0: 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65 2c  ned. On failure,
b600: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
b610: 20 72 65 73 75 6c 74 20 69 73 20 73 65 74 20 74   result is set t
b620: 6f 20 74 68 65 0a 2a 2a 20 20 20 74 65 78 74 20  o the.**   text 
b630: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
b640: 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20 65  f the returned e
b650: 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
b660: 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 29 0a  "SQLITE_NOMEM").
b670: 2a 2a 20 20 20 61 6e 64 20 61 20 54 63 6c 20 65  **   and a Tcl e
b680: 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f  xception is thro
b690: 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  wn..*/.static in
b6a0: 74 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 61 64  t test_blob_read
b6b0: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
b6c0: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
b6d0: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
b6e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
b6f0: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
b700: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
b710: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
b720: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
b730: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
b740: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
b750: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
b760: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
b770: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
b780: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
b790: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20 2a 70 42  sqlite3_blob *pB
b7a0: 6c 6f 62 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65  lob;.  int nByte
b7b0: 3b 0a 20 20 69 6e 74 20 69 4f 66 66 73 65 74 3b  ;.  int iOffset;
b7c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
b7d0: 20 2a 7a 42 75 66 20 3d 20 30 3b 0a 20 20 69 6e   *zBuf = 0;.  in
b7e0: 74 20 72 63 3b 0a 20 20 0a 20 20 69 66 28 20 6f  t rc;.  .  if( o
b7f0: 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
b800: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
b810: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
b820: 22 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45 54 20  "CHANNEL OFFSET 
b830: 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  N");.    return 
b840: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
b850: 20 20 69 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65    if( blobHandle
b860: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
b870: 6f 62 6a 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29  objv[1], &pBlob)
b880: 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
b890: 52 4f 52 3b 0a 20 20 69 66 28 20 54 43 4c 5f 4f  ROR;.  if( TCL_O
b8a0: 4b 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  K!=Tcl_GetIntFro
b8b0: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
b8c0: 76 5b 32 5d 2c 20 26 69 4f 66 66 73 65 74 29 0a  v[2], &iOffset).
b8d0: 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b 21 3d 54 63     || TCL_OK!=Tc
b8e0: 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
b8f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c  interp, objv[3],
b900: 20 26 6e 42 79 74 65 29 0a 20 20 29 7b 20 0a 20   &nByte).  ){ . 
b910: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
b920: 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
b930: 6e 42 79 74 65 3e 30 20 29 7b 0a 20 20 20 20 7a  nByte>0 ){.    z
b940: 42 75 66 20 3d 20 28 75 6e 73 69 67 6e 65 64 20  Buf = (unsigned 
b950: 63 68 61 72 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63  char *)Tcl_Alloc
b960: 28 6e 42 79 74 65 29 3b 0a 20 20 7d 0a 20 20 72  (nByte);.  }.  r
b970: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
b980: 5f 72 65 61 64 28 70 42 6c 6f 62 2c 20 7a 42 75  _read(pBlob, zBu
b990: 66 2c 20 6e 42 79 74 65 2c 20 69 4f 66 66 73 65  f, nByte, iOffse
b9a0: 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  t);.  if( rc==SQ
b9b0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 54  LITE_OK ){.    T
b9c0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
b9d0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
b9e0: 79 74 65 41 72 72 61 79 4f 62 6a 28 7a 42 75 66  yteArrayObj(zBuf
b9f0: 2c 20 6e 42 79 74 65 29 29 3b 0a 20 20 7d 65 6c  , nByte));.  }el
ba00: 73 65 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52  se{.    Tcl_SetR
ba10: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
ba20: 68 61 72 20 2a 29 73 71 6c 69 74 65 33 45 72 72  har *)sqlite3Err
ba30: 4e 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 56 4f  Name(rc), TCL_VO
ba40: 4c 41 54 49 4c 45 29 3b 0a 20 20 7d 0a 20 20 54  LATILE);.  }.  T
ba50: 63 6c 5f 46 72 65 65 28 28 63 68 61 72 20 2a 29  cl_Free((char *)
ba60: 7a 42 75 66 29 3b 0a 0a 20 20 72 65 74 75 72 6e  zBuf);..  return
ba70: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
ba80: 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45  ? TCL_OK : TCL_E
ba90: 52 52 4f 52 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  RROR);.}../*.** 
baa0: 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72 69  sqlite3_blob_wri
bab0: 74 65 20 43 48 41 4e 4e 45 4c 20 4f 46 46 53 45  te CHANNEL OFFSE
bac0: 54 20 44 41 54 41 20 3f 4e 44 41 54 41 3f 0a 2a  T DATA ?NDATA?.*
bad0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 63 6f 6d 6d  *.**   This comm
bae0: 61 6e 64 20 69 73 20 75 73 65 64 20 74 6f 20 74  and is used to t
baf0: 65 73 74 20 74 68 65 20 73 71 6c 69 74 65 33 5f  est the sqlite3_
bb00: 62 6c 6f 62 5f 77 72 69 74 65 28 29 20 69 6e 20  blob_write() in 
bb10: 77 61 79 73 20 74 68 61 74 0a 2a 2a 20 20 20 74  ways that.**   t
bb20: 68 65 20 54 63 6c 20 63 68 61 6e 6e 65 6c 20 69  he Tcl channel i
bb30: 6e 74 65 72 66 61 63 65 20 64 6f 65 73 20 6e 6f  nterface does no
bb40: 74 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  t. The first arg
bb50: 75 6d 65 6e 74 20 73 68 6f 75 6c 64 0a 2a 2a 20  ument should.** 
bb60: 20 20 62 65 20 74 68 65 20 6e 61 6d 65 20 6f 66    be the name of
bb70: 20 61 20 76 61 6c 69 64 20 63 68 61 6e 6e 65 6c   a valid channel
bb80: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
bb90: 5b 69 6e 63 72 62 6c 6f 62 5d 20 6d 65 74 68 6f  [incrblob] metho
bba0: 64 0a 2a 2a 20 20 20 6f 66 20 61 20 64 61 74 61  d.**   of a data
bbb0: 62 61 73 65 20 68 61 6e 64 6c 65 2e 20 54 68 69  base handle. Thi
bbc0: 73 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73  s function calls
bbd0: 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77 72   sqlite3_blob_wr
bbe0: 69 74 65 28 29 0a 2a 2a 20 20 20 74 6f 20 77 72  ite().**   to wr
bbf0: 69 74 65 20 74 68 65 20 44 41 54 41 20 62 79 74  ite the DATA byt
bc00: 65 2d 61 72 72 61 79 20 74 6f 20 74 68 65 20 75  e-array to the u
bc10: 6e 64 65 72 6c 79 69 6e 67 20 53 51 4c 69 74 65  nderlying SQLite
bc20: 20 62 6c 6f 62 20 68 61 6e 64 6c 65 2e 0a 2a 2a   blob handle..**
bc30: 20 20 20 61 74 20 6f 66 66 73 65 74 20 4f 46 46     at offset OFF
bc40: 53 45 54 2e 0a 2a 2a 0a 2a 2a 20 20 20 4f 6e 20  SET..**.**   On 
bc50: 73 75 63 63 65 73 73 2c 20 61 6e 20 65 6d 70 74  success, an empt
bc60: 79 20 73 74 72 69 6e 67 20 69 73 20 72 65 74 75  y string is retu
bc70: 72 6e 65 64 2e 20 4f 6e 20 66 61 69 6c 75 72 65  rned. On failure
bc80: 2c 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65  , the interprete
bc90: 72 0a 2a 2a 20 20 20 72 65 73 75 6c 74 20 69 73  r.**   result is
bca0: 20 73 65 74 20 74 6f 20 74 68 65 20 74 65 78 74   set to the text
bcb0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
bcc0: 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64 20  of the returned 
bcd0: 65 72 72 6f 72 20 63 6f 64 65 20 0a 2a 2a 20 20  error code .**  
bce0: 20 28 69 2e 65 2e 20 22 53 51 4c 49 54 45 5f 4e   (i.e. "SQLITE_N
bcf0: 4f 4d 45 4d 22 29 20 61 6e 64 20 61 20 54 63 6c  OMEM") and a Tcl
bd00: 20 65 78 63 65 70 74 69 6f 6e 20 69 73 20 74 68   exception is th
bd10: 72 6f 77 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rown..*/.static 
bd20: 69 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 77 72  int test_blob_wr
bd30: 69 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ite(.  ClientDat
bd40: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
bd50: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
bd60: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
bd70: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
bd80: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
bd90: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
bda0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
bdb0: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
bdc0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bdd0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
bde0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
bdf0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
be00: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
be10: 0a 20 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62 20  .  sqlite3_blob 
be20: 2a 70 42 6c 6f 62 3b 0a 20 20 69 6e 74 20 69 4f  *pBlob;.  int iO
be30: 66 66 73 65 74 3b 0a 20 20 69 6e 74 20 72 63 3b  ffset;.  int rc;
be40: 0a 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ..  unsigned cha
be50: 72 20 2a 7a 42 75 66 3b 0a 20 20 69 6e 74 20 6e  r *zBuf;.  int n
be60: 42 75 66 3b 0a 20 20 0a 20 20 69 66 28 20 6f 62  Buf;.  .  if( ob
be70: 6a 63 21 3d 34 20 26 26 20 6f 62 6a 63 21 3d 35  jc!=4 && objc!=5
be80: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
be90: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
bea0: 20 31 2c 20 6f 62 6a 76 2c 20 22 43 48 41 4e 4e   1, objv, "CHANN
beb0: 45 4c 20 4f 46 46 53 45 54 20 44 41 54 41 20 3f  EL OFFSET DATA ?
bec0: 4e 44 41 54 41 3f 22 29 3b 0a 20 20 20 20 72 65  NDATA?");.    re
bed0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
bee0: 20 20 7d 0a 0a 20 20 69 66 28 20 62 6c 6f 62 48    }..  if( blobH
bef0: 61 6e 64 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  andleFromObj(int
bf00: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 70  erp, objv[1], &p
bf10: 42 6c 6f 62 29 20 29 20 72 65 74 75 72 6e 20 54  Blob) ) return T
bf20: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
bf30: 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47 65 74 49  TCL_OK!=Tcl_GetI
bf40: 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
bf50: 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 4f 66 66  , objv[2], &iOff
bf60: 73 65 74 29 20 29 7b 20 0a 20 20 20 20 72 65 74  set) ){ .    ret
bf70: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
bf80: 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 54 63 6c   }..  zBuf = Tcl
bf90: 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
bfa0: 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e  mObj(objv[3], &n
bfb0: 42 75 66 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Buf);.  if( objc
bfc0: 3d 3d 35 20 26 26 20 54 63 6c 5f 47 65 74 49 6e  ==5 && Tcl_GetIn
bfd0: 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  tFromObj(interp,
bfe0: 20 6f 62 6a 76 5b 34 5d 2c 20 26 6e 42 75 66 29   objv[4], &nBuf)
bff0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
c000: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
c010: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f  rc = sqlite3_blo
c020: 62 5f 77 72 69 74 65 28 70 42 6c 6f 62 2c 20 7a  b_write(pBlob, z
c030: 42 75 66 2c 20 6e 42 75 66 2c 20 69 4f 66 66 73  Buf, nBuf, iOffs
c040: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  et);.  if( rc!=S
c050: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c060: 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
c070: 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71  terp, (char *)sq
c080: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29  lite3ErrName(rc)
c090: 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b  , TCL_VOLATILE);
c0a0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
c0b0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20  rc==SQLITE_OK ? 
c0c0: 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f 45 52 52  TCL_OK : TCL_ERR
c0d0: 4f 52 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  OR);.}..static i
c0e0: 6e 74 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65 6f  nt test_blob_reo
c0f0: 70 65 6e 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  pen(.  ClientDat
c100: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
c110: 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54   Not used */.  T
c120: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c130: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
c140: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
c150: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
c160: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
c170: 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
c180: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c190: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
c1a0: 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
c1b0: 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
c1c0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
c1d0: 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74 20 69  .  Tcl_WideInt i
c1e0: 52 6f 77 69 64 3b 0a 20 20 73 71 6c 69 74 65 33  Rowid;.  sqlite3
c1f0: 5f 62 6c 6f 62 20 2a 70 42 6c 6f 62 3b 0a 20 20  _blob *pBlob;.  
c200: 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
c210: 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
c220: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
c230: 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
c240: 22 43 48 41 4e 4e 45 4c 20 52 4f 57 49 44 22 29  "CHANNEL ROWID")
c250: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
c260: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
c270: 66 28 20 62 6c 6f 62 48 61 6e 64 6c 65 46 72 6f  f( blobHandleFro
c280: 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
c290: 76 5b 31 5d 2c 20 26 70 42 6c 6f 62 29 20 29 20  v[1], &pBlob) ) 
c2a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
c2b0: 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57  ;.  if( Tcl_GetW
c2c0: 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  ideIntFromObj(in
c2d0: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
c2e0: 69 52 6f 77 69 64 29 20 29 20 72 65 74 75 72 6e  iRowid) ) return
c2f0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
c300: 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 6c 6f 62  c = sqlite3_blob
c310: 5f 72 65 6f 70 65 6e 28 70 42 6c 6f 62 2c 20 69  _reopen(pBlob, i
c320: 52 6f 77 69 64 29 3b 0a 20 20 69 66 28 20 72 63  Rowid);.  if( rc
c330: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
c340: 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74     Tcl_SetResult
c350: 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
c360: 29 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  )sqlite3ErrName(
c370: 72 63 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49 4c  rc), TCL_VOLATIL
c380: 45 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  E);.  }..  retur
c390: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
c3a0: 20 3f 20 54 43 4c 5f 4f 4b 20 3a 20 54 43 4c 5f   ? TCL_OK : TCL_
c3b0: 45 52 52 4f 52 29 3b 0a 7d 0a 0a 23 65 6e 64 69  ERROR);.}..#endi
c3c0: 66 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  f../*.** Usage: 
c3d0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
c3e0: 6f 6c 6c 61 74 69 6f 6e 5f 76 32 20 44 42 2d 48  ollation_v2 DB-H
c3f0: 41 4e 44 4c 45 20 4e 41 4d 45 20 43 4d 50 2d 50  ANDLE NAME CMP-P
c400: 52 4f 43 20 44 45 4c 2d 50 52 4f 43 0a 2a 2a 0a  ROC DEL-PROC.**.
c410: 2a 2a 20 20 20 54 68 69 73 20 54 63 6c 20 70 72  **   This Tcl pr
c420: 6f 63 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  oc is used for t
c430: 65 73 74 69 6e 67 20 74 68 65 20 65 78 70 65 72  esting the exper
c440: 69 6d 65 6e 74 61 6c 0a 2a 2a 20 20 20 73 71 6c  imental.**   sql
c450: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
c460: 61 74 69 6f 6e 5f 76 32 28 29 20 69 6e 74 65 72  ation_v2() inter
c470: 66 61 63 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  face..*/.struct 
c480: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20 7b  TestCollationX {
c490: 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
c4a0: 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
c4b0: 20 2a 70 43 6d 70 3b 0a 20 20 54 63 6c 5f 4f 62   *pCmp;.  Tcl_Ob
c4c0: 6a 20 2a 70 44 65 6c 3b 0a 7d 3b 0a 74 79 70 65  j *pDel;.};.type
c4d0: 64 65 66 20 73 74 72 75 63 74 20 54 65 73 74 43  def struct TestC
c4e0: 6f 6c 6c 61 74 69 6f 6e 58 20 54 65 73 74 43 6f  ollationX TestCo
c4f0: 6c 6c 61 74 69 6f 6e 58 3b 0a 73 74 61 74 69 63  llationX;.static
c500: 20 76 6f 69 64 20 74 65 73 74 43 72 65 61 74 65   void testCreate
c510: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 28 76 6f 69  CollationDel(voi
c520: 64 20 2a 70 43 74 78 29 7b 0a 20 20 54 65 73 74  d *pCtx){.  Test
c530: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 70 20 3d 20  CollationX *p = 
c540: 28 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 20  (TestCollationX 
c550: 2a 29 70 43 74 78 3b 0a 0a 20 20 69 6e 74 20 72  *)pCtx;..  int r
c560: 63 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  c = Tcl_EvalObjE
c570: 78 28 70 2d 3e 69 6e 74 65 72 70 2c 20 70 2d 3e  x(p->interp, p->
c580: 70 44 65 6c 2c 20 54 43 4c 5f 45 56 41 4c 5f 44  pDel, TCL_EVAL_D
c590: 49 52 45 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47  IRECT|TCL_EVAL_G
c5a0: 4c 4f 42 41 4c 29 3b 0a 20 20 69 66 28 20 72 63  LOBAL);.  if( rc
c5b0: 21 3d 54 43 4c 5f 4f 4b 20 29 7b 0a 20 20 20 20  !=TCL_OK ){.    
c5c0: 54 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72  Tcl_BackgroundEr
c5d0: 72 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a  ror(p->interp);.
c5e0: 20 20 7d 0a 0a 20 20 54 63 6c 5f 44 65 63 72 52    }..  Tcl_DecrR
c5f0: 65 66 43 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29  efCount(p->pCmp)
c600: 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
c610: 6f 75 6e 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 20  ount(p->pDel);. 
c620: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 28 76   sqlite3_free((v
c630: 6f 69 64 20 2a 29 70 29 3b 0a 7d 0a 73 74 61 74  oid *)p);.}.stat
c640: 69 63 20 69 6e 74 20 74 65 73 74 43 72 65 61 74  ic int testCreat
c650: 65 43 6f 6c 6c 61 74 69 6f 6e 43 6d 70 28 0a 20  eCollationCmp(. 
c660: 20 76 6f 69 64 20 2a 70 43 74 78 2c 0a 20 20 69   void *pCtx,.  i
c670: 6e 74 20 6e 4c 65 66 74 2c 0a 20 20 63 6f 6e 73  nt nLeft,.  cons
c680: 74 20 76 6f 69 64 20 2a 7a 4c 65 66 74 2c 0a 20  t void *zLeft,. 
c690: 20 69 6e 74 20 6e 52 69 67 68 74 2c 0a 20 20 63   int nRight,.  c
c6a0: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 52 69 67 68  onst void *zRigh
c6b0: 74 0a 29 7b 0a 20 20 54 65 73 74 43 6f 6c 6c 61  t.){.  TestColla
c6c0: 74 69 6f 6e 58 20 2a 70 20 3d 20 28 54 65 73 74  tionX *p = (Test
c6d0: 43 6f 6c 6c 61 74 69 6f 6e 58 20 2a 29 70 43 74  CollationX *)pCt
c6e0: 78 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 53  x;.  Tcl_Obj *pS
c6f0: 63 72 69 70 74 20 3d 20 54 63 6c 5f 44 75 70 6c  cript = Tcl_Dupl
c700: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 43 6d 70  icateObj(p->pCmp
c710: 29 3b 0a 20 20 69 6e 74 20 69 52 65 73 20 3d 20  );.  int iRes = 
c720: 30 3b 0a 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65  0;..  Tcl_IncrRe
c730: 66 43 6f 75 6e 74 28 70 53 63 72 69 70 74 29 3b  fCount(pScript);
c740: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c750: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c760: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c770: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c780: 29 7a 4c 65 66 74 2c 20 6e 4c 65 66 74 29 29 3b  )zLeft, nLeft));
c790: 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
c7a0: 70 65 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70  pendElement(0, p
c7b0: 53 63 72 69 70 74 2c 20 54 63 6c 5f 4e 65 77 53  Script, Tcl_NewS
c7c0: 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 20 2a  tringObj((char *
c7d0: 29 7a 52 69 67 68 74 2c 6e 52 69 67 68 74 29 29  )zRight,nRight))
c7e0: 3b 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  ;..  if( TCL_OK!
c7f0: 3d 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70  =Tcl_EvalObjEx(p
c800: 2d 3e 69 6e 74 65 72 70 2c 20 70 53 63 72 69 70  ->interp, pScrip
c810: 74 2c 20 54 43 4c 5f 45 56 41 4c 5f 44 49 52 45  t, TCL_EVAL_DIRE
c820: 43 54 7c 54 43 4c 5f 45 56 41 4c 5f 47 4c 4f 42  CT|TCL_EVAL_GLOB
c830: 41 4c 29 0a 20 20 20 7c 7c 20 54 43 4c 5f 4f 4b  AL).   || TCL_OK
c840: 21 3d 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  !=Tcl_GetIntFrom
c850: 4f 62 6a 28 70 2d 3e 69 6e 74 65 72 70 2c 20 54  Obj(p->interp, T
c860: 63 6c 5f 47 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_GetObjResult(
c870: 70 2d 3e 69 6e 74 65 72 70 29 2c 20 26 69 52 65  p->interp), &iRe
c880: 73 29 0a 20 20 29 7b 0a 20 20 20 20 54 63 6c 5f  s).  ){.    Tcl_
c890: 42 61 63 6b 67 72 6f 75 6e 64 45 72 72 6f 72 28  BackgroundError(
c8a0: 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20 20 7d 0a  p->interp);.  }.
c8b0: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
c8c0: 6e 74 28 70 53 63 72 69 70 74 29 3b 0a 0a 20 20  nt(pScript);..  
c8d0: 72 65 74 75 72 6e 20 69 52 65 73 3b 0a 7d 0a 73  return iRes;.}.s
c8e0: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63  tatic int test_c
c8f0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
c900: 76 32 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61  v2(.  ClientData
c910: 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20   clientData, /* 
c920: 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63  Not used */.  Tc
c930: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
c940: 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
c950: 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
c960: 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
c970: 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
c980: 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
c990: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
c9a0: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
c9b0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
c9c0: 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
c9d0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
c9e0: 20 20 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58    TestCollationX
c9f0: 20 2a 70 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p;.  sqlite3 *
ca00: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  db;.  int rc;.. 
ca10: 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
ca20: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
ca30: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
ca40: 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45  objv, "DB-HANDLE
ca50: 20 4e 41 4d 45 20 43 4d 50 2d 50 52 4f 43 20 44   NAME CMP-PROC D
ca60: 45 4c 2d 50 52 4f 43 22 29 3b 0a 20 20 20 20 72  EL-PROC");.    r
ca70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
ca80: 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62  .  }.  if( getDb
ca90: 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
caa0: 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
cab0: 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
cac0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
cad0: 0a 0a 20 20 70 20 3d 20 28 54 65 73 74 43 6f 6c  ..  p = (TestCol
cae0: 6c 61 74 69 6f 6e 58 20 2a 29 73 71 6c 69 74 65  lationX *)sqlite
caf0: 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28  3_malloc(sizeof(
cb00: 54 65 73 74 43 6f 6c 6c 61 74 69 6f 6e 58 29 29  TestCollationX))
cb10: 3b 0a 20 20 70 2d 3e 70 43 6d 70 20 3d 20 6f 62  ;.  p->pCmp = ob
cb20: 6a 76 5b 33 5d 3b 0a 20 20 70 2d 3e 70 44 65 6c  jv[3];.  p->pDel
cb30: 20 3d 20 6f 62 6a 76 5b 34 5d 3b 0a 20 20 70 2d   = objv[4];.  p-
cb40: 3e 69 6e 74 65 72 70 20 3d 20 69 6e 74 65 72 70  >interp = interp
cb50: 3b 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43  ;.  Tcl_IncrRefC
cb60: 6f 75 6e 74 28 70 2d 3e 70 43 6d 70 29 3b 0a 20  ount(p->pCmp);. 
cb70: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e   Tcl_IncrRefCoun
cb80: 74 28 70 2d 3e 70 44 65 6c 29 3b 0a 0a 20 20 72  t(p->pDel);..  r
cb90: 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61  c = sqlite3_crea
cba0: 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
cbb0: 64 62 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  db, Tcl_GetStrin
cbc0: 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 31 36 2c 20  g(objv[2]), 16, 
cbd0: 0a 20 20 20 20 20 20 28 76 6f 69 64 20 2a 29 70  .      (void *)p
cbe0: 2c 20 74 65 73 74 43 72 65 61 74 65 43 6f 6c 6c  , testCreateColl
cbf0: 61 74 69 6f 6e 43 6d 70 2c 20 74 65 73 74 43 72  ationCmp, testCr
cc00: 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c  eateCollationDel
cc10: 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  .  );.  if( rc!=
cc20: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 29 7b  SQLITE_MISUSE ){
cc30: 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
cc40: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 73  esult(interp, "s
cc50: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
cc60: 6c 6c 61 74 65 5f 76 32 28 29 20 66 61 69 6c 65  llate_v2() faile
cc70: 64 20 74 6f 20 64 65 74 65 63 74 20 22 0a 20 20  d to detect ".  
cc80: 20 20 20 20 22 61 6e 20 69 6e 76 61 6c 69 64 20      "an invalid 
cc90: 65 6e 63 6f 64 69 6e 67 22 2c 20 28 63 68 61 72  encoding", (char
cca0: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
ccb0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
ccc0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
ccd0: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
cce0: 76 32 28 64 62 2c 20 54 63 6c 5f 47 65 74 53 74  v2(db, Tcl_GetSt
ccf0: 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 2c 20 53  ring(objv[2]), S
cd00: 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20 20  QLITE_UTF8, .   
cd10: 20 20 20 28 76 6f 69 64 20 2a 29 70 2c 20 74 65     (void *)p, te
cd20: 73 74 43 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  stCreateCollatio
cd30: 6e 43 6d 70 2c 20 74 65 73 74 43 72 65 61 74 65  nCmp, testCreate
cd40: 43 6f 6c 6c 61 74 69 6f 6e 44 65 6c 0a 20 20 29  CollationDel.  )
cd50: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
cd60: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 53 41 47  K;.}../*.** USAG
cd70: 45 3a 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  E: sqlite3_creat
cd80: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 20 44 42  e_function_v2 DB
cd90: 20 4e 41 4d 45 20 4e 41 52 47 20 45 4e 43 20 3f   NAME NARG ENC ?
cda0: 53 57 49 54 43 48 45 53 3f 0a 2a 2a 0a 2a 2a 20  SWITCHES?.**.** 
cdb0: 41 76 61 69 6c 61 62 6c 65 20 73 77 69 74 63 68  Available switch
cdc0: 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  es are:.**.**   
cdd0: 2d 66 75 6e 63 20 20 20 20 53 43 52 49 50 54 0a  -func    SCRIPT.
cde0: 2a 2a 20 20 20 2d 73 74 65 70 20 20 20 20 53 43  **   -step    SC
cdf0: 52 49 50 54 0a 2a 2a 20 20 20 2d 66 69 6e 61 6c  RIPT.**   -final
ce00: 20 20 20 53 43 52 49 50 54 0a 2a 2a 20 20 20 2d     SCRIPT.**   -
ce10: 64 65 73 74 72 6f 79 20 53 43 52 49 50 54 0a 2a  destroy SCRIPT.*
ce20: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
ce30: 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56   CreateFunctionV
ce40: 32 20 43 72 65 61 74 65 46 75 6e 63 74 69 6f 6e  2 CreateFunction
ce50: 56 32 3b 0a 73 74 72 75 63 74 20 43 72 65 61 74  V2;.struct Creat
ce60: 65 46 75 6e 63 74 69 6f 6e 56 32 20 7b 0a 20 20  eFunctionV2 {.  
ce70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
ce80: 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
ce90: 46 75 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Func;           
cea0: 20 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20        /* Script 
ceb0: 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20 69 6e 76  for function inv
cec0: 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  ocation */.  Tcl
ced0: 5f 4f 62 6a 20 2a 70 53 74 65 70 3b 20 20 20 20  _Obj *pStep;    
cee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
cef0: 53 63 72 69 70 74 20 66 6f 72 20 61 67 67 2e 20  Script for agg. 
cf00: 73 74 65 70 20 69 6e 76 6f 63 61 74 69 6f 6e 20  step invocation 
cf10: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 46  */.  Tcl_Obj *pF
cf20: 69 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20  inal;           
cf30: 20 20 20 20 20 2f 2a 20 53 63 72 69 70 74 20 66       /* Script f
cf40: 6f 72 20 61 67 67 2e 20 66 69 6e 61 6c 69 7a 61  or agg. finaliza
cf50: 74 69 6f 6e 20 69 6e 76 6f 63 61 74 69 6f 6e 20  tion invocation 
cf60: 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 44  */.  Tcl_Obj *pD
cf70: 65 73 74 72 6f 79 3b 20 20 20 20 20 20 20 20 20  estroy;         
cf80: 20 20 20 20 20 2f 2a 20 44 65 73 74 72 75 63 74       /* Destruct
cf90: 6f 72 20 73 63 72 69 70 74 20 2a 2f 0a 7d 3b 0a  or script */.};.
cfa0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 66 32 46  static void cf2F
cfb0: 75 6e 63 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  unc(sqlite3_cont
cfc0: 65 78 74 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41  ext *ctx, int nA
cfd0: 72 67 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  rg, sqlite3_valu
cfe0: 65 20 2a 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61  e **aArg){.}.sta
cff0: 74 69 63 20 76 6f 69 64 20 63 66 32 53 74 65 70  tic void cf2Step
d000: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
d010: 20 2a 63 74 78 2c 20 69 6e 74 20 6e 41 72 67 2c   *ctx, int nArg,
d020: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
d030: 2a 61 41 72 67 29 7b 0a 7d 0a 73 74 61 74 69 63  *aArg){.}.static
d040: 20 76 6f 69 64 20 63 66 32 46 69 6e 61 6c 28 73   void cf2Final(s
d050: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
d060: 63 74 78 29 7b 0a 7d 0a 73 74 61 74 69 63 20 76  ctx){.}.static v
d070: 6f 69 64 20 63 66 32 44 65 73 74 72 6f 79 28 76  oid cf2Destroy(v
d080: 6f 69 64 20 2a 70 55 73 65 72 29 7b 0a 20 20 43  oid *pUser){.  C
d090: 72 65 61 74 65 46 75 6e 63 74 69 6f 6e 56 32 20  reateFunctionV2 
d0a0: 2a 70 20 3d 20 28 43 72 65 61 74 65 46 75 6e 63  *p = (CreateFunc
d0b0: 74 69 6f 6e 56 32 20 2a 29 70 55 73 65 72 3b 0a  tionV2 *)pUser;.
d0c0: 0a 20 20 69 66 28 20 70 2d 3e 69 6e 74 65 72 70  .  if( p->interp
d0d0: 20 26 26 20 70 2d 3e 70 44 65 73 74 72 6f 79 20   && p->pDestroy 
d0e0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
d0f0: 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 28 70 2d  Tcl_EvalObjEx(p-
d100: 3e 69 6e 74 65 72 70 2c 20 70 2d 3e 70 44 65 73  >interp, p->pDes
d110: 74 72 6f 79 2c 20 30 29 3b 0a 20 20 20 20 69 66  troy, 0);.    if
d120: 28 20 72 63 21 3d 54 43 4c 5f 4f 4b 20 29 20 54  ( rc!=TCL_OK ) T
d130: 63 6c 5f 42 61 63 6b 67 72 6f 75 6e 64 45 72 72  cl_BackgroundErr
d140: 6f 72 28 70 2d 3e 69 6e 74 65 72 70 29 3b 0a 20  or(p->interp);. 
d150: 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 70 46 75   }..  if( p->pFu
d160: 6e 63 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66  nc ) Tcl_DecrRef
d170: 43 6f 75 6e 74 28 70 2d 3e 70 46 75 6e 63 29 3b  Count(p->pFunc);
d180: 20 0a 20 20 69 66 28 20 70 2d 3e 70 53 74 65 70   .  if( p->pStep
d190: 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f   ) Tcl_DecrRefCo
d1a0: 75 6e 74 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a  unt(p->pStep); .
d1b0: 20 20 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20    if( p->pFinal 
d1c0: 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75  ) Tcl_DecrRefCou
d1d0: 6e 74 28 70 2d 3e 70 46 69 6e 61 6c 29 3b 20 0a  nt(p->pFinal); .
d1e0: 20 20 69 66 28 20 70 2d 3e 70 44 65 73 74 72 6f    if( p->pDestro
d1f0: 79 20 29 20 54 63 6c 5f 44 65 63 72 52 65 66 43  y ) Tcl_DecrRefC
d200: 6f 75 6e 74 28 70 2d 3e 70 44 65 73 74 72 6f 79  ount(p->pDestroy
d210: 29 3b 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  ); .  sqlite3_fr
d220: 65 65 28 70 29 3b 0a 7d 0a 73 74 61 74 69 63 20  ee(p);.}.static 
d230: 69 6e 74 20 74 65 73 74 5f 63 72 65 61 74 65 5f  int test_create_
d240: 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 43  function_v2(.  C
d250: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
d260: 44 61 74 61 2c 20 20 20 20 20 20 20 20 20 20 2f  Data,          /
d270: 2a 20 4e 6f 74 20 75 73 65 64 20 2a 2f 0a 20 20  * Not used */.  
d280: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
d290: 72 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rp,             
d2a0: 2f 2a 20 54 68 65 20 69 6e 76 6f 6b 69 6e 67 20  /* The invoking 
d2b0: 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
d2c0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d2e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
d2f0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
d300: 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
d310: 6f 62 6a 76 5b 5d 20 20 20 20 20 20 20 20 20 20  objv[]          
d320: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
d330: 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
d340: 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
d350: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 3b 0a  st char *zFunc;.
d360: 20 20 69 6e 74 20 6e 41 72 67 3b 0a 20 20 69 6e    int nArg;.  in
d370: 74 20 65 6e 63 3b 0a 20 20 43 72 65 61 74 65 46  t enc;.  CreateF
d380: 75 6e 63 74 69 6f 6e 56 32 20 2a 70 3b 0a 20 20  unctionV2 *p;.  
d390: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 72 63 3b  int i;.  int rc;
d3a0: 0a 0a 20 20 73 74 72 75 63 74 20 45 6e 63 54 61  ..  struct EncTa
d3b0: 62 6c 65 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  ble {.    const 
d3c0: 63 68 61 72 20 2a 7a 45 6e 63 3b 0a 20 20 20 20  char *zEnc;.    
d3d0: 69 6e 74 20 65 6e 63 3b 0a 20 20 7d 20 61 45 6e  int enc;.  } aEn
d3e0: 63 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 22 75 74  c[] = {.    {"ut
d3f0: 66 38 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 55  f8",    SQLITE_U
d400: 54 46 38 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66  TF8 },.    {"utf
d410: 31 36 22 2c 20 20 20 53 51 4c 49 54 45 5f 55 54  16",   SQLITE_UT
d420: 46 31 36 20 7d 2c 0a 20 20 20 20 7b 22 75 74 66  F16 },.    {"utf
d430: 31 36 6c 65 22 2c 20 53 51 4c 49 54 45 5f 55 54  16le", SQLITE_UT
d440: 46 31 36 4c 45 20 7d 2c 0a 20 20 20 20 7b 22 75  F16LE },.    {"u
d450: 74 66 31 36 62 65 22 2c 20 53 51 4c 49 54 45 5f  tf16be", SQLITE_
d460: 55 54 46 31 36 42 45 20 7d 2c 0a 20 20 20 20 7b  UTF16BE },.    {
d470: 22 61 6e 79 22 2c 20 20 20 20 20 53 51 4c 49 54  "any",     SQLIT
d480: 45 5f 41 4e 59 20 7d 2c 0a 20 20 20 20 7b 22 30  E_ANY },.    {"0
d490: 22 2c 20 30 20 7d 0a 20 20 7d 3b 0a 0a 20 20 69  ", 0 }.  };..  i
d4a0: 66 28 20 6f 62 6a 63 3c 35 20 7c 7c 20 28 6f 62  f( objc<5 || (ob
d4b0: 6a 63 25 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  jc%2)==0 ){.    
d4c0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
d4d0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
d4e0: 2c 20 22 44 42 20 4e 41 4d 45 20 4e 41 52 47 20  , "DB NAME NARG 
d4f0: 45 4e 43 20 53 57 49 54 43 48 45 53 2e 2e 2e 22  ENC SWITCHES..."
d500: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
d510: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
d520: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
d530: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
d540: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
d550: 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
d560: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46 75 6e  CL_ERROR;.  zFun
d570: 63 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  c = Tcl_GetStrin
d580: 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
d590: 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
d5a0: 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
d5b0: 5b 33 5d 2c 20 26 6e 41 72 67 29 20 29 20 72 65  [3], &nArg) ) re
d5c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
d5d0: 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 64    if( Tcl_GetInd
d5e0: 65 78 46 72 6f 6d 4f 62 6a 53 74 72 75 63 74 28  exFromObjStruct(
d5f0: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c  interp, objv[4],
d600: 20 61 45 6e 63 2c 20 73 69 7a 65 6f 66 28 61 45   aEnc, sizeof(aE
d610: 6e 63 5b 30 5d 29 2c 20 0a 20 20 20 20 20 20 20  nc[0]), .       
d620: 20 20 20 22 65 6e 63 6f 64 69 6e 67 22 2c 20 30     "encoding", 0
d630: 2c 20 26 65 6e 63 29 0a 20 20 29 7b 0a 20 20 20  , &enc).  ){.   
d640: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
d650: 52 3b 0a 20 20 7d 0a 20 20 65 6e 63 20 3d 20 61  R;.  }.  enc = a
d660: 45 6e 63 5b 65 6e 63 5d 2e 65 6e 63 3b 0a 0a 20  Enc[enc].enc;.. 
d670: 20 70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c   p = sqlite3_mal
d680: 6c 6f 63 28 73 69 7a 65 6f 66 28 43 72 65 61 74  loc(sizeof(Creat
d690: 65 46 75 6e 63 74 69 6f 6e 56 32 29 29 3b 0a 20  eFunctionV2));. 
d6a0: 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20   assert( p );.  
d6b0: 6d 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a  memset(p, 0, siz
d6c0: 65 6f 66 28 43 72 65 61 74 65 46 75 6e 63 74 69  eof(CreateFuncti
d6d0: 6f 6e 56 32 29 29 3b 0a 20 20 70 2d 3e 69 6e 74  onV2));.  p->int
d6e0: 65 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 0a 20  erp = interp;.. 
d6f0: 20 66 6f 72 28 69 3d 35 3b 20 69 3c 6f 62 6a 63   for(i=5; i<objc
d700: 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20 69 6e 74  ; i+=2){.    int
d710: 20 69 53 77 69 74 63 68 3b 0a 20 20 20 20 63 6f   iSwitch;.    co
d720: 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 77 69 74  nst char *azSwit
d730: 63 68 5b 5d 20 3d 20 7b 22 2d 66 75 6e 63 22 2c  ch[] = {"-func",
d740: 20 22 2d 73 74 65 70 22 2c 20 22 2d 66 69 6e 61   "-step", "-fina
d750: 6c 22 2c 20 22 2d 64 65 73 74 72 6f 79 22 2c 20  l", "-destroy", 
d760: 30 7d 3b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f  0};.    if( Tcl_
d770: 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 28  GetIndexFromObj(
d780: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 69 5d 2c  interp, objv[i],
d790: 20 61 7a 53 77 69 74 63 68 2c 20 22 73 77 69 74   azSwitch, "swit
d7a0: 63 68 22 2c 20 30 2c 20 26 69 53 77 69 74 63 68  ch", 0, &iSwitch
d7b0: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
d7c0: 65 33 5f 66 72 65 65 28 70 29 3b 0a 20 20 20 20  e3_free(p);.    
d7d0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
d7e0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73  OR;.    }..    s
d7f0: 77 69 74 63 68 28 20 69 53 77 69 74 63 68 20 29  witch( iSwitch )
d800: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 30 3a 20  {.      case 0: 
d810: 70 2d 3e 70 46 75 6e 63 20 3d 20 6f 62 6a 76 5b  p->pFunc = objv[
d820: 69 2b 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b  i+1];      break
d830: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 31 3a 20  ;.      case 1: 
d840: 70 2d 3e 70 53 74 65 70 20 3d 20 6f 62 6a 76 5b  p->pStep = objv[
d850: 69 2b 31 5d 3b 20 20 20 20 20 20 62 72 65 61 6b  i+1];      break
d860: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 32 3a 20  ;.      case 2: 
d870: 70 2d 3e 70 46 69 6e 61 6c 20 3d 20 6f 62 6a 76  p->pFinal = objv
d880: 5b 69 2b 31 5d 3b 20 20 20 20 20 62 72 65 61 6b  [i+1];     break
d890: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 33 3a 20  ;.      case 3: 
d8a0: 70 2d 3e 70 44 65 73 74 72 6f 79 20 3d 20 6f 62  p->pDestroy = ob
d8b0: 6a 76 5b 69 2b 31 5d 3b 20 20 20 62 72 65 61 6b  jv[i+1];   break
d8c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
d8d0: 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 70 2d 3e  ( p->pFunc ) p->
d8e0: 70 46 75 6e 63 20 3d 20 54 63 6c 5f 44 75 70 6c  pFunc = Tcl_Dupl
d8f0: 69 63 61 74 65 4f 62 6a 28 70 2d 3e 70 46 75 6e  icateObj(p->pFun
d900: 63 29 3b 20 0a 20 20 69 66 28 20 70 2d 3e 70 53  c); .  if( p->pS
d910: 74 65 70 20 29 20 70 2d 3e 70 53 74 65 70 20 3d  tep ) p->pStep =
d920: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
d930: 6a 28 70 2d 3e 70 53 74 65 70 29 3b 20 0a 20 20  j(p->pStep); .  
d940: 69 66 28 20 70 2d 3e 70 46 69 6e 61 6c 20 29 20  if( p->pFinal ) 
d950: 70 2d 3e 70 46 69 6e 61 6c 20 3d 20 54 63 6c 5f  p->pFinal = Tcl_
d960: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
d970: 70 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20  pFinal); .  if( 
d980: 70 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 70 2d  p->pDestroy ) p-
d990: 3e 70 44 65 73 74 72 6f 79 20 3d 20 54 63 6c 5f  >pDestroy = Tcl_
d9a0: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 70 2d 3e  DuplicateObj(p->
d9b0: 70 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20 69  pDestroy); ..  i
d9c0: 66 28 20 70 2d 3e 70 46 75 6e 63 20 29 20 54 63  f( p->pFunc ) Tc
d9d0: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70  l_IncrRefCount(p
d9e0: 2d 3e 70 46 75 6e 63 29 3b 20 0a 20 20 69 66 28  ->pFunc); .  if(
d9f0: 20 70 2d 3e 70 53 74 65 70 20 29 20 54 63 6c 5f   p->pStep ) Tcl_
da00: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e  IncrRefCount(p->
da10: 70 53 74 65 70 29 3b 20 0a 20 20 69 66 28 20 70  pStep); .  if( p
da20: 2d 3e 70 46 69 6e 61 6c 20 29 20 54 63 6c 5f 49  ->pFinal ) Tcl_I
da30: 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d 3e 70  ncrRefCount(p->p
da40: 46 69 6e 61 6c 29 3b 20 0a 20 20 69 66 28 20 70  Final); .  if( p
da50: 2d 3e 70 44 65 73 74 72 6f 79 20 29 20 54 63 6c  ->pDestroy ) Tcl
da60: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 2d  _IncrRefCount(p-
da70: 3e 70 44 65 73 74 72 6f 79 29 3b 20 0a 0a 20 20  >pDestroy); ..  
da80: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
da90: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28  ate_function_v2(
daa0: 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c  db, zFunc, nArg,
dab0: 20 65 6e 63 2c 20 28 76 6f 69 64 20 2a 29 70 2c   enc, (void *)p,
dac0: 20 0a 20 20 20 20 20 20 28 70 2d 3e 70 46 75 6e   .      (p->pFun
dad0: 63 20 3f 20 63 66 32 46 75 6e 63 20 3a 20 30 29  c ? cf2Func : 0)
dae0: 2c 0a 20 20 20 20 20 20 28 70 2d 3e 70 53 74 65  ,.      (p->pSte
daf0: 70 20 3f 20 63 66 32 53 74 65 70 20 3a 20 30 29  p ? cf2Step : 0)
db00: 2c 0a 20 20 20 20 20 20 28 70 2d 3e 70 46 69 6e  ,.      (p->pFin
db10: 61 6c 20 3f 20 63 66 32 46 69 6e 61 6c 20 3a 20  al ? cf2Final : 
db20: 30 29 2c 0a 20 20 20 20 20 20 63 66 32 44 65 73  0),.      cf2Des
db30: 74 72 6f 79 0a 20 20 29 3b 0a 20 20 69 66 28 20  troy.  );.  if( 
db40: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
db50: 0a 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65  .    Tcl_ResetRe
db60: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20  sult(interp);.  
db70: 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
db80: 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74  lt(interp, sqlit
db90: 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30  e3ErrName(rc), 0
dba0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
dbb0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
dbc0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
dbd0: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71  ./*.** Usage: sq
dbe0: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
dbf0: 73 69 6f 6e 20 44 42 2d 48 41 4e 44 4c 45 20 46  sion DB-HANDLE F
dc00: 49 4c 45 20 3f 50 52 4f 43 3f 0a 2a 2f 0a 73 74  ILE ?PROC?.*/.st
dc10: 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c 6f  atic int test_lo
dc20: 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 0a 20 20  ad_extension(.  
dc30: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
dc40: 74 44 61 74 61 2c 20 2f 2a 20 4e 6f 74 20 75 73  tData, /* Not us
dc50: 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
dc60: 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
dc70: 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
dc80: 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
dc90: 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
dca0: 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
dcc0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
dcd0: 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
dce0: 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
dcf0: 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
dd00: 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f  nts */.){.  Tcl_
dd10: 43 6d 64 49 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b  CmdInfo cmdInfo;
dd20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
dd30: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
dd40: 20 2a 7a 44 62 3b 0a 20 20 63 68 61 72 20 2a 7a   *zDb;.  char *z
dd50: 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 2a 7a 50  File;.  char *zP
dd60: 72 6f 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  roc = 0;.  char 
dd70: 2a 7a 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66  *zErr = 0;..  if
dd80: 28 20 6f 62 6a 63 21 3d 34 20 26 26 20 6f 62 6a  ( objc!=4 && obj
dd90: 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
dda0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
ddb0: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44  erp, 1, objv, "D
ddc0: 42 2d 48 41 4e 44 4c 45 20 46 49 4c 45 20 3f 50  B-HANDLE FILE ?P
ddd0: 52 4f 43 3f 22 29 3b 0a 20 20 20 20 72 65 74 75  ROC?");.    retu
dde0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
ddf0: 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47 65  }.  zDb = Tcl_Ge
de00: 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
de10: 3b 0a 20 20 7a 46 69 6c 65 20 3d 20 54 63 6c 5f  ;.  zFile = Tcl_
de20: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
de30: 5d 29 3b 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d  ]);.  if( objc==
de40: 34 20 29 7b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  4 ){.    zProc =
de50: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
de60: 62 6a 76 5b 33 5d 29 3b 0a 20 20 7d 0a 0a 20 20  bjv[3]);.  }..  
de70: 2f 2a 20 45 78 74 72 61 63 74 20 74 68 65 20 43  /* Extract the C
de80: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
de90: 20 66 72 6f 6d 20 74 68 65 20 54 63 6c 20 63 6f   from the Tcl co
dea0: 6d 6d 61 6e 64 20 6e 61 6d 65 20 2a 2f 0a 20 20  mmand name */.  
deb0: 69 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d  if( !Tcl_GetComm
dec0: 61 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  andInfo(interp, 
ded0: 7a 44 62 2c 20 26 63 6d 64 49 6e 66 6f 29 20 29  zDb, &cmdInfo) )
dee0: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
def0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
df00: 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e  command not foun
df10: 64 3a 20 22 2c 20 7a 44 62 2c 20 28 63 68 61 72  d: ", zDb, (char
df20: 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
df30: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
df40: 20 20 64 62 20 3d 20 28 28 73 74 72 75 63 74 20    db = ((struct 
df50: 53 71 6c 69 74 65 44 62 2a 29 63 6d 64 49 6e 66  SqliteDb*)cmdInf
df60: 6f 2e 6f 62 6a 43 6c 69 65 6e 74 44 61 74 61 29  o.objClientData)
df70: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 64  ->db;.  assert(d
df80: 62 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74  b);..  /* Call t
df90: 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 43 20  he underlying C 
dfa0: 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 61 6e 20  function. If an 
dfb0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
dfc0: 74 20 72 63 20 74 6f 20 0a 20 20 2a 2a 20 54 43  t rc to .  ** TC
dfd0: 4c 5f 45 52 52 4f 52 20 61 6e 64 20 6c 6f 61 64  L_ERROR and load
dfe0: 20 61 6e 79 20 65 72 72 6f 72 20 73 74 72 69 6e   any error strin
dff0: 67 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72  g into the inter
e000: 70 72 65 74 65 72 2e 20 49 66 20 6e 6f 20 0a 20  preter. If no . 
e010: 20 2a 2a 20 65 72 72 6f 72 20 6f 63 63 75 72 73   ** error occurs
e020: 2c 20 73 65 74 20 72 63 20 74 6f 20 54 43 4c 5f  , set rc to TCL_
e030: 4f 4b 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  OK..  */.#ifdef 
e040: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
e050: 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 72 63 20  _EXTENSION.  rc 
e060: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
e070: 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
e080: 5f 6d 70 72 69 6e 74 66 28 22 74 68 69 73 20 62  _mprintf("this b
e090: 75 69 6c 64 20 6f 6d 69 74 73 20 73 71 6c 69 74  uild omits sqlit
e0a0: 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
e0b0: 6e 28 29 22 29 3b 0a 23 65 6c 73 65 0a 20 20 72  n()");.#else.  r
e0c0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64  c = sqlite3_load
e0d0: 5f 65 78 74 65 6e 73 69 6f 6e 28 64 62 2c 20 7a  _extension(db, z
e0e0: 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
e0f0: 72 72 29 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  rr);.#endif.  if
e100: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e110: 29 7b 0a 20 20 20 20 54 63 6c 5f 53 65 74 52 65  ){.    Tcl_SetRe
e120: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 45 72  sult(interp, zEr
e130: 72 20 3f 20 7a 45 72 72 20 3a 20 22 22 2c 20 54  r ? zErr : "", T
e140: 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
e150: 20 20 72 63 20 3d 20 54 43 4c 5f 45 52 52 4f 52    rc = TCL_ERROR
e160: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
e170: 63 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 20 20 7d 0a  c = TCL_OK;.  }.
e180: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e190: 45 72 72 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Err);..  return 
e1a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  rc;.}../*.** Usa
e1b0: 67 65 3a 20 73 71 6c 69 74 65 33 5f 65 6e 61 62  ge: sqlite3_enab
e1c0: 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
e1d0: 6e 20 44 42 2d 48 41 4e 44 4c 45 20 4f 4e 4f 46  n DB-HANDLE ONOF
e1e0: 46 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  F.*/.static int 
e1f0: 74 65 73 74 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64  test_enable_load
e200: 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
e210: 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 4e 6f  lientData, /* No
e220: 74 20 75 73 65 64 20 2a 2f 0a 20 20 54 63 6c 5f  t used */.  Tcl_
e230: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
e240: 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
e250: 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
e260: 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
e270: 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
e280: 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
e290: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
e2a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
e2b0: 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
e2c0: 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
e2d0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
e2e0: 54 63 6c 5f 43 6d 64 49 6e 66 6f 20 63 6d 64 49  Tcl_CmdInfo cmdI
e2f0: 6e 66 6f 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  nfo;.  sqlite3 *
e300: 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 3b  db;.  char *zDb;
e310: 0a 20 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 0a 20  .  int onoff;.. 
e320: 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
e330: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
e340: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
e350: 6f 62 6a 76 2c 20 22 44 42 2d 48 41 4e 44 4c 45  objv, "DB-HANDLE
e360: 20 4f 4e 4f 46 46 22 29 3b 0a 20 20 20 20 72 65   ONOFF");.    re
e370: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
e380: 20 20 7d 0a 20 20 7a 44 62 20 3d 20 54 63 6c 5f    }.  zDb = Tcl_
e390: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
e3a0: 5d 29 3b 0a 0a 20 20 2f 2a 20 45 78 74 72 61 63  ]);..  /* Extrac
e3b0: 74 20 74 68 65 20 43 20 64 61 74 61 62 61 73 65  t the C database
e3c0: 20 68 61 6e 64 6c 65 20 66 72 6f 6d 20 74 68 65   handle from the
e3d0: 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d   Tcl command nam
e3e0: 65 20 2a 2f 0a 20 20 69 66 28 20 21 54 63 6c 5f  e */.  if( !Tcl_
e3f0: 47 65 74 43 6f 6d 6d 61 6e 64 49 6e 66 6f 28 69  GetCommandInfo(i
e400: 6e 74 65 72 70 2c 20 7a 44 62 2c 20 26 63 6d 64  nterp, zDb, &cmd
e410: 49 6e 66 6f 29 20 29 7b 0a 20 20 20 20 54 63 6c  Info) ){.    Tcl
e420: 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
e430: 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e 64 20 6e  terp, "command n
e440: 6f 74 20 66 6f 75 6e 64 3a 20 22 2c 20 7a 44 62  ot found: ", zDb
e450: 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
e460: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
e470: 52 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 28 28  R;.  }.  db = ((
e480: 73 74 72 75 63 74 20 53 71 6c 69 74 65 44 62 2a  struct SqliteDb*
e490: 29 63 6d 64 49 6e 66 6f 2e 6f 62 6a 43 6c 69 65  )cmdInfo.objClie
e4a0: 6e 74 44 61 74 61 29 2d 3e 64 62 3b 0a 20 20 61  ntData)->db;.  a
e4b0: 73 73 65 72 74 28 64 62 29 3b 0a 0a 20 20 2f 2a  ssert(db);..  /*
e4c0: 20 47 65 74 20 74 68 65 20 6f 6e 6f 66 66 20 70   Get the onoff p
e4d0: 61 72 61 6d 65 74 65 72 20 2a 2f 0a 20 20 69 66  arameter */.  if
e4e0: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
e4f0: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
e500: 6f 62 6a 76 5b 32 5d 2c 20 26 6f 6e 6f 66 66 29  objv[2], &onoff)
e510: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
e520: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 23  CL_ERROR;.  }..#
e530: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
e540: 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e  T_LOAD_EXTENSION
e550: 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73  .  Tcl_AppendRes
e560: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 74 68 69  ult(interp, "thi
e570: 73 20 62 75 69 6c 64 20 6f 6d 69 74 73 20 73 71  s build omits sq
e580: 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
e590: 73 69 6f 6e 28 29 22 29 3b 0a 20 20 72 65 74 75  sion()");.  retu
e5a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 23 65  rn TCL_ERROR;.#e
e5b0: 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 5f 65 6e  lse.  sqlite3_en
e5c0: 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73  able_load_extens
e5d0: 69 6f 6e 28 64 62 2c 20 6f 6e 6f 66 66 29 3b 0a  ion(db, onoff);.
e5e0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
e5f0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
e600: 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
e610: 61 62 6f 72 74 0a 2a 2a 0a 2a 2a 20 53 68 75 74  abort.**.** Shut
e620: 64 6f 77 6e 20 74 68 65 20 70 72 6f 63 65 73 73  down the process
e630: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 20 20 54   immediately.  T
e640: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 63 6c 65  his is not a cle
e650: 61 6e 20 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 20  an shutdown..** 
e660: 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
e670: 75 73 65 64 20 74 6f 20 74 65 73 74 20 74 68 65  used to test the
e680: 20 72 65 63 6f 76 65 72 61 62 69 6c 69 74 79 20   recoverability 
e690: 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 69 6e  of a database in
e6a0: 0a 2a 2a 20 74 68 65 20 65 76 65 6e 74 20 6f 66  .** the event of
e6b0: 20 61 20 70 72 6f 67 72 61 6d 20 63 72 61 73 68   a program crash
e6c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
e6d0: 73 71 6c 69 74 65 5f 61 62 6f 72 74 28 0a 20 20  sqlite_abort(.  
e6e0: 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20  void *NotUsed,. 
e6f0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
e700: 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
e710: 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
e720: 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
e730: 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
e740: 74 20 61 72 67 63 2c 20 20 20 20 20 20 20 20 20  t argc,         
e750: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
e760: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
e770: 20 63 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20   char **argv    
e780: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20          /* Text 
e790: 6f 66 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  of each argument
e7a0: 20 2a 2f 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e   */.){.#if defin
e7b0: 65 64 28 5f 4d 53 43 5f 56 45 52 29 0a 20 20 2f  ed(_MSC_VER).  /
e7c0: 2a 20 57 65 20 64 6f 20 74 68 69 73 2c 20 6f 74  * We do this, ot
e7d0: 68 65 72 77 69 73 65 20 74 68 65 20 74 65 73 74  herwise the test
e7e0: 20 77 69 6c 6c 20 68 61 6c 74 20 77 69 74 68 20   will halt with 
e7f0: 61 20 70 6f 70 75 70 20 6d 65 73 73 61 67 65 0a  a popup message.
e800: 20 20 20 2a 20 74 68 61 74 20 77 65 20 68 61 76     * that we hav
e810: 65 20 74 6f 20 63 6c 69 63 6b 20 61 77 61 79 20  e to click away 
e820: 62 65 66 6f 72 65 20 74 68 65 20 74 65 73 74 20  before the test 
e830: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 2e 0a 20  will continue.. 
e840: 20 20 2a 2f 0a 20 20 5f 73 65 74 5f 61 62 6f 72    */.  _set_abor
e850: 74 5f 62 65 68 61 76 69 6f 72 28 20 30 2c 20 5f  t_behavior( 0, _
e860: 43 41 4c 4c 5f 52 45 50 4f 52 54 46 41 55 4c 54  CALL_REPORTFAULT
e870: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 69   );.#endif.  exi
e880: 74 28 32 35 35 29 3b 0a 20 20 61 73 73 65 72 74  t(255);.  assert
e890: 28 20 69 6e 74 65 72 70 3d 3d 30 20 29 3b 20 20  ( interp==0 );  
e8a0: 20 2f 2a 20 54 68 69 73 20 77 69 6c 6c 20 61 6c   /* This will al
e8b0: 77 61 79 73 20 66 61 69 6c 20 2a 2f 0a 20 20 72  ways fail */.  r
e8c0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
e8d0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
e8e0: 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20  wing routine is 
e8f0: 61 20 75 73 65 72 2d 64 65 66 69 6e 65 64 20 53  a user-defined S
e900: 51 4c 20 66 75 6e 63 74 69 6f 6e 20 77 68 6f 73  QL function whos
e910: 65 20 70 75 72 70 6f 73 65 0a 2a 2a 20 69 73 20  e purpose.** is 
e920: 74 6f 20 74 65 73 74 20 74 68 65 20 73 71 6c 69  to test the sqli
e930: 74 65 5f 73 65 74 5f 72 65 73 75 6c 74 28 29 20  te_set_result() 
e940: 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  API..*/.static v
e950: 6f 69 64 20 74 65 73 74 46 75 6e 63 28 73 71 6c  oid testFunc(sql
e960: 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 63 6f  ite3_context *co
e970: 6e 74 65 78 74 2c 20 69 6e 74 20 61 72 67 63 2c  ntext, int argc,
e980: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
e990: 2a 61 72 67 76 29 7b 0a 20 20 77 68 69 6c 65 28  *argv){.  while(
e9a0: 20 61 72 67 63 3e 3d 32 20 29 7b 0a 20 20 20 20   argc>=2 ){.    
e9b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
e9c0: 30 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  0 = (char*)sqlit
e9d0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
e9e0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 69 66 28 20  gv[0]);.    if( 
e9f0: 7a 41 72 67 30 20 29 7b 0a 20 20 20 20 20 20 69  zArg0 ){.      i
ea00: 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
ea10: 49 43 6d 70 28 7a 41 72 67 30 2c 20 22 69 6e 74  ICmp(zArg0, "int
ea20: 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ") ){.        sq
ea30: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 69 6e 74  lite3_result_int
ea40: 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c 69 74 65  (context, sqlite
ea50: 33 5f 76 61 6c 75 65 5f 69 6e 74 28 61 72 67 76  3_value_int(argv
ea60: 5b 31 5d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  [1]));.      }el
ea70: 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  se if( sqlite3St
ea80: 72 49 43 6d 70 28 7a 41 72 67 30 2c 22 69 6e 74  rICmp(zArg0,"int
ea90: 36 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  64")==0 ){.     
eaa0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
eab0: 74 5f 69 6e 74 36 34 28 63 6f 6e 74 65 78 74 2c  t_int64(context,
eac0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 69   sqlite3_value_i
ead0: 6e 74 36 34 28 61 72 67 76 5b 31 5d 29 29 3b 0a  nt64(argv[1]));.
eae0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
eaf0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
eb00: 41 72 67 30 2c 22 73 74 72 69 6e 67 22 29 3d 3d  Arg0,"string")==
eb10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
eb20: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
eb30: 28 63 6f 6e 74 65 78 74 2c 20 28 63 68 61 72 2a  (context, (char*
eb40: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
eb50: 65 78 74 28 61 72 67 76 5b 31 5d 29 2c 20 2d 31  ext(argv[1]), -1
eb60: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ,.            SQ
eb70: 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
eb80: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
eb90: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
eba0: 7a 41 72 67 30 2c 22 64 6f 75 62 6c 65 22 29 3d  zArg0,"double")=
ebb0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
ebc0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 64 6f 75  lite3_result_dou
ebd0: 62 6c 65 28 63 6f 6e 74 65 78 74 2c 20 73 71 6c  ble(context, sql
ebe0: 69 74 65 33 5f 76 61 6c 75 65 5f 64 6f 75 62 6c  ite3_value_doubl
ebf0: 65 28 61 72 67 76 5b 31 5d 29 29 3b 0a 20 20 20  e(argv[1]));.   
ec00: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
ec10: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 72 67  ite3StrICmp(zArg
ec20: 30 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a  0,"null")==0 ){.
ec30: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
ec40: 72 65 73 75 6c 74 5f 6e 75 6c 6c 28 63 6f 6e 74  result_null(cont
ec50: 65 78 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ext);.      }els
ec60: 65 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72  e if( sqlite3Str
ec70: 49 43 6d 70 28 7a 41 72 67 30 2c 22 76 61 6c 75  ICmp(zArg0,"valu
ec80: 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
ec90: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
eca0: 5f 76 61 6c 75 65 28 63 6f 6e 74 65 78 74 2c 20  _value(context, 
ecb0: 61 72 67 76 5b 73 71 6c 69 74 65 33 5f 76 61 6c  argv[sqlite3_val
ecc0: 75 65 5f 69 6e 74 28 61 72 67 76 5b 31 5d 29 5d  ue_int(argv[1])]
ecd0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
ece0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 72 72          goto err
ecf0: 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a  or_out;.      }.
ed00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ed10: 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
ed20: 0a 20 20 20 20 7d 0a 20 20 20 20 61 72 67 63 20  .    }.    argc 
ed30: 2d 3d 20 32 3b 0a 20 20 20 20 61 72 67 76 20 2b  -= 2;.    argv +
ed40: 3d 20 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 2;.  }.  retur
ed50: 6e 3b 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20  n;..error_out:. 
ed60: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
ed70: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 22 66  error(context,"f
ed80: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 73 68  irst argument sh
ed90: 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
eda0: 22 0a 20 20 20 20 20 20 22 69 6e 74 20 69 6e 74  ".      "int int
edb0: 36 34 20 73 74 72 69 6e 67 20 64 6f 75 62 6c 65  64 string double
edc0: 20 6e 75 6c 6c 20 76 61 6c 75 65 22 2c 20 2d 31   null value", -1
edd0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  );.}../*.** Usag
ede0: 65 3a 20 20 20 73 71 6c 69 74 65 5f 72 65 67 69  e:   sqlite_regi
edf0: 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74 69  ster_test_functi
ee00: 6f 6e 20 20 44 42 20 20 4e 41 4d 45 0a 2a 2a 0a  on  DB  NAME.**.
ee10: 2a 2a 20 52 65 67 69 73 74 65 72 20 74 68 65 20  ** Register the 
ee20: 74 65 73 74 20 53 51 4c 20 66 75 6e 63 74 69 6f  test SQL functio
ee30: 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  n on the databas
ee40: 65 20 44 42 20 75 6e 64 65 72 20 74 68 65 20 6e  e DB under the n
ee50: 61 6d 65 20 4e 41 4d 45 2e 0a 2a 2f 0a 73 74 61  ame NAME..*/.sta
ee60: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 72 65 67  tic int test_reg
ee70: 69 73 74 65 72 5f 66 75 6e 63 28 0a 20 20 76 6f  ister_func(.  vo
ee80: 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 54  id *NotUsed,.  T
ee90: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
eea0: 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
eeb0: 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
eec0: 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
eed0: 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
eee0: 61 72 67 63 2c 20 20 20 20 20 20 20 20 20 20 20  argc,           
eef0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
ef00: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63  arguments */.  c
ef10: 68 61 72 20 2a 2a 61 72 67 76 20 20 20 20 20 20  har **argv      
ef20: 20 20 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66        /* Text of
ef30: 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 20 2a   each argument *
ef40: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
ef50: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
ef60: 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
ef70: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
ef80: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
ef90: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
efa0: 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
efb0: 5d 2c 20 0a 20 20 20 20 20 20 20 22 20 44 42 20  ], .       " DB 
efc0: 46 55 4e 43 54 49 4f 4e 2d 4e 41 4d 45 22 2c 20  FUNCTION-NAME", 
efd0: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
efe0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
eff0: 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
f000: 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d  (interp, argv[1]
f010: 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20  , &db) ) return 
f020: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20  TCL_ERROR;.  rc 
f030: 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
f040: 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61 72  _function(db, ar
f050: 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49 54  gv[2], -1, SQLIT
f060: 45 5f 55 54 46 38 2c 20 30 2c 20 0a 20 20 20 20  E_UTF8, 0, .    
f070: 20 20 74 65 73 74 46 75 6e 63 2c 20 30 2c 20 30    testFunc, 0, 0
f080: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 30 20 29  );.  if( rc!=0 )
f090: 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
f0a0: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
f0b0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63 29  qlite3ErrStr(rc)
f0c0: 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
f0d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
f0e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
f0f0: 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
f100: 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72   db, rc) ) retur
f110: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
f120: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
f130: 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73  ./*.** Usage:  s
f140: 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 20  qlite3_finalize 
f150: 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 46 69 6e   STMT .**.** Fin
f160: 61 6c 69 7a 65 20 61 20 73 74 61 74 65 6d 65 6e  alize a statemen
f170: 74 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  t handle..*/.sta
f180: 74 69 63 20 69 6e 74 20 74 65 73 74 5f 66 69 6e  tic int test_fin
f190: 61 6c 69 7a 65 28 0a 20 20 76 6f 69 64 20 2a 20  alize(.  void * 
f1a0: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
f1b0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
f1c0: 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
f1d0: 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
f1e0: 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
f1f0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
f200: 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
f210: 74 65 33 20 2a 64 62 20 3d 20 30 3b 0a 0a 20 20  te3 *db = 0;..  
f220: 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20  if( objc!=2 ){. 
f230: 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
f240: 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
f250: 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
f260: 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20  d be \"",.      
f270: 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46    Tcl_GetStringF
f280: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20  romObj(objv[0], 
f290: 30 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30  0), " <STMT>", 0
f2a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
f2b0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
f2c0: 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
f2d0: 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
f2e0: 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
f2f0: 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
f300: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
f310: 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
f320: 20 20 20 64 62 20 3d 20 53 74 6d 74 54 6f 44 62     db = StmtToDb
f330: 28 70 53 74 6d 74 29 3b 0a 20 20 7d 0a 20 20 72  (pStmt);.  }.  r
f340: 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
f350: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 54  lize(pStmt);.  T
f360: 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
f370: 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31 45  erp, (char *)t1E
f380: 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  rrorName(rc), TC
f390: 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  L_STATIC);.  if(
f3a0: 20 64 62 20 26 26 20 73 71 6c 69 74 65 33 54 65   db && sqlite3Te
f3b0: 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
f3c0: 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
f3d0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
f3e0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
f3f0: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
f400: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
f410: 74 75 73 20 20 53 54 4d 54 20 20 43 4f 44 45 20  tus  STMT  CODE 
f420: 20 52 45 53 45 54 46 4c 41 47 0a 2a 2a 0a 2a 2a   RESETFLAG.**.**
f430: 20 47 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f   Get the value o
f440: 66 20 61 20 73 74 61 74 75 73 20 63 6f 75 6e 74  f a status count
f450: 65 72 20 66 72 6f 6d 20 61 20 73 74 61 74 65 6d  er from a statem
f460: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
f470: 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61  nt test_stmt_sta
f480: 74 75 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tus(.  void * cl
f490: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
f4a0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
f4b0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
f4c0: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
f4d0: 76 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 69 56 61  v[].){.  int iVa
f4e0: 6c 75 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 70  lue;.  int i, op
f4f0: 2c 20 72 65 73 65 74 46 6c 61 67 3b 0a 20 20 63  , resetFlag;.  c
f500: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 4e 61  onst char *zOpNa
f510: 6d 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  me;.  sqlite3_st
f520: 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 73 74  mt *pStmt;..  st
f530: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
f540: 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
f550: 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 69  ar *zName;.    i
f560: 6e 74 20 6f 70 3b 0a 20 20 7d 20 61 4f 70 5b 5d  nt op;.  } aOp[]
f570: 20 3d 20 7b 0a 20 20 20 20 7b 20 22 53 51 4c 49   = {.    { "SQLI
f580: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46 55  TE_STMTSTATUS_FU
f590: 4c 4c 53 43 41 4e 5f 53 54 45 50 22 2c 20 20 20  LLSCAN_STEP",   
f5a0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f5b0: 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 20  S_FULLSCAN_STEP 
f5c0: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
f5d0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 53 4f  TE_STMTSTATUS_SO
f5e0: 52 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  RT",            
f5f0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f600: 53 5f 53 4f 52 54 20 20 20 20 20 20 20 20 20 20  S_SORT          
f610: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
f620: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
f630: 54 4f 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20  TOINDEX",       
f640: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f650: 53 5f 41 55 54 4f 49 4e 44 45 58 20 20 20 20 20  S_AUTOINDEX     
f660: 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
f670: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d  TE_STMTSTATUS_VM
f680: 5f 53 54 45 50 22 2c 20 20 20 20 20 20 20 20 20  _STEP",         
f690: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f6a0: 53 5f 56 4d 5f 53 54 45 50 20 20 20 20 20 20 20  S_VM_STEP       
f6b0: 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 66 28 20    },.  };.  if( 
f6c0: 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54  objc!=4 ){.    T
f6d0: 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
f6e0: 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
f6f0: 20 22 53 54 4d 54 20 50 41 52 41 4d 45 54 45 52   "STMT PARAMETER
f700: 20 52 45 53 45 54 46 4c 41 47 22 29 3b 0a 20 20   RESETFLAG");.  
f710: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
f720: 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
f730: 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74  tStmtPointer(int
f740: 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
f750: 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53  ng(objv[1]), &pS
f760: 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
f770: 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 4f 70 4e 61  L_ERROR;.  zOpNa
f780: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69  me = Tcl_GetStri
f790: 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 66  ng(objv[2]);.  f
f7a0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
f7b0: 69 7a 65 28 61 4f 70 29 3b 20 69 2b 2b 29 7b 0a  ize(aOp); i++){.
f7c0: 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
f7d0: 4f 70 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 7a 4f 70  Op[i].zName, zOp
f7e0: 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  Name)==0 ){.    
f7f0: 20 20 6f 70 20 3d 20 61 4f 70 5b 69 5d 2e 6f 70    op = aOp[i].op
f800: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f810: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 69     }.  }.  if( i
f820: 3e 3d 41 72 72 61 79 53 69 7a 65 28 61 4f 70 29  >=ArraySize(aOp)
f830: 20 29 7b 0a 20 20 20 20 69 66 28 20 54 63 6c 5f   ){.    if( Tcl_
f840: 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
f850: 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
f860: 6f 70 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  op) ) return TCL
f870: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
f880: 28 20 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e  ( Tcl_GetBoolean
f890: 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20  FromObj(interp, 
f8a0: 6f 62 6a 76 5b 33 5d 2c 20 26 72 65 73 65 74 46  objv[3], &resetF
f8b0: 6c 61 67 29 20 29 20 72 65 74 75 72 6e 20 54 43  lag) ) return TC
f8c0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 56 61 6c 75  L_ERROR;.  iValu
f8d0: 65 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  e = sqlite3_stmt
f8e0: 5f 73 74 61 74 75 73 28 70 53 74 6d 74 2c 20 6f  _status(pStmt, o
f8f0: 70 2c 20 72 65 73 65 74 46 6c 61 67 29 3b 0a 20  p, resetFlag);. 
f900: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
f910: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
f920: 77 49 6e 74 4f 62 6a 28 69 56 61 6c 75 65 29 29  wIntObj(iValue))
f930: 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
f940: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
f950: 65 3a 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  e:  sqlite3_next
f960: 5f 73 74 6d 74 20 20 44 42 20 20 53 54 4d 54 0a  _stmt  DB  STMT.
f970: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
f980: 20 6e 65 78 74 20 73 74 61 74 6d 65 6e 74 20 69   next statment i
f990: 6e 20 73 65 71 75 65 6e 63 65 20 61 66 74 65 72  n sequence after
f9a0: 20 53 54 4d 54 2e 0a 2a 2f 0a 73 74 61 74 69 63   STMT..*/.static
f9b0: 20 69 6e 74 20 74 65 73 74 5f 6e 65 78 74 5f 73   int test_next_s
f9c0: 74 6d 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  tmt(.  void * cl
f9d0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
f9e0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
f9f0: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
fa00: 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
fa10: 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
fa20: 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
fa30: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b  sqlite3 *db = 0;
fa40: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  .  char zBuf[50]
fa50: 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
fa60: 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
fa70: 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
fa80: 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
fa90: 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
faa0: 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
fab0: 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
fac0: 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 20 53 54  [0], 0), " DB ST
fad0: 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  MT", 0);.    ret
fae0: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
faf0: 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44 62 50   }..  if( getDbP
fb00: 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
fb10: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
fb20: 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
fb30: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
fb40: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
fb50: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
fb60: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
fb70: 32 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  2]), &pStmt) ) r
fb80: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fb90: 0a 20 20 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  .  pStmt = sqlit
fba0: 65 33 5f 6e 65 78 74 5f 73 74 6d 74 28 64 62 2c  e3_next_stmt(db,
fbb0: 20 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 70   pStmt);.  if( p
fbc0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20  Stmt ){.    if( 
fbd0: 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50  sqlite3TestMakeP
fbe0: 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70  ointerStr(interp
fbf0: 2c 20 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29  , zBuf, pStmt) )
fc00: 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
fc10: 52 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  R;.    Tcl_Appen
fc20: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fc30: 7a 42 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  zBuf, 0);.  }.  
fc40: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
fc50: 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
fc60: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65 61  sqlite3_stmt_rea
fc70: 64 6f 6e 6c 79 20 20 53 54 4d 54 0a 2a 2a 0a 2a  donly  STMT.**.*
fc80: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
fc90: 20 53 54 4d 54 20 69 73 20 61 20 4e 55 4c 4c 20   STMT is a NULL 
fca0: 70 6f 69 6e 74 65 72 20 6f 72 20 61 20 70 6f 69  pointer or a poi
fcb0: 6e 74 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d  nter to a statem
fcc0: 65 6e 74 0a 2a 2a 20 74 68 61 74 20 69 73 20 67  ent.** that is g
fcd0: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 6c 65 61  uaranteed to lea
fce0: 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ve the database 
fcf0: 75 6e 6d 6f 64 69 66 69 65 64 2e 0a 2a 2f 0a 73  unmodified..*/.s
fd00: 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73  tatic int test_s
fd10: 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 0a 20 20  tmt_readonly(.  
fd20: 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
fd30: 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
fd40: 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
fd50: 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
fd60: 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
fd70: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
fd80: 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
fd90: 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
fda0: 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
fdb0: 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
fdc0: 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
fdd0: 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20  hould be \"",.  
fde0: 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
fdf0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b  ingFromObj(objv[
fe00: 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c  0], 0), " STMT",
fe10: 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
fe20: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
fe30: 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69    if( getStmtPoi
fe40: 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c  nter(interp, Tcl
fe50: 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
fe60: 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72  1]), &pStmt) ) r
fe70: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
fe80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
fe90: 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 28 70 53  stmt_readonly(pS
fea0: 74 6d 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  tmt);.  Tcl_SetO
feb0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
fec0: 20 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f   Tcl_NewBooleanO
fed0: 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72  bj(rc));.  retur
fee0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
fef0: 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74  ** Usage:  sqlit
ff00: 65 33 5f 73 74 6d 74 5f 62 75 73 79 20 20 53 54  e3_stmt_busy  ST
ff10: 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  MT.**.** Return 
ff20: 74 72 75 65 20 69 66 20 53 54 4d 54 20 69 73 20  true if STMT is 
ff30: 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 70 6f 69 6e 74  a non-NULL point
ff40: 65 72 20 74 6f 20 61 20 73 74 61 74 65 6d 65 6e  er to a statemen
ff50: 74 0a 2a 2a 20 74 68 61 74 20 68 61 73 20 62 65  t.** that has be
ff60: 65 6e 20 73 74 65 70 70 65 64 20 62 75 74 20 6e  en stepped but n
ff70: 6f 74 20 74 6f 20 63 6f 6d 70 6c 65 74 69 6f 6e  ot to completion
ff80: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ff90: 74 65 73 74 5f 73 74 6d 74 5f 62 75 73 79 28 0a  test_stmt_busy(.
ffa0: 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
ffb0: 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
ffc0: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
ffd0: 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
ffe0: 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
fff0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
10000 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72   *pStmt;.  int r
10010 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
10020 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  2 ){.    Tcl_App
10030 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10040 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
10050 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
10060 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
10070 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10080 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
10090 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
100a0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
100b0 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50  ..  if( getStmtP
100c0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
100d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
100e0 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29  v[1]), &pStmt) )
100f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
10100 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  R;.  rc = sqlite
10110 33 5f 73 74 6d 74 5f 62 75 73 79 28 70 53 74 6d  3_stmt_busy(pStm
10120 74 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  t);.  Tcl_SetObj
10130 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
10140 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62 6a  cl_NewBooleanObj
10150 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  (rc));.  return 
10160 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
10170 20 55 73 61 67 65 3a 20 20 75 73 65 73 5f 73 74   Usage:  uses_st
10180 6d 74 5f 6a 6f 75 72 6e 61 6c 20 20 53 54 4d 54  mt_journal  STMT
10190 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
101a0 75 65 20 69 66 20 53 54 4d 54 20 75 73 65 73 20  ue if STMT uses 
101b0 61 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  a statement jour
101c0 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nal..*/.static i
101d0 6e 74 20 75 73 65 73 5f 73 74 6d 74 5f 6a 6f 75  nt uses_stmt_jou
101e0 72 6e 61 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63  rnal(.  void * c
101f0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
10200 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
10210 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
10220 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
10230 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
10240 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a  3_stmt *pStmt;..
10250 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
10260 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
10270 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
10280 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
10290 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20  uld be \"",.    
102a0 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
102b0 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d  gFromObj(objv[0]
102c0 2c 20 30 29 2c 20 22 20 53 54 4d 54 22 2c 20 30  , 0), " STMT", 0
102d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
102e0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
102f0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
10300 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
10310 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
10320 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
10330 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10340 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 72 65   sqlite3_stmt_re
10350 61 64 6f 6e 6c 79 28 70 53 74 6d 74 29 3b 0a 20  adonly(pStmt);. 
10360 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
10370 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
10380 77 42 6f 6f 6c 65 61 6e 4f 62 6a 28 28 28 56 64  wBooleanObj(((Vd
10390 62 65 20 2a 29 70 53 74 6d 74 29 2d 3e 75 73 65  be *)pStmt)->use
103a0 73 53 74 6d 74 4a 6f 75 72 6e 61 6c 29 29 3b 0a  sStmtJournal));.
103b0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
103c0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  .}.../*.** Usage
103d0 3a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74  :  sqlite3_reset
103e0 20 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65    STMT .**.** Re
103f0 73 65 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20  set a statement 
10400 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  handle..*/.stati
10410 63 20 69 6e 74 20 74 65 73 74 5f 72 65 73 65 74  c int test_reset
10420 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
10430 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10440 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
10450 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
10460 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
10470 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
10480 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
10490 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
104a0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
104b0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
104c0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
104d0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
104e0 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65  ,.        Tcl_Ge
104f0 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f  tStringFromObj(o
10500 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 53  bjv[0], 0), " <S
10510 54 4d 54 3e 22 2c 20 30 29 3b 0a 20 20 20 20 72  TMT>", 0);.    r
10520 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
10530 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53  .  }..  if( getS
10540 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tmtPointer(inter
10550 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
10560 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d  (objv[1]), &pStm
10570 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
10580 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d 20 73  ERROR;..  rc = s
10590 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74  qlite3_reset(pSt
105a0 6d 74 29 3b 0a 20 20 69 66 28 20 70 53 74 6d 74  mt);.  if( pStmt
105b0 20 26 26 20 73 71 6c 69 74 65 33 54 65 73 74 45   && sqlite3TestE
105c0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
105d0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
105e0 72 63 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  rc) ){.    retur
105f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
10600 0a 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74  .  Tcl_SetResult
10610 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a  (interp, (char *
10620 29 74 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29  )t1ErrorName(rc)
10630 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 0a 2f  , TCL_STATIC);./
10640 2a 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  *.  if( rc ){.  
10650 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
10660 4f 52 3b 0a 20 20 7d 0a 2a 2f 0a 20 20 72 65 74  OR;.  }.*/.  ret
10670 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
10680 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
10690 69 74 65 33 5f 65 78 70 69 72 65 64 20 53 54 4d  ite3_expired STM
106a0 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  T .**.** Return 
106b0 54 52 55 45 20 69 66 20 61 20 72 65 63 6f 6d 70  TRUE if a recomp
106c0 69 6c 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73  ilation of the s
106d0 74 61 74 65 6d 65 6e 74 20 69 73 20 72 65 63 6f  tatement is reco
106e0 6d 6d 65 6e 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  mmended..*/.stat
106f0 69 63 20 69 6e 74 20 74 65 73 74 5f 65 78 70 69  ic int test_expi
10700 72 65 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  red(.  void * cl
10710 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
10720 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
10730 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
10740 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
10750 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53  v[].){.#ifndef S
10760 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
10770 43 41 54 45 44 0a 20 20 73 71 6c 69 74 65 33 5f  CATED.  sqlite3_
10780 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
10790 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
107a0 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
107b0 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
107c0 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
107d0 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
107e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
107f0 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
10800 29 2c 20 22 20 3c 53 54 4d 54 3e 22 2c 20 30 29  ), " <STMT>", 0)
10810 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
10820 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
10830 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72  ( getStmtPointer
10840 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
10850 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
10860 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72   &pStmt) ) retur
10870 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
10880 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
10890 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42  interp, Tcl_NewB
108a0 6f 6f 6c 65 61 6e 4f 62 6a 28 73 71 6c 69 74 65  ooleanObj(sqlite
108b0 33 5f 65 78 70 69 72 65 64 28 70 53 74 6d 74 29  3_expired(pStmt)
108c0 29 29 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74  ));.#endif.  ret
108d0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
108e0 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
108f0 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f 62 69  ite3_transfer_bi
10900 6e 64 69 6e 67 73 20 46 52 4f 4d 53 54 4d 54 20  ndings FROMSTMT 
10910 54 4f 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 54 72 61  TOSTMT.**.** Tra
10920 6e 73 66 65 72 20 61 6c 6c 20 62 69 6e 64 69 6e  nsfer all bindin
10930 67 73 20 66 72 6f 6d 20 46 52 4f 4d 53 54 4d 54  gs from FROMSTMT
10940 20 6f 76 65 72 20 74 6f 20 54 4f 53 54 4d 54 0a   over to TOSTMT.
10950 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
10960 73 74 5f 74 72 61 6e 73 66 65 72 5f 62 69 6e 64  st_transfer_bind
10970 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
10980 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
10990 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
109a0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
109b0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
109c0 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .){.#ifndef SQLI
109d0 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
109e0 45 44 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ED.  sqlite3_stm
109f0 74 20 2a 70 53 74 6d 74 31 2c 20 2a 70 53 74 6d  t *pStmt1, *pStm
10a00 74 32 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t2;.  if( objc!=
10a10 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  3 ){.    Tcl_App
10a20 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
10a30 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
10a40 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
10a50 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
10a60 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
10a70 76 5b 30 5d 2c 20 30 29 2c 20 22 20 46 52 4f 4d  v[0], 0), " FROM
10a80 2d 53 54 4d 54 20 54 4f 2d 53 54 4d 54 22 2c 20  -STMT TO-STMT", 
10a90 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
10aa0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
10ab0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
10ac0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
10ad0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
10ae0 29 2c 20 26 70 53 74 6d 74 31 29 29 20 72 65 74  ), &pStmt1)) ret
10af0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
10b00 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
10b10 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
10b20 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
10b30 5d 29 2c 20 26 70 53 74 6d 74 32 29 29 20 72 65  ]), &pStmt2)) re
10b40 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
10b50 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
10b60 6c 74 28 69 6e 74 65 72 70 2c 20 0a 20 20 20 20  lt(interp, .    
10b70 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
10b80 71 6c 69 74 65 33 5f 74 72 61 6e 73 66 65 72 5f  qlite3_transfer_
10b90 62 69 6e 64 69 6e 67 73 28 70 53 74 6d 74 31 2c  bindings(pStmt1,
10ba0 70 53 74 6d 74 32 29 29 29 3b 0a 23 65 6e 64 69  pStmt2)));.#endi
10bb0 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  f.  return TCL_O
10bc0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
10bd0 65 3a 20 20 73 71 6c 69 74 65 33 5f 63 68 61 6e  e:  sqlite3_chan
10be0 67 65 73 20 44 42 0a 2a 2a 0a 2a 2a 20 52 65 74  ges DB.**.** Ret
10bf0 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
10c00 66 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 74  f changes made t
10c10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
10c20 79 20 74 68 65 20 6c 61 73 74 20 53 51 4c 0a 2a  y the last SQL.*
10c30 2a 20 65 78 65 63 75 74 69 6f 6e 2e 0a 2a 2f 0a  * execution..*/.
10c40 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
10c50 63 68 61 6e 67 65 73 28 0a 20 20 76 6f 69 64 20  changes(.  void 
10c60 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
10c70 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
10c80 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
10c90 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
10ca0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
10cb0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20  ite3 *db;.  if( 
10cc0 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54  objc!=2 ){.    T
10cd0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
10ce0 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
10cf0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
10d00 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 54 63 6c   \"",.       Tcl
10d10 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
10d20 30 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a  0]), " DB", 0);.
10d30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
10d40 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
10d50 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
10d60 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
10d70 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
10d80 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
10d90 52 52 4f 52 3b 0a 20 20 54 63 6c 5f 53 65 74 4f  RROR;.  Tcl_SetO
10da0 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
10db0 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73   Tcl_NewIntObj(s
10dc0 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 64  qlite3_changes(d
10dd0 62 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  b)));.  return T
10de0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
10df0 54 68 69 73 20 69 73 20 74 68 65 20 22 73 74 61  This is the "sta
10e00 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 22 20  tic_bind_value" 
10e10 74 68 61 74 20 76 61 72 69 61 62 6c 65 73 20 61  that variables a
10e20 72 65 20 62 6f 75 6e 64 20 74 6f 20 77 68 65 6e  re bound to when
10e30 0a 2a 2a 20 74 68 65 20 46 4c 41 47 20 6f 70 74  .** the FLAG opt
10e40 69 6f 6e 20 6f 66 20 73 71 6c 69 74 65 33 5f 62  ion of sqlite3_b
10e50 69 6e 64 20 69 73 20 22 73 74 61 74 69 63 22 0a  ind is "static".
10e60 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
10e70 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
10e80 6e 64 5f 76 61 6c 75 65 20 3d 20 30 3b 0a 73 74  nd_value = 0;.st
10e90 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 5f  atic int sqlite_
10ea0 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74  static_bind_nbyt
10eb0 65 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 55 73  e = 0;../*.** Us
10ec0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 62 69  age:  sqlite3_bi
10ed0 6e 64 20 20 56 4d 20 20 49 44 58 20 20 56 41 4c  nd  VM  IDX  VAL
10ee0 55 45 20 20 46 4c 41 47 53 0a 2a 2a 0a 2a 2a 20  UE  FLAGS.**.** 
10ef0 53 65 74 73 20 74 68 65 20 76 61 6c 75 65 20 6f  Sets the value o
10f00 66 20 74 68 65 20 49 44 58 2d 74 68 20 6f 63 63  f the IDX-th occ
10f10 75 72 72 65 6e 63 65 20 6f 66 20 22 3f 22 20 69  urrence of "?" i
10f20 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
10f30 51 4c 0a 2a 2a 20 73 74 72 69 6e 67 2e 20 20 56  QL.** string.  V
10f40 41 4c 55 45 20 69 73 20 74 68 65 20 6e 65 77 20  ALUE is the new 
10f50 76 61 6c 75 65 2e 20 20 49 66 20 46 4c 41 47 53  value.  If FLAGS
10f60 3d 3d 22 6e 75 6c 6c 22 20 74 68 65 6e 20 56 41  =="null" then VA
10f70 4c 55 45 20 69 73 0a 2a 2a 20 69 67 6e 6f 72 65  LUE is.** ignore
10f80 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  d and the value 
10f90 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 20  is set to NULL. 
10fa0 20 49 66 20 46 4c 41 47 53 3d 3d 22 73 74 61 74   If FLAGS=="stat
10fb0 69 63 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  ic" then.** the 
10fc0 76 61 6c 75 65 20 69 73 20 73 65 74 20 74 6f 20  value is set to 
10fd0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 73  the value of a s
10fe0 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 6e  tatic variable n
10ff0 61 6d 65 64 0a 2a 2a 20 22 73 71 6c 69 74 65 5f  amed.** "sqlite_
11000 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
11010 65 22 2e 20 20 49 66 20 46 4c 41 47 53 3d 3d 22  e".  If FLAGS=="
11020 6e 6f 72 6d 61 6c 22 20 74 68 65 6e 20 61 20 63  normal" then a c
11030 6f 70 79 0a 2a 2a 20 6f 66 20 74 68 65 20 56 41  opy.** of the VA
11040 4c 55 45 20 69 73 20 6d 61 64 65 2e 20 20 49 66  LUE is made.  If
11050 20 46 4c 41 47 53 3d 3d 22 62 6c 6f 62 31 30 22   FLAGS=="blob10"
11060 20 74 68 65 6e 20 61 20 56 41 4c 55 45 20 69 73   then a VALUE is
11070 20 69 67 6e 6f 72 65 64 0a 2a 2a 20 61 6e 20 61   ignored.** an a
11080 20 31 30 2d 62 79 74 65 20 62 6c 6f 62 20 22 61   10-byte blob "a
11090 62 63 5c 30 30 30 78 79 7a 5c 30 30 30 70 71 22  bc\000xyz\000pq"
110a0 20 69 73 20 69 6e 73 65 72 74 65 64 2e 0a 2a 2f   is inserted..*/
110b0 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74  .static int test
110c0 5f 62 69 6e 64 28 0a 20 20 76 6f 69 64 20 2a 4e  _bind(.  void *N
110d0 6f 74 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e  otUsed,.  Tcl_In
110e0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
110f0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
11100 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
11110 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
11120 64 20 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c  d */.  int argc,
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11140 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
11150 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ents */.  char *
11160 2a 61 72 67 76 20 20 20 20 20 20 20 20 20 20 20  *argv           
11170 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68   /* Text of each
11180 20 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a   argument */.){.
11190 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
111a0 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63 3b  pStmt;.  int rc;
111b0 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 66  .  int idx;.  if
111c0 28 20 61 72 67 63 21 3d 35 20 29 7b 0a 20 20 20  ( argc!=5 ){.   
111d0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
111e0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
111f0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
11200 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c  be \"", argv[0],
11210 20 0a 20 20 20 20 20 20 20 22 20 56 4d 20 49 44   .       " VM ID
11220 58 20 56 41 4c 55 45 20 28 6e 75 6c 6c 7c 73 74  X VALUE (null|st
11230 61 74 69 63 7c 6e 6f 72 6d 61 6c 29 5c 22 22 2c  atic|normal)\"",
11240 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
11250 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
11260 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e   if( getStmtPoin
11270 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76  ter(interp, argv
11280 5b 31 5d 2c 20 26 70 53 74 6d 74 29 20 29 20 72  [1], &pStmt) ) r
11290 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
112a0 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e  .  if( Tcl_GetIn
112b0 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32  t(interp, argv[2
112c0 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75 72  ], &idx) ) retur
112d0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69  n TCL_ERROR;.  i
112e0 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34  f( strcmp(argv[4
112f0 5d 2c 22 6e 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a  ],"null")==0 ){.
11300 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11310 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
11320 2c 20 69 64 78 29 3b 0a 20 20 7d 65 6c 73 65 20  , idx);.  }else 
11330 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
11340 34 5d 2c 22 73 74 61 74 69 63 22 29 3d 3d 30 20  4],"static")==0 
11350 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
11360 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
11370 74 6d 74 2c 20 69 64 78 2c 20 73 71 6c 69 74 65  tmt, idx, sqlite
11380 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c  _static_bind_val
11390 75 65 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 7d 65  ue, -1, 0);.  }e
113a0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
113b0 72 67 76 5b 34 5d 2c 22 73 74 61 74 69 63 2d 6e  rgv[4],"static-n
113c0 62 79 74 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  bytes")==0 ){.  
113d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
113e0 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
113f0 69 64 78 2c 20 73 71 6c 69 74 65 5f 73 74 61 74  idx, sqlite_stat
11400 69 63 5f 62 69 6e 64 5f 76 61 6c 75 65 2c 0a 20  ic_bind_value,. 
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11430 20 20 20 20 20 20 73 71 6c 69 74 65 5f 73 74 61        sqlite_sta
11440 74 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20  tic_bind_nbyte, 
11450 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
11460 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d 2c 22  strcmp(argv[4],"
11470 6e 6f 72 6d 61 6c 22 29 3d 3d 30 20 29 7b 0a 20  normal")==0 ){. 
11480 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11490 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
114a0 20 69 64 78 2c 20 61 72 67 76 5b 33 5d 2c 20 2d   idx, argv[3], -
114b0 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
114c0 45 4e 54 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ENT);.  }else if
114d0 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 34 5d  ( strcmp(argv[4]
114e0 2c 22 62 6c 6f 62 31 30 22 29 3d 3d 30 20 29 7b  ,"blob10")==0 ){
114f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11500 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
11510 74 2c 20 69 64 78 2c 20 22 61 62 63 5c 30 30 30  t, idx, "abc\000
11520 78 79 7a 5c 30 30 30 70 71 22 2c 20 31 30 2c 20  xyz\000pq", 10, 
11530 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
11540 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 54 63 6c    }else{.    Tcl
11550 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
11560 74 65 72 70 2c 20 22 34 74 68 20 61 72 67 75 6d  terp, "4th argum
11570 65 6e 74 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  ent should be ".
11580 20 20 20 20 20 20 20 20 22 5c 22 6e 75 6c 6c 5c          "\"null\
11590 22 20 6f 72 20 5c 22 73 74 61 74 69 63 5c 22 20  " or \"static\" 
115a0 6f 72 20 5c 22 6e 6f 72 6d 61 6c 5c 22 22 2c 20  or \"normal\"", 
115b0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
115c0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
115d0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45  if( sqlite3TestE
115e0 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53  rrCode(interp, S
115f0 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20  tmtToDb(pStmt), 
11600 72 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  rc) ) return TCL
11610 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63  _ERROR;.  if( rc
11620 20 29 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75   ){.    char zBu
11630 66 5b 35 30 5d 3b 0a 20 20 20 20 73 70 72 69 6e  f[50];.    sprin
11640 74 66 28 7a 42 75 66 2c 20 22 28 25 64 29 20 22  tf(zBuf, "(%d) "
11650 2c 20 72 63 29 3b 0a 20 20 20 20 54 63 6c 5f 41  , rc);.    Tcl_A
11660 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
11670 72 70 2c 20 7a 42 75 66 2c 20 73 71 6c 69 74 65  rp, zBuf, sqlite
11680 33 45 72 72 53 74 72 28 72 63 29 2c 20 30 29 3b  3ErrStr(rc), 0);
11690 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
116a0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74  ERROR;.  }.  ret
116b0 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23  urn TCL_OK;.}..#
116c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
116d0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 55  IT_UTF16./*.** U
116e0 73 61 67 65 3a 20 61 64 64 5f 74 65 73 74 5f 63  sage: add_test_c
116f0 6f 6c 6c 61 74 65 20 3c 64 62 20 70 74 72 3e 20  ollate <db ptr> 
11700 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c 65 3e  <utf8> <utf16le>
11710 20 3c 75 74 66 31 36 62 65 3e 0a 2a 2a 0a 2a 2a   <utf16be>.**.**
11720 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11730 73 20 75 73 65 64 20 74 6f 20 74 65 73 74 20 74  s used to test t
11740 68 61 74 20 53 51 4c 69 74 65 20 73 65 6c 65 63  hat SQLite selec
11750 74 73 20 74 68 65 20 63 6f 72 72 65 63 74 20 63  ts the correct c
11760 6f 6c 6c 61 74 69 6f 6e 0a 2a 2a 20 73 65 71 75  ollation.** sequ
11770 65 6e 63 65 20 63 61 6c 6c 62 61 63 6b 20 77 68  ence callback wh
11780 65 6e 20 6d 75 6c 74 69 70 6c 65 20 76 65 72 73  en multiple vers
11790 69 6f 6e 73 20 28 66 6f 72 20 64 69 66 66 65 72  ions (for differ
117a0 65 6e 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ent text encodin
117b0 67 73 29 0a 2a 2a 20 61 72 65 20 61 76 61 69 6c  gs).** are avail
117c0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  able..**.** Call
117d0 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
117e0 20 72 65 67 69 73 74 65 72 73 20 74 68 65 20 63   registers the c
117f0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
11800 65 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  e "test_collate"
11810 0a 2a 2a 20 77 69 74 68 20 64 61 74 61 62 61 73  .** with databas
11820 65 20 68 61 6e 64 6c 65 20 3c 64 62 3e 2e 20 54  e handle <db>. T
11830 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11840 6e 74 20 6d 75 73 74 20 62 65 20 61 20 6c 69 73  nt must be a lis
11850 74 20 6f 66 20 74 68 72 65 65 0a 2a 2a 20 62 6f  t of three.** bo
11860 6f 6c 65 61 6e 20 76 61 6c 75 65 73 2e 20 49 66  olean values. If
11870 20 74 68 65 20 66 69 72 73 74 20 69 73 20 74 72   the first is tr
11880 75 65 2c 20 74 68 65 6e 20 61 20 76 65 72 73 69  ue, then a versi
11890 6f 6e 20 6f 66 20 74 65 73 74 5f 63 6f 6c 6c 61  on of test_colla
118a0 74 65 20 69 73 0a 2a 2a 20 72 65 67 69 73 74 65  te is.** registe
118b0 72 65 64 20 66 6f 72 20 55 54 46 2d 38 2c 20 69  red for UTF-8, i
118c0 66 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20  f the second is 
118d0 74 72 75 65 2c 20 61 20 76 65 72 73 69 6f 6e 20  true, a version 
118e0 69 73 20 72 65 67 69 73 74 65 72 65 64 20 66 6f  is registered fo
118f0 72 0a 2a 2a 20 55 54 46 2d 31 36 6c 65 2c 20 69  r.** UTF-16le, i
11900 66 20 74 68 65 20 74 68 69 72 64 20 69 73 20 74  f the third is t
11910 72 75 65 2c 20 61 20 55 54 46 2d 31 36 62 65 20  rue, a UTF-16be 
11920 76 65 72 73 69 6f 6e 20 69 73 20 61 76 61 69 6c  version is avail
11930 61 62 6c 65 2e 0a 2a 2a 20 50 72 65 76 69 6f 75  able..** Previou
11940 73 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 65  s versions of te
11950 73 74 5f 63 6f 6c 6c 61 74 65 20 61 72 65 20 64  st_collate are d
11960 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
11970 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
11980 65 6e 63 65 20 74 65 73 74 5f 63 6f 6c 6c 61 74  ence test_collat
11990 65 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  e is implemented
119a0 20 62 79 20 63 61 6c 6c 69 6e 67 20 74 68 65 0a   by calling the.
119b0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 54 43 4c  ** following TCL
119c0 20 73 63 72 69 70 74 3a 0a 2a 2a 0a 2a 2a 20 20   script:.**.**  
119d0 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 20 3c   "test_collate <
119e0 65 6e 63 3e 20 3c 6c 68 73 3e 20 3c 72 68 73 3e  enc> <lhs> <rhs>
119f0 22 0a 2a 2a 0a 2a 2a 20 54 68 65 20 3c 6c 68 73  ".**.** The <lhs
11a00 3e 20 61 6e 64 20 3c 72 68 73 3e 20 61 72 65 20  > and <rhs> are 
11a10 74 68 65 20 74 77 6f 20 76 61 6c 75 65 73 20 62  the two values b
11a20 65 69 6e 67 20 63 6f 6d 70 61 72 65 64 2c 20 65  eing compared, e
11a30 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 2e  ncoded in UTF-8.
11a40 0a 2a 2a 20 54 68 65 20 3c 65 6e 63 3e 20 70 61  .** The <enc> pa
11a50 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 65  rameter is the e
11a60 6e 63 6f 64 69 6e 67 20 6f 66 20 74 68 65 20 63  ncoding of the c
11a70 6f 6c 6c 61 74 69 6f 6e 20 66 75 6e 63 74 69 6f  ollation functio
11a80 6e 20 74 68 61 74 0a 2a 2a 20 53 51 4c 69 74 65  n that.** SQLite
11a90 20 73 65 6c 65 63 74 65 64 20 74 6f 20 63 61 6c   selected to cal
11aa0 6c 2e 20 54 68 65 20 54 43 4c 20 74 65 73 74 20  l. The TCL test 
11ab0 73 63 72 69 70 74 20 69 6d 70 6c 65 6d 65 6e 74  script implement
11ac0 73 20 74 68 65 0a 2a 2a 20 22 74 65 73 74 5f 63  s the.** "test_c
11ad0 6f 6c 6c 61 74 65 22 20 70 72 6f 63 2e 0a 2a 2a  ollate" proc..**
11ae0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68  .** Note that th
11af0 69 73 20 77 69 6c 6c 20 6f 6e 6c 79 20 77 6f 72  is will only wor
11b00 6b 20 77 69 74 68 20 6f 6e 65 20 69 6e 74 65 70  k with one intep
11b10 72 65 74 65 72 20 61 74 20 61 20 74 69 6d 65 2c  reter at a time,
11b20 20 61 73 20 74 68 65 0a 2a 2a 20 69 6e 74 65 72   as the.** inter
11b30 70 20 70 6f 69 6e 74 65 72 20 74 6f 20 75 73 65  p pointer to use
11b40 20 77 68 65 6e 20 65 76 61 6c 75 61 74 69 6e 67   when evaluating
11b50 20 74 68 65 20 54 43 4c 20 73 63 72 69 70 74 20   the TCL script 
11b60 69 73 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  is stored in.** 
11b70 70 54 65 73 74 43 6f 6c 6c 61 74 65 49 6e 74 65  pTestCollateInte
11b80 72 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 54 63  rp..*/.static Tc
11b90 6c 5f 49 6e 74 65 72 70 2a 20 70 54 65 73 74 43  l_Interp* pTestC
11ba0 6f 6c 6c 61 74 65 49 6e 74 65 72 70 3b 0a 73 74  ollateInterp;.st
11bb0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
11bc0 6c 6c 61 74 65 5f 66 75 6e 63 28 0a 20 20 76 6f  llate_func(.  vo
11bd0 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  id *pCtx, .  int
11be0 20 6e 41 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20   nA, const void 
11bf0 2a 7a 41 2c 0a 20 20 69 6e 74 20 6e 42 2c 20 63  *zA,.  int nB, c
11c00 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 0a 29 7b  onst void *zB.){
11c10 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
11c20 20 3d 20 70 54 65 73 74 43 6f 6c 6c 61 74 65 49   = pTestCollateI
11c30 6e 74 65 72 70 3b 0a 20 20 69 6e 74 20 65 6e 63  nterp;.  int enc
11c40 69 6e 20 3d 20 53 51 4c 49 54 45 5f 50 54 52 5f  in = SQLITE_PTR_
11c50 54 4f 5f 49 4e 54 28 70 43 74 78 29 3b 0a 20 20  TO_INT(pCtx);.  
11c60 69 6e 74 20 72 65 73 3b 0a 20 20 69 6e 74 20 6e  int res;.  int n
11c70 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  ;..  sqlite3_val
11c80 75 65 20 2a 70 56 61 6c 3b 0a 20 20 54 63 6c 5f  ue *pVal;.  Tcl_
11c90 4f 62 6a 20 2a 70 58 3b 0a 0a 20 20 70 58 20 3d  Obj *pX;..  pX =
11ca0 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
11cb0 6a 28 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  j("test_collate"
11cc0 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49 6e 63  , -1);.  Tcl_Inc
11cd0 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 0a  rRefCount(pX);..
11ce0 20 20 73 77 69 74 63 68 28 20 65 6e 63 69 6e 20    switch( encin 
11cf0 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
11d00 54 45 5f 55 54 46 38 3a 0a 20 20 20 20 20 20 54  TE_UTF8:.      T
11d10 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
11d20 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 54 63 6c  Element(i,pX,Tcl
11d30 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55  _NewStringObj("U
11d40 54 46 2d 38 22 2c 2d 31 29 29 3b 0a 20 20 20 20  TF-8",-1));.    
11d50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
11d60 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  e SQLITE_UTF16LE
11d70 3a 0a 20 20 20 20 20 20 54 63 6c 5f 4c 69 73 74  :.      Tcl_List
11d80 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
11d90 28 69 2c 70 58 2c 54 63 6c 5f 4e 65 77 53 74 72  (i,pX,Tcl_NewStr
11da0 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36 4c 45  ingObj("UTF-16LE
11db0 22 2c 2d 31 29 29 3b 0a 20 20 20 20 20 20 62 72  ",-1));.      br
11dc0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51  eak;.    case SQ
11dd0 4c 49 54 45 5f 55 54 46 31 36 42 45 3a 0a 20 20  LITE_UTF16BE:.  
11de0 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
11df0 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 2c 70  ppendElement(i,p
11e00 58 2c 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  X,Tcl_NewStringO
11e10 62 6a 28 22 55 54 46 2d 31 36 42 45 22 2c 2d 31  bj("UTF-16BE",-1
11e20 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ));.      break;
11e30 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
11e40 20 20 20 20 61 73 73 65 72 74 28 30 29 3b 0a 20      assert(0);. 
11e50 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 42 65 67   }..  sqlite3Beg
11e60 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  inBenignMalloc()
11e70 3b 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74  ;.  pVal = sqlit
11e80 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20  e3ValueNew(0);. 
11e90 20 69 66 28 20 70 56 61 6c 20 29 7b 0a 20 20 20   if( pVal ){.   
11ea0 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
11eb0 53 74 72 28 70 56 61 6c 2c 20 6e 41 2c 20 7a 41  Str(pVal, nA, zA
11ec0 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
11ed0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
11ee0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
11ef0 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20  ytes(pVal);.    
11f00 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11f10 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
11f20 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
11f30 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
11f40 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
11f50 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20  t(pVal),n));.   
11f60 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
11f70 53 74 72 28 70 56 61 6c 2c 20 6e 42 2c 20 7a 42  Str(pVal, nB, zB
11f80 2c 20 65 6e 63 69 6e 2c 20 53 51 4c 49 54 45 5f  , encin, SQLITE_
11f90 53 54 41 54 49 43 29 3b 0a 20 20 20 20 6e 20 3d  STATIC);.    n =
11fa0 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
11fb0 79 74 65 73 28 70 56 61 6c 29 3b 0a 20 20 20 20  ytes(pVal);.    
11fc0 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e  Tcl_ListObjAppen
11fd0 64 45 6c 65 6d 65 6e 74 28 69 2c 70 58 2c 0a 20  dElement(i,pX,. 
11fe0 20 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74         Tcl_NewSt
11ff0 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
12000 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
12010 74 28 70 56 61 6c 29 2c 6e 29 29 3b 0a 20 20 20  t(pVal),n));.   
12020 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65   sqlite3ValueFre
12030 65 28 70 56 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  e(pVal);.  }.  s
12040 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
12050 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 54 63 6c 5f  alloc();..  Tcl_
12060 45 76 61 6c 4f 62 6a 45 78 28 69 2c 20 70 58 2c  EvalObjEx(i, pX,
12070 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52   0);.  Tcl_DecrR
12080 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 54  efCount(pX);.  T
12090 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
120a0 28 69 2c 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  (i, Tcl_GetObjRe
120b0 73 75 6c 74 28 69 29 2c 20 26 72 65 73 29 3b 0a  sult(i), &res);.
120c0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
120d0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
120e0 63 6f 6c 6c 61 74 65 28 0a 20 20 76 6f 69 64 20  collate(.  void 
120f0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
12100 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
12110 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
12120 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
12130 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c   objv[].){.  sql
12140 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
12150 76 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  val;.  sqlite3_v
12160 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
12170 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
12180 63 21 3d 35 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=5 ) goto bad_
12190 61 72 67 73 3b 0a 20 20 70 54 65 73 74 43 6f 6c  args;.  pTestCol
121a0 6c 61 74 65 49 6e 74 65 72 70 20 3d 20 69 6e 74  lateInterp = int
121b0 65 72 70 3b 0a 20 20 69 66 28 20 67 65 74 44 62  erp;.  if( getDb
121c0 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20  Pointer(interp, 
121d0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
121e0 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72  jv[1]), &db) ) r
121f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12200 0a 0a 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d  ..  if( TCL_OK!=
12210 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72  Tcl_GetBooleanFr
12220 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
12230 6a 76 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72  jv[2], &val) ) r
12240 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
12250 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
12260 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
12270 28 64 62 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61  (db, "test_colla
12280 74 65 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  te", SQLITE_UTF8
12290 2c 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f  , .          (vo
122a0 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 38  id *)SQLITE_UTF8
122b0 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c 6c 61  , val?test_colla
122c0 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20 69 66  te_func:0);.  if
122d0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
122e0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  ){.    const voi
122f0 64 20 2a 7a 55 74 66 31 36 3b 0a 20 20 20 20 69  d *zUtf16;.    i
12300 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
12310 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
12320 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
12330 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
12340 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
12350 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65  rc = sqlite3_cre
12360 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 64 62  ate_collation(db
12370 2c 20 22 74 65 73 74 5f 63 6f 6c 6c 61 74 65 22  , "test_collate"
12380 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
12390 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 28  , .            (
123a0 76 6f 69 64 20 2a 29 53 51 4c 49 54 45 5f 55 54  void *)SQLITE_UT
123b0 46 31 36 4c 45 2c 20 76 61 6c 3f 74 65 73 74 5f  F16LE, val?test_
123c0 63 6f 6c 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b  collate_func:0);
123d0 0a 20 20 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21  .    if( TCL_OK!
123e0 3d 54 63 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46  =Tcl_GetBooleanF
123f0 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
12400 62 6a 76 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20  bjv[4], &val) ) 
12410 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12420 3b 0a 0a 23 69 66 20 30 0a 20 20 20 20 69 66 28  ;..#if 0.    if(
12430 20 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63   sqlite3_iMalloc
12440 46 61 69 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20  Fail>0 ){.      
12450 73 71 6c 69 74 65 33 5f 69 4d 61 6c 6c 6f 63 46  sqlite3_iMallocF
12460 61 69 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 23 65 6e  ail++;.    }.#en
12470 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
12480 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
12490 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 56 61 6c  mutex);.    pVal
124a0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
124b0 65 77 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69  ew(db);.    sqli
124c0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
124d0 56 61 6c 2c 20 2d 31 2c 20 22 74 65 73 74 5f 63  Val, -1, "test_c
124e0 6f 6c 6c 61 74 65 22 2c 20 53 51 4c 49 54 45 5f  ollate", SQLITE_
124f0 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
12500 54 49 43 29 3b 0a 20 20 20 20 7a 55 74 66 31 36  TIC);.    zUtf16
12510 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
12520 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
12530 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
12540 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f     if( db->mallo
12550 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
12560 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
12570 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
12580 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12590 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
125a0 6f 6e 31 36 28 64 62 2c 20 7a 55 74 66 31 36 2c  on16(db, zUtf16,
125b0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
125c0 20 0a 20 20 20 20 20 20 20 20 20 20 28 76 6f 69   .          (voi
125d0 64 20 2a 29 53 51 4c 49 54 45 5f 55 54 46 31 36  d *)SQLITE_UTF16
125e0 42 45 2c 20 76 61 6c 3f 74 65 73 74 5f 63 6f 6c  BE, val?test_col
125f0 6c 61 74 65 5f 66 75 6e 63 3a 30 29 3b 0a 20 20  late_func:0);.  
12600 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 56    }.    sqlite3V
12610 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a  alueFree(pVal);.
12620 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
12630 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
12640 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  x);.  }.  if( sq
12650 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
12660 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
12670 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
12680 52 4f 52 3b 0a 20 20 0a 20 20 69 66 28 20 72 63  ROR;.  .  if( rc
12690 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
126a0 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
126b0 75 6c 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69  ult(interp, sqli
126c0 74 65 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20  te3ErrName(rc), 
126d0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
126e0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
126f0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a  return TCL_OK;..
12700 62 61 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f  bad_args:.  Tcl_
12710 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
12720 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
12730 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
12740 22 2c 0a 20 20 20 20 20 20 54 63 6c 5f 47 65 74  ",.      Tcl_Get
12750 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62  StringFromObj(ob
12760 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 3c 44 42  jv[0], 0), " <DB
12770 3e 20 3c 75 74 66 38 3e 20 3c 75 74 66 31 36 6c  > <utf8> <utf16l
12780 65 3e 20 3c 75 74 66 31 36 62 65 3e 22 2c 20 30  e> <utf16be>", 0
12790 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
127a0 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
127b0 57 68 65 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69  When the collati
127c0 6f 6e 20 6e 65 65 64 65 64 20 63 61 6c 6c 62 61  on needed callba
127d0 63 6b 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 72  ck is invoked, r
127e0 65 63 6f 72 64 20 74 68 65 20 6e 61 6d 65 20 6f  ecord the name o
127f0 66 20 0a 2a 2a 20 74 68 65 20 72 65 71 75 65 73  f .** the reques
12800 74 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75  ted collating fu
12810 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 20 54 68  nction here.  Th
12820 65 20 72 65 63 6f 72 64 65 64 20 6e 61 6d 65 20  e recorded name 
12830 69 73 20 6c 69 6e 6b 65 64 0a 2a 2a 20 74 6f 20  is linked.** to 
12840 61 20 54 43 4c 20 76 61 72 69 61 62 6c 65 20 61  a TCL variable a
12850 6e 64 20 75 73 65 64 20 74 6f 20 6d 61 6b 65 20  nd used to make 
12860 73 75 72 65 20 74 68 61 74 20 74 68 65 20 72 65  sure that the re
12870 71 75 65 73 74 65 64 20 63 6f 6c 6c 61 74 69 6f  quested collatio
12880 6e 0a 2a 2a 20 6e 61 6d 65 20 69 73 20 63 6f 72  n.** name is cor
12890 72 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rect..*/.static 
128a0 63 68 61 72 20 7a 4e 65 65 64 65 64 43 6f 6c 6c  char zNeededColl
128b0 61 74 69 6f 6e 5b 32 30 30 5d 3b 0a 73 74 61 74  ation[200];.stat
128c0 69 63 20 63 68 61 72 20 2a 70 7a 4e 65 65 64 65  ic char *pzNeede
128d0 64 43 6f 6c 6c 61 74 69 6f 6e 20 3d 20 7a 4e 65  dCollation = zNe
128e0 65 64 65 64 43 6f 6c 6c 61 74 69 6f 6e 3b 0a 0a  ededCollation;..
128f0 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 65 64 20 77 68  ./*.** Called wh
12900 65 6e 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73  en a collating s
12910 65 71 75 65 6e 63 65 20 69 73 20 6e 65 65 64 65  equence is neede
12920 64 2e 20 20 52 65 67 69 73 74 65 72 65 64 20 75  d.  Registered u
12930 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  sing.** sqlite3_
12940 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64  collation_needed
12950 31 36 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  16()..*/.static 
12960 76 6f 69 64 20 74 65 73 74 5f 63 6f 6c 6c 61 74  void test_collat
12970 65 5f 6e 65 65 64 65 64 5f 63 62 28 0a 20 20 76  e_needed_cb(.  v
12980 6f 69 64 20 2a 70 43 74 78 2c 20 0a 20 20 73 71  oid *pCtx, .  sq
12990 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74  lite3 *db,.  int
129a0 20 65 54 65 78 74 52 65 70 2c 0a 20 20 63 6f 6e   eTextRep,.  con
129b0 73 74 20 76 6f 69 64 20 2a 70 4e 61 6d 65 0a 29  st void *pName.)
129c0 7b 0a 20 20 69 6e 74 20 65 6e 63 20 3d 20 45 4e  {.  int enc = EN
129d0 43 28 64 62 29 3b 0a 20 20 69 6e 74 20 69 3b 0a  C(db);.  int i;.
129e0 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 66 6f 72    char *z;.  for
129f0 28 7a 20 3d 20 28 63 68 61 72 2a 29 70 4e 61 6d  (z = (char*)pNam
12a00 65 2c 20 69 3d 30 3b 20 2a 7a 20 7c 7c 20 7a 5b  e, i=0; *z || z[
12a10 31 5d 3b 20 7a 2b 2b 29 7b 0a 20 20 20 20 69 66  1]; z++){.    if
12a20 28 20 2a 7a 20 29 20 7a 4e 65 65 64 65 64 43 6f  ( *z ) zNeededCo
12a30 6c 6c 61 74 69 6f 6e 5b 69 2b 2b 5d 20 3d 20 2a  llation[i++] = *
12a40 7a 3b 0a 20 20 7d 0a 20 20 7a 4e 65 65 64 65 64  z;.  }.  zNeeded
12a50 43 6f 6c 6c 61 74 69 6f 6e 5b 69 5d 20 3d 20 30  Collation[i] = 0
12a60 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61  ;.  sqlite3_crea
12a70 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
12a80 20 20 20 20 64 62 2c 20 22 74 65 73 74 5f 63 6f      db, "test_co
12a90 6c 6c 61 74 65 22 2c 20 45 4e 43 28 64 62 29 2c  llate", ENC(db),
12aa0 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
12ab0 54 52 28 65 6e 63 29 2c 20 74 65 73 74 5f 63 6f  TR(enc), test_co
12ac0 6c 6c 61 74 65 5f 66 75 6e 63 29 3b 0a 7d 0a 0a  llate_func);.}..
12ad0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 61 64 64  /*.** Usage: add
12ae0 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 65 5f 6e 65  _test_collate_ne
12af0 65 64 65 64 20 44 42 0a 2a 2f 0a 73 74 61 74 69  eded DB.*/.stati
12b00 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c 6c 61  c int test_colla
12b10 74 65 5f 6e 65 65 64 65 64 28 0a 20 20 76 6f 69  te_needed(.  voi
12b20 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
12b30 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
12b40 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
12b50 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
12b60 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
12b70 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
12b80 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  t rc;..  if( obj
12b90 63 21 3d 32 20 29 20 67 6f 74 6f 20 62 61 64 5f  c!=2 ) goto bad_
12ba0 61 72 67 73 3b 0a 20 20 69 66 28 20 67 65 74 44  args;.  if( getD
12bb0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
12bc0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
12bd0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
12be0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12bf0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
12c00 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
12c10 64 31 36 28 64 62 2c 20 30 2c 20 74 65 73 74 5f  d16(db, 0, test_
12c20 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 5f 63  collate_needed_c
12c30 62 29 3b 0a 20 20 7a 4e 65 65 64 65 64 43 6f 6c  b);.  zNeededCol
12c40 6c 61 74 69 6f 6e 5b 30 5d 20 3d 20 30 3b 0a 20  lation[0] = 0;. 
12c50 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74   if( sqlite3Test
12c60 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  ErrCode(interp, 
12c70 64 62 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  db, rc) ) return
12c80 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 65   TCL_ERROR;.  re
12c90 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 62 61  turn TCL_OK;..ba
12ca0 64 5f 61 72 67 73 3a 0a 20 20 54 63 6c 5f 57 72  d_args:.  Tcl_Wr
12cb0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
12cc0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22  p, 1, objv, "DB"
12cd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
12ce0 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ERROR;.}../*.** 
12cf0 74 63 6c 63 6d 64 3a 20 20 20 61 64 64 5f 61 6c  tclcmd:   add_al
12d00 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f 63 6f 6c  ignment_test_col
12d10 6c 61 74 69 6f 6e 73 20 20 44 42 0a 2a 2a 0a 2a  lations  DB.**.*
12d20 2a 20 41 64 64 20 74 77 6f 20 6e 65 77 20 63 6f  * Add two new co
12d30 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
12d40 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
12d50 65 20 44 42 0a 2a 2a 0a 2a 2a 20 20 20 20 20 75  e DB.**.**     u
12d60 74 66 31 36 5f 61 6c 69 67 6e 65 64 0a 2a 2a 20  tf16_aligned.** 
12d70 20 20 20 20 75 74 66 31 36 5f 75 6e 61 6c 69 67      utf16_unalig
12d80 6e 65 64 0a 2a 2a 0a 2a 2a 20 42 6f 74 68 20 63  ned.**.** Both c
12d90 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
12da0 65 73 20 75 73 65 20 74 68 65 20 73 61 6d 65 20  es use the same 
12db0 73 6f 72 74 20 6f 72 64 65 72 20 61 73 20 42 49  sort order as BI
12dc0 4e 41 52 59 2e 0a 2a 2a 20 54 68 65 20 6f 6e 6c  NARY..** The onl
12dd0 79 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 20  y difference is 
12de0 74 68 61 74 20 74 68 65 20 75 74 66 31 36 5f 61  that the utf16_a
12df0 6c 69 67 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67  ligned collating
12e00 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 69 73 20  .** sequence is 
12e10 64 65 63 6c 61 72 65 64 20 77 69 74 68 20 74 68  declared with th
12e20 65 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  e SQLITE_UTF16_A
12e30 4c 49 47 4e 45 44 20 66 6c 61 67 2e 0a 2a 2a 20  LIGNED flag..** 
12e40 42 6f 74 68 20 63 6f 6c 6c 61 74 69 6e 67 20 66  Both collating f
12e50 75 6e 63 74 69 6f 6e 73 20 69 6e 63 72 65 6d 65  unctions increme
12e60 6e 74 20 74 68 65 20 75 6e 61 6c 69 67 6e 65 64  nt the unaligned
12e70 20 75 74 66 31 36 20 63 6f 75 6e 74 65 72 0a 2a   utf16 counter.*
12e80 2a 20 77 68 65 6e 65 76 65 72 20 74 68 65 79 20  * whenever they 
12e90 73 65 65 20 61 20 73 74 72 69 6e 67 20 74 68 61  see a string tha
12ea0 74 20 62 65 67 69 6e 73 20 6f 6e 20 61 6e 20 6f  t begins on an o
12eb0 64 64 20 62 79 74 65 20 62 6f 75 6e 64 61 72 79  dd byte boundary
12ec0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
12ed0 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72 69 6e 67  unaligned_string
12ee0 5f 63 6f 75 6e 74 65 72 20 3d 20 30 3b 0a 73 74  _counter = 0;.st
12ef0 61 74 69 63 20 69 6e 74 20 61 6c 69 67 6e 6d 65  atic int alignme
12f00 6e 74 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  ntCollFunc(.  vo
12f10 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69  id *NotUsed,.  i
12f20 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
12f30 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
12f40 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
12f50 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
12f60 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
12f70 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
12f80 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
12f90 20 69 66 28 20 6e 4b 65 79 31 3e 30 20 26 26 20   if( nKey1>0 && 
12fa0 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50 54  1==(1&(SQLITE_PT
12fb0 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 31 29 29  R_TO_INT(pKey1))
12fc0 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73 74  ) ) unaligned_st
12fd0 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a  ring_counter++;.
12fe0 20 20 69 66 28 20 6e 4b 65 79 32 3e 30 20 26 26    if( nKey2>0 &&
12ff0 20 31 3d 3d 28 31 26 28 53 51 4c 49 54 45 5f 50   1==(1&(SQLITE_P
13000 54 52 5f 54 4f 5f 49 4e 54 28 70 4b 65 79 32 29  TR_TO_INT(pKey2)
13010 29 29 20 29 20 75 6e 61 6c 69 67 6e 65 64 5f 73  )) ) unaligned_s
13020 74 72 69 6e 67 5f 63 6f 75 6e 74 65 72 2b 2b 3b  tring_counter++;
13030 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70  .  rc = memcmp(p
13040 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b  Key1, pKey2, n);
13050 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
13060 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
13070 20 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65   nKey2;.  }.  re
13080 74 75 72 6e 20 72 63 3b 0a 7d 0a 73 74 61 74 69  turn rc;.}.stati
13090 63 20 69 6e 74 20 61 64 64 5f 61 6c 69 67 6e 6d  c int add_alignm
130a0 65 6e 74 5f 74 65 73 74 5f 63 6f 6c 6c 61 74 69  ent_test_collati
130b0 6f 6e 73 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  ons(.  void * cl
130c0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
130d0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
130e0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
130f0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
13100 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
13110 20 2a 64 62 3b 0a 20 20 69 66 28 20 6f 62 6a 63   *db;.  if( objc
13120 3e 3d 32 20 29 7b 0a 20 20 20 20 69 66 28 20 67  >=2 ){.    if( g
13130 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
13140 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
13150 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
13160 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
13170 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ROR;.    sqlite3
13180 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
13190 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 75 6e 61  n(db, "utf16_una
131a0 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f  ligned", SQLITE_
131b0 55 54 46 31 36 2c 20 0a 20 20 20 20 20 20 20 20  UTF16, .        
131c0 30 2c 20 61 6c 69 67 6e 6d 65 6e 74 43 6f 6c 6c  0, alignmentColl
131d0 46 75 6e 63 29 3b 0a 20 20 20 20 73 71 6c 69 74  Func);.    sqlit
131e0 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
131f0 69 6f 6e 28 64 62 2c 20 22 75 74 66 31 36 5f 61  ion(db, "utf16_a
13200 6c 69 67 6e 65 64 22 2c 20 53 51 4c 49 54 45 5f  ligned", SQLITE_
13210 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 2c 20 0a  UTF16_ALIGNED, .
13220 20 20 20 20 20 20 20 20 30 2c 20 61 6c 69 67 6e          0, align
13230 6d 65 6e 74 43 6f 6c 6c 46 75 6e 63 29 3b 0a 20  mentCollFunc);. 
13240 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
13250 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
13260 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
13270 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 29 20 2a  TE_OMIT_UTF16) *
13280 2f 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  /../*.** Usage: 
13290 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69 6f  add_test_functio
132a0 6e 20 3c 64 62 20 70 74 72 3e 20 3c 75 74 66 38  n <db ptr> <utf8
132b0 3e 20 3c 75 74 66 31 36 6c 65 3e 20 3c 75 74 66  > <utf16le> <utf
132c0 31 36 62 65 3e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  16be>.**.** This
132d0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
132e0 64 20 74 6f 20 74 65 73 74 20 74 68 61 74 20 53  d to test that S
132f0 51 4c 69 74 65 20 73 65 6c 65 63 74 73 20 74 68  QLite selects th
13300 65 20 63 6f 72 72 65 63 74 20 75 73 65 72 0a 2a  e correct user.*
13310 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 62  * function callb
13320 61 63 6b 20 77 68 65 6e 20 6d 75 6c 74 69 70 6c  ack when multipl
13330 65 20 76 65 72 73 69 6f 6e 73 20 28 66 6f 72 20  e versions (for 
13340 64 69 66 66 65 72 65 6e 74 20 74 65 78 74 20 65  different text e
13350 6e 63 6f 64 69 6e 67 73 29 0a 2a 2a 20 61 72 65  ncodings).** are
13360 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
13370 2a 20 43 61 6c 6c 69 6e 67 20 74 68 69 73 20 72  * Calling this r
13380 6f 75 74 69 6e 65 20 72 65 67 69 73 74 65 72 73  outine registers
13390 20 75 70 20 74 6f 20 74 68 72 65 65 20 76 65 72   up to three ver
133a0 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 75 73 65  sions of the use
133b0 72 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 22 74  r function.** "t
133c0 65 73 74 5f 66 75 6e 63 74 69 6f 6e 22 20 77 69  est_function" wi
133d0 74 68 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  th database hand
133e0 6c 65 20 3c 64 62 3e 2e 20 20 49 66 20 74 68 65  le <db>.  If the
133f0 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13400 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65   is.** true, the
13410 6e 20 61 20 76 65 72 73 69 6f 6e 20 6f 66 20 74  n a version of t
13420 65 73 74 5f 66 75 6e 63 74 69 6f 6e 20 69 73 20  est_function is 
13430 72 65 67 69 73 74 65 72 65 64 20 66 6f 72 20 55  registered for U
13440 54 46 2d 38 2c 20 69 66 20 74 68 65 0a 2a 2a 20  TF-8, if the.** 
13450 74 68 69 72 64 20 69 73 20 74 72 75 65 2c 20 61  third is true, a
13460 20 76 65 72 73 69 6f 6e 20 69 73 20 72 65 67 69   version is regi
13470 73 74 65 72 65 64 20 66 6f 72 20 55 54 46 2d 31  stered for UTF-1
13480 36 6c 65 2c 20 69 66 20 74 68 65 20 66 6f 75 72  6le, if the four
13490 74 68 20 69 73 0a 2a 2a 20 74 72 75 65 2c 20 61  th is.** true, a
134a0 20 55 54 46 2d 31 36 62 65 20 76 65 72 73 69 6f   UTF-16be versio
134b0 6e 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2e 20  n is available. 
134c0 20 50 72 65 76 69 6f 75 73 20 76 65 72 73 69 6f   Previous versio
134d0 6e 73 20 6f 66 0a 2a 2a 20 74 65 73 74 5f 66 75  ns of.** test_fu
134e0 6e 63 74 69 6f 6e 20 61 72 65 20 64 65 6c 65 74  nction are delet
134f0 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 75 73  ed..**.** The us
13500 65 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69  er function is i
13510 6d 70 6c 65 6d 65 6e 74 65 64 20 62 79 20 63 61  mplemented by ca
13520 6c 6c 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f 77  lling the follow
13530 69 6e 67 20 54 43 4c 20 73 63 72 69 70 74 3a 0a  ing TCL script:.
13540 2a 2a 0a 2a 2a 20 20 20 22 74 65 73 74 5f 66 75  **.**   "test_fu
13550 6e 63 74 69 6f 6e 20 3c 65 6e 63 3e 20 3c 61 72  nction <enc> <ar
13560 67 3e 22 0a 2a 2a 0a 2a 2a 20 57 68 65 72 65 20  g>".**.** Where 
13570 3c 65 6e 63 3e 20 69 73 20 6f 6e 65 20 6f 66 20  <enc> is one of 
13580 55 54 46 2d 38 2c 20 55 54 46 2d 31 36 4c 45 20  UTF-8, UTF-16LE 
13590 6f 72 20 55 54 46 31 36 42 45 2c 20 61 6e 64 20  or UTF16BE, and 
135a0 3c 61 72 67 3e 20 69 73 20 74 68 65 0a 2a 2a 20  <arg> is the.** 
135b0 73 69 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20  single argument 
135c0 70 61 73 73 65 64 20 74 6f 20 74 68 65 20 53 51  passed to the SQ
135d0 4c 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20  L function. The 
135e0 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
135f0 79 0a 2a 2a 20 74 68 65 20 54 43 4c 20 73 63 72  y.** the TCL scr
13600 69 70 74 20 69 73 20 75 73 65 64 20 61 73 20 74  ipt is used as t
13610 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
13620 6f 66 20 74 68 65 20 53 51 4c 20 66 75 6e 63 74  of the SQL funct
13630 69 6f 6e 2e 20 49 74 0a 2a 2a 20 69 73 20 70 61  ion. It.** is pa
13640 73 73 65 64 20 74 6f 20 53 51 4c 69 74 65 20 75  ssed to SQLite u
13650 73 69 6e 67 20 55 54 46 2d 31 36 42 45 20 66 6f  sing UTF-16BE fo
13660 72 20 61 20 55 54 46 2d 38 20 74 65 73 74 5f 66  r a UTF-8 test_f
13670 75 6e 63 74 69 6f 6e 28 29 2c 20 55 54 46 2d 38  unction(), UTF-8
13680 0a 2a 2a 20 66 6f 72 20 61 20 55 54 46 2d 31 36  .** for a UTF-16
13690 4c 45 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e  LE test_function
136a0 28 29 2c 20 61 6e 64 20 55 54 46 2d 31 36 4c 45  (), and UTF-16LE
136b0 20 66 6f 72 20 61 6e 20 69 6d 70 6c 65 6d 65 6e   for an implemen
136c0 74 61 74 69 6f 6e 20 74 68 61 74 0a 2a 2a 20 70  tation that.** p
136d0 72 65 66 65 72 73 20 55 54 46 2d 31 36 42 45 2e  refers UTF-16BE.
136e0 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
136f0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 73 74  TE_OMIT_UTF16.st
13700 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
13710 75 6e 63 74 69 6f 6e 5f 75 74 66 38 28 0a 20 20  unction_utf8(.  
13720 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
13730 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41  *pCtx, .  int nA
13740 72 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  rg,.  sqlite3_va
13750 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20  lue **argv.){.  
13760 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
13770 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  rp;.  Tcl_Obj *p
13780 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  X;.  sqlite3_val
13790 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65  ue *pVal;.  inte
137a0 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70  rp = (Tcl_Interp
137b0 20 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f   *)sqlite3_user_
137c0 64 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58  data(pCtx);.  pX
137d0 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67   = Tcl_NewString
137e0 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69  Obj("test_functi
137f0 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f  on", -1);.  Tcl_
13800 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29  IncrRefCount(pX)
13810 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ;.  Tcl_ListObjA
13820 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
13830 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77  erp, pX, Tcl_New
13840 53 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 38  StringObj("UTF-8
13850 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 4c  ", -1));.  Tcl_L
13860 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
13870 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  ent(interp, pX, 
13880 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77 53 74  .      Tcl_NewSt
13890 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a 29 73  ringObj((char*)s
138a0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
138b0 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31 29 29  t(argv[0]), -1))
138c0 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45  ;.  Tcl_EvalObjE
138d0 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20 30 29  x(interp, pX, 0)
138e0 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43  ;.  Tcl_DecrRefC
138f0 6f 75 6e 74 28 70 58 29 3b 0a 20 20 73 71 6c 69  ount(pX);.  sqli
13900 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
13910 70 43 74 78 2c 20 54 63 6c 5f 47 65 74 53 74 72  pCtx, Tcl_GetStr
13920 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
13930 29 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ), -1, SQLITE_TR
13940 41 4e 53 49 45 4e 54 29 3b 0a 20 20 70 56 61 6c  ANSIENT);.  pVal
13950 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
13960 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
13970 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
13980 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53 74 72  , -1, Tcl_GetStr
13990 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ingResult(interp
139a0 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49 54 45  ), .      SQLITE
139b0 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54  _UTF8, SQLITE_ST
139c0 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74 65 33  ATIC);.  sqlite3
139d0 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36 62 65  _result_text16be
139e0 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
139f0 61 6c 75 65 5f 74 65 78 74 31 36 62 65 28 70 56  alue_text16be(pV
13a00 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
13a10 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
13a20 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  ;.  sqlite3Value
13a30 46 72 65 65 28 70 56 61 6c 29 3b 0a 7d 0a 73 74  Free(pVal);.}.st
13a40 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 66  atic void test_f
13a50 75 6e 63 74 69 6f 6e 5f 75 74 66 31 36 6c 65 28  unction_utf16le(
13a60 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
13a70 78 74 20 2a 70 43 74 78 2c 20 0a 20 20 69 6e 74  xt *pCtx, .  int
13a80 20 6e 41 72 67 2c 0a 20 20 73 71 6c 69 74 65 33   nArg,.  sqlite3
13a90 5f 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b  _value **argv.){
13aa0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
13ab0 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a  nterp;.  Tcl_Obj
13ac0 20 2a 70 58 3b 0a 20 20 73 71 6c 69 74 65 33 5f   *pX;.  sqlite3_
13ad0 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69  value *pVal;.  i
13ae0 6e 74 65 72 70 20 3d 20 28 54 63 6c 5f 49 6e 74  nterp = (Tcl_Int
13af0 65 72 70 20 2a 29 73 71 6c 69 74 65 33 5f 75 73  erp *)sqlite3_us
13b00 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b 0a 20  er_data(pCtx);. 
13b10 20 70 58 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72   pX = Tcl_NewStr
13b20 69 6e 67 4f 62 6a 28 22 74 65 73 74 5f 66 75 6e  ingObj("test_fun
13b30 63 74 69 6f 6e 22 2c 20 2d 31 29 3b 0a 20 20 54  ction", -1);.  T
13b40 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
13b50 70 58 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  pX);.  Tcl_ListO
13b60 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
13b70 69 6e 74 65 72 70 2c 20 70 58 2c 20 54 63 6c 5f  interp, pX, Tcl_
13b80 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 55 54  NewStringObj("UT
13b90 46 2d 31 36 4c 45 22 2c 20 2d 31 29 29 3b 0a 20  F-16LE", -1));. 
13ba0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
13bb0 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
13bc0 2c 20 70 58 2c 20 0a 20 20 20 20 20 20 54 63 6c  , pX, .      Tcl
13bd0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 28 63  _NewStringObj((c
13be0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
13bf0 75 65 5f 74 65 78 74 28 61 72 67 76 5b 30 5d 29  ue_text(argv[0])
13c00 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f 45 76  , -1));.  Tcl_Ev
13c10 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
13c20 70 58 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 44 65  pX, 0);.  Tcl_De
13c30 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b 0a  crRefCount(pX);.
13c40 20 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33    pVal = sqlite3
13c50 56 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73  ValueNew(0);.  s
13c60 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74  qlite3ValueSetSt
13c70 72 28 70 56 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f  r(pVal, -1, Tcl_
13c80 47 65 74 53 74 72 69 6e 67 52 65 73 75 6c 74 28  GetStringResult(
13c90 69 6e 74 65 72 70 29 2c 20 0a 20 20 20 20 20 20  interp), .      
13ca0 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c  SQLITE_UTF8, SQL
13cb0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 73  ITE_STATIC);.  s
13cc0 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
13cd0 78 74 28 70 43 74 78 2c 28 63 68 61 72 2a 29 73  xt(pCtx,(char*)s
13ce0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
13cf0 74 28 70 56 61 6c 29 2c 2d 31 2c 53 51 4c 49 54  t(pVal),-1,SQLIT
13d00 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
13d10 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
13d20 28 70 56 61 6c 29 3b 0a 7d 0a 73 74 61 74 69 63  (pVal);.}.static
13d30 20 76 6f 69 64 20 74 65 73 74 5f 66 75 6e 63 74   void test_funct
13d40 69 6f 6e 5f 75 74 66 31 36 62 65 28 0a 20 20 73  ion_utf16be(.  s
13d50 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
13d60 70 43 74 78 2c 20 0a 20 20 69 6e 74 20 6e 41 72  pCtx, .  int nAr
13d70 67 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c  g,.  sqlite3_val
13d80 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 54  ue **argv.){.  T
13d90 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13da0 70 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 58  p;.  Tcl_Obj *pX
13db0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ;.  sqlite3_valu
13dc0 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 65 72  e *pVal;.  inter
13dd0 70 20 3d 20 28 54 63 6c 5f 49 6e 74 65 72 70 20  p = (Tcl_Interp 
13de0 2a 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64  *)sqlite3_user_d
13df0 61 74 61 28 70 43 74 78 29 3b 0a 20 20 70 58 20  ata(pCtx);.  pX 
13e00 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  = Tcl_NewStringO
13e10 62 6a 28 22 74 65 73 74 5f 66 75 6e 63 74 69 6f  bj("test_functio
13e20 6e 22 2c 20 2d 31 29 3b 0a 20 20 54 63 6c 5f 49  n", -1);.  Tcl_I
13e30 6e 63 72 52 65 66 43 6f 75 6e 74 28 70 58 29 3b  ncrRefCount(pX);
13e40 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70  .  Tcl_ListObjAp
13e50 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65  pendElement(inte
13e60 72 70 2c 20 70 58 2c 20 54 63 6c 5f 4e 65 77 53  rp, pX, Tcl_NewS
13e70 74 72 69 6e 67 4f 62 6a 28 22 55 54 46 2d 31 36  tringObj("UTF-16
13e80 42 45 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  BE", -1));.  Tcl
13e90 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c  _ListObjAppendEl
13ea0 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 58  ement(interp, pX
13eb0 2c 20 0a 20 20 20 20 20 20 54 63 6c 5f 4e 65 77  , .      Tcl_New
13ec0 53 74 72 69 6e 67 4f 62 6a 28 28 63 68 61 72 2a  StringObj((char*
13ed0 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
13ee0 65 78 74 28 61 72 67 76 5b 30 5d 29 2c 20 2d 31  ext(argv[0]), -1
13ef0 29 29 3b 0a 20 20 54 63 6c 5f 45 76 61 6c 4f 62  ));.  Tcl_EvalOb
13f00 6a 45 78 28 69 6e 74 65 72 70 2c 20 70 58 2c 20  jEx(interp, pX, 
13f10 30 29 3b 0a 20 20 54 63 6c 5f 44 65 63 72 52 65  0);.  Tcl_DecrRe
13f20 66 43 6f 75 6e 74 28 70 58 29 3b 0a 20 20 70 56  fCount(pX);.  pV
13f30 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
13f40 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
13f50 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
13f60 61 6c 2c 20 2d 31 2c 20 54 63 6c 5f 47 65 74 53  al, -1, Tcl_GetS
13f70 74 72 69 6e 67 52 65 73 75 6c 74 28 69 6e 74 65  tringResult(inte
13f80 72 70 29 2c 20 0a 20 20 20 20 20 20 53 51 4c 49  rp), .      SQLI
13f90 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54 45 5f  TE_UTF8, SQLITE_
13fa0 53 54 41 54 49 43 29 3b 0a 20 20 73 71 6c 69 74  STATIC);.  sqlit
13fb0 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 31 36  e3_result_text16
13fc0 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 76  (pCtx, sqlite3_v
13fd0 61 6c 75 65 5f 74 65 78 74 31 36 6c 65 28 70 56  alue_text16le(pV
13fe0 61 6c 29 2c 0a 20 20 20 20 20 20 2d 31 2c 20 53  al),.      -1, S
13ff0 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
14000 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75  ;.  sqlite3_resu
14010 6c 74 5f 74 65 78 74 31 36 62 65 28 70 43 74 78  lt_text16be(pCtx
14020 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  , sqlite3_value_
14030 74 65 78 74 31 36 6c 65 28 70 56 61 6c 29 2c 0a  text16le(pVal),.
14040 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45        -1, SQLITE
14050 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 73  _TRANSIENT);.  s
14060 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65  qlite3_result_te
14070 78 74 31 36 6c 65 28 70 43 74 78 2c 20 73 71 6c  xt16le(pCtx, sql
14080 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
14090 36 6c 65 28 70 56 61 6c 29 2c 0a 20 20 20 20 20  6le(pVal),.     
140a0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
140b0 53 49 45 4e 54 29 3b 0a 20 20 73 71 6c 69 74 65  SIENT);.  sqlite
140c0 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
140d0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
140e0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
140f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
14100 73 74 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  st_function(.  v
14110 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
14120 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
14130 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
14140 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
14150 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23  ONST objv[].){.#
14160 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14170 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69 74  IT_UTF16.  sqlit
14180 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 76 61  e3 *db;.  int va
14190 6c 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  l;..  if( objc!=
141a0 35 20 29 20 67 6f 74 6f 20 62 61 64 5f 61 72 67  5 ) goto bad_arg
141b0 73 3b 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f  s;.  if( getDbPo
141c0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
141d0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
141e0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
141f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
14200 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
14210 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
14220 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
14230 5b 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [2], &val) ) ret
14240 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14250 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
14260 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14270 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
14280 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
14290 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 0a 20 20  SQLITE_UTF8, .  
142a0 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
142b0 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 38  st_function_utf8
142c0 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  , 0, 0);.  }.  i
142d0 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63 6c 5f 47  f( TCL_OK!=Tcl_G
142e0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
142f0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
14300 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75 72 6e  , &val) ) return
14310 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
14320 28 20 76 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c  ( val ){.    sql
14330 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
14340 74 69 6f 6e 28 64 62 2c 20 22 74 65 73 74 5f 66  tion(db, "test_f
14350 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20 53 51 4c  unction", 1, SQL
14360 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 0a 20 20  ITE_UTF16LE, .  
14370 20 20 20 20 20 20 69 6e 74 65 72 70 2c 20 74 65        interp, te
14380 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75 74 66 31  st_function_utf1
14390 36 6c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  6le, 0, 0);.  }.
143a0 20 20 69 66 28 20 54 43 4c 5f 4f 4b 21 3d 54 63    if( TCL_OK!=Tc
143b0 6c 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d  l_GetBooleanFrom
143c0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
143d0 5b 34 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74  [4], &val) ) ret
143e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
143f0 20 69 66 28 20 76 61 6c 20 29 7b 0a 20 20 20 20   if( val ){.    
14400 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
14410 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 74 65 73  unction(db, "tes
14420 74 5f 66 75 6e 63 74 69 6f 6e 22 2c 20 31 2c 20  t_function", 1, 
14430 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20  SQLITE_UTF16BE, 
14440 0a 20 20 20 20 20 20 20 20 69 6e 74 65 72 70 2c  .        interp,
14450 20 74 65 73 74 5f 66 75 6e 63 74 69 6f 6e 5f 75   test_function_u
14460 74 66 31 36 62 65 2c 20 30 2c 20 30 29 3b 0a 20  tf16be, 0, 0);. 
14470 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
14480 5f 4f 4b 3b 0a 62 61 64 5f 61 72 67 73 3a 0a 20  _OK;.bad_args:. 
14490 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
144a0 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
144b0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
144c0 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 54 63  be \"",.      Tc
144d0 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f  l_GetStringFromO
144e0 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20  bj(objv[0], 0), 
144f0 22 20 3c 44 42 3e 20 3c 75 74 66 38 3e 20 3c 75  " <DB> <utf8> <u
14500 74 66 31 36 6c 65 3e 20 3c 75 74 66 31 36 62 65  tf16le> <utf16be
14510 3e 22 2c 20 30 29 3b 0a 23 65 6e 64 69 66 20 2f  >", 0);.#endif /
14520 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
14530 46 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  F16 */.  return 
14540 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  TCL_ERROR;.}../*
14550 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 20 20 20  .** Usage:      
14560 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
14570 65 72 72 73 74 72 20 3c 65 72 72 20 63 6f 64 65  errstr <err code
14580 3e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 61  >.**.** Test tha
14590 74 20 74 68 65 20 65 6e 67 6c 69 73 68 20 6c 61  t the english la
145a0 6e 67 75 61 67 65 20 73 74 72 69 6e 67 20 65 71  nguage string eq
145b0 75 69 76 61 6c 65 6e 74 73 20 66 6f 72 20 73 71  uivalents for sq
145c0 6c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 73  lite error codes
145d0 0a 2a 2a 20 61 72 65 20 73 61 6e 65 2e 20 54 68  .** are sane. Th
145e0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 61  e parameter is a
145f0 6e 20 69 6e 74 65 67 65 72 20 72 65 70 72 65 73  n integer repres
14600 65 6e 74 69 6e 67 20 61 6e 20 73 71 6c 69 74 65  enting an sqlite
14610 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20   error code..** 
14620 54 68 65 20 72 65 73 75 6c 74 20 69 73 20 61 20  The result is a 
14630 6c 69 73 74 20 6f 66 20 74 77 6f 20 65 6c 65 6d  list of two elem
14640 65 6e 74 73 2c 20 74 68 65 20 73 74 72 69 6e 67  ents, the string
14650 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
14660 6f 66 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20  of the.** error 
14670 63 6f 64 65 20 61 6e 64 20 74 68 65 20 65 6e 67  code and the eng
14680 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
14690 70 6c 61 6e 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  planation..*/.st
146a0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
146b0 72 73 74 72 28 0a 20 20 76 6f 69 64 20 2a 20 63  rstr(.  void * c
146c0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
146d0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
146e0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
146f0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
14700 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 2a  jv[].){.  char *
14710 7a 43 6f 64 65 3b 0a 20 20 69 6e 74 20 69 3b 0a  zCode;.  int i;.
14720 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29 7b    if( objc!=1 ){
14730 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
14740 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
14750 20 6f 62 6a 76 2c 20 22 3c 65 72 72 6f 72 20 63   objv, "<error c
14760 6f 64 65 3e 22 29 3b 0a 20 20 7d 0a 0a 20 20 7a  ode>");.  }..  z
14770 43 6f 64 65 20 3d 20 54 63 6c 5f 47 65 74 53 74  Code = Tcl_GetSt
14780 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20  ring(objv[1]);. 
14790 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 30 30 3b   for(i=0; i<200;
147a0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30   i++){.    if( 0
147b0 3d 3d 73 74 72 63 6d 70 28 74 31 45 72 72 6f 72  ==strcmp(t1Error
147c0 4e 61 6d 65 28 69 29 2c 20 7a 43 6f 64 65 29 20  Name(i), zCode) 
147d0 29 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 54  ) break;.  }.  T
147e0 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74  cl_SetResult(int
147f0 65 72 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c  erp, (char *)sql
14800 69 74 65 33 45 72 72 53 74 72 28 69 29 2c 20 30  ite3ErrStr(i), 0
14810 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
14820 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
14830 67 65 3a 20 20 20 20 62 72 65 61 6b 70 6f 69 6e  ge:    breakpoin
14840 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  t.**.** This rou
14850 74 69 6e 65 20 65 78 69 73 74 73 20 66 6f 72 20  tine exists for 
14860 6f 6e 65 20 70 75 72 70 6f 73 65 20 2d 20 74 6f  one purpose - to
14870 20 70 72 6f 76 69 64 65 20 61 20 70 6c 61 63 65   provide a place
14880 20 74 6f 20 70 75 74 20 61 0a 2a 2a 20 62 72 65   to put a.** bre
14890 61 6b 70 6f 69 6e 74 20 77 69 74 68 20 47 44 42  akpoint with GDB
148a0 20 74 68 61 74 20 63 61 6e 20 62 65 20 74 72 69   that can be tri
148b0 67 67 65 72 65 64 20 75 73 69 6e 67 20 54 43 4c  ggered using TCL
148c0 20 63 6f 64 65 2e 20 20 54 68 65 20 75 73 65 0a   code.  The use.
148d0 2a 2a 20 66 6f 72 20 74 68 69 73 20 69 73 20 77  ** for this is w
148e0 68 65 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72  hen a particular
148f0 20 74 65 73 74 20 66 61 69 6c 73 20 6f 6e 20 28   test fails on (
14900 73 61 79 29 20 74 68 65 20 31 34 38 35 74 68 20  say) the 1485th 
14910 69 74 65 72 61 74 69 6f 6e 2e 0a 2a 2a 20 49 6e  iteration..** In
14920 20 74 68 65 20 54 43 4c 20 74 65 73 74 20 73 63   the TCL test sc
14930 72 69 70 74 2c 20 77 65 20 63 61 6e 20 61 64 64  ript, we can add
14940 20 63 6f 64 65 20 6c 69 6b 65 20 74 68 69 73 3a   code like this:
14950 0a 2a 2a 0a 2a 2a 20 20 20 20 20 69 66 20 7b 24  .**.**     if {$
14960 69 3d 3d 31 34 38 35 7d 20 62 72 65 61 6b 70 6f  i==1485} breakpo
14970 69 6e 74 0a 2a 2a 0a 2a 2a 20 54 68 65 6e 20 72  int.**.** Then r
14980 75 6e 20 74 65 73 74 66 69 78 74 75 72 65 20 69  un testfixture i
14990 6e 20 74 68 65 20 64 65 62 75 67 67 65 72 20 61  n the debugger a
149a0 6e 64 20 77 61 69 74 20 66 6f 72 20 74 68 65 20  nd wait for the 
149b0 62 72 65 61 6b 70 6f 69 6e 74 20 74 6f 0a 2a 2a  breakpoint to.**
149c0 20 66 69 72 65 2e 20 20 54 68 65 6e 20 61 64 64   fire.  Then add
149d0 69 74 69 6f 6e 61 6c 20 62 72 65 61 6b 70 6f 69  itional breakpoi
149e0 6e 74 73 20 63 61 6e 20 62 65 20 73 65 74 20 74  nts can be set t
149f0 6f 20 74 72 61 63 65 20 64 6f 77 6e 20 74 68 65  o trace down the
14a00 20 62 75 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   bug..*/.static 
14a10 69 6e 74 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  int test_breakpo
14a20 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 4e 6f 74  int(.  void *Not
14a30 55 73 65 64 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Used,.  Tcl_Inte
14a40 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
14a50 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
14a60 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
14a70 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
14a80 2a 2f 0a 20 20 69 6e 74 20 61 72 67 63 2c 20 20  */.  int argc,  
14a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
14aa0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
14ab0 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ts */.  char **a
14ac0 72 67 76 20 20 20 20 20 20 20 20 20 20 20 20 2f  rgv            /
14ad0 2a 20 54 65 78 74 20 6f 66 20 65 61 63 68 20 61  * Text of each a
14ae0 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  rgument */.){.  
14af0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20  return TCL_OK;  
14b00 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74         /* Do not
14b10 68 69 6e 67 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  hing */.}../*.**
14b20 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
14b30 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62 20  3_bind_zeroblob 
14b40 20 53 54 4d 54 20 49 44 58 20 4e 0a 2a 2a 0a 2a   STMT IDX N.**.*
14b50 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
14b60 65 33 5f 62 69 6e 64 5f 7a 65 72 6f 62 6c 6f 62  e3_bind_zeroblob
14b70 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d   interface.  STM
14b80 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64 20  T is a prepared 
14b90 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 49 44  statement..** ID
14ba0 58 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  X is the index o
14bb0 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
14bc0 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
14bd0 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
14be0 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
14bf0 20 4e 2d 62 79 74 65 20 7a 65 72 6f 2d 66 69 6c   N-byte zero-fil
14c00 6c 65 64 20 42 4c 4f 42 20 74 6f 20 74 68 65 20  led BLOB to the 
14c10 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61  wildcard..*/.sta
14c20 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e  tic int test_bin
14c30 64 5f 7a 65 72 6f 62 6c 6f 62 28 0a 20 20 76 6f  d_zeroblob(.  vo
14c40 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
14c50 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
14c60 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
14c70 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
14c80 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
14c90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
14ca0 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78 3b 0a  tmt;.  int idx;.
14cb0 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 72    int n;.  int r
14cc0 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
14cd0 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  4 ){.    Tcl_Wro
14ce0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
14cf0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
14d00 20 49 44 58 20 4e 22 29 3b 0a 20 20 20 20 72 65   IDX N");.    re
14d10 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
14d20 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
14d30 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
14d40 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
14d50 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
14d60 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
14d70 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
14d80 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
14d90 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
14da0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
14db0 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54  L_ERROR;.  if( T
14dc0 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a  cl_GetIntFromObj
14dd0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
14de0 2c 20 26 6e 29 20 29 20 72 65 74 75 72 6e 20 54  , &n) ) return T
14df0 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
14e00 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 7a  = sqlite3_bind_z
14e10 65 72 6f 62 6c 6f 62 28 70 53 74 6d 74 2c 20 69  eroblob(pStmt, i
14e20 64 78 2c 20 6e 29 3b 0a 20 20 69 66 28 20 73 71  dx, n);.  if( sq
14e30 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
14e40 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
14e50 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
14e60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
14e70 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
14e80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
14e90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
14ea0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
14eb0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
14ec0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
14ed0 69 6e 64 5f 69 6e 74 20 20 53 54 4d 54 20 4e 20  ind_int  STMT N 
14ee0 56 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 65 73 74  VALUE.**.** Test
14ef0 20 74 68 65 20 73 71 6c 69 74 65 33 5f 62 69 6e   the sqlite3_bin
14f00 64 5f 69 6e 74 20 69 6e 74 65 72 66 61 63 65 2e  d_int interface.
14f10 20 20 53 54 4d 54 20 69 73 20 61 20 70 72 65 70    STMT is a prep
14f20 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a  ared statement..
14f30 2a 2a 20 4e 20 69 73 20 74 68 65 20 69 6e 64 65  ** N is the inde
14f40 78 20 6f 66 20 61 20 77 69 6c 64 63 61 72 64 20  x of a wildcard 
14f50 69 6e 20 74 68 65 20 70 72 65 70 61 72 65 64 20  in the prepared 
14f60 73 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73  statement.  This
14f70 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64   command.** bind
14f80 73 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  s a 32-bit integ
14f90 65 72 20 56 41 4c 55 45 20 74 6f 20 74 68 61 74  er VALUE to that
14fa0 20 77 69 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74   wildcard..*/.st
14fb0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69  atic int test_bi
14fc0 6e 64 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a  nd_int(.  void *
14fd0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
14fe0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
14ff0 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
15000 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
15010 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
15020 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
15030 0a 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e  .  int idx;.  in
15040 74 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72  t value;.  int r
15050 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  c;..  if( objc!=
15060 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
15070 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
15080 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
15090 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a   should be \"",.
150a0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53          Tcl_GetS
150b0 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a  tringFromObj(obj
150c0 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53 54 4d 54  v[0], 0), " STMT
150d0 20 4e 20 56 41 4c 55 45 22 2c 20 30 29 3b 0a 20   N VALUE", 0);. 
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 69 66 28 20  ROR;.  }..  if( 
15100 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
15110 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
15120 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
15130 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
15140 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
15150 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
15160 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
15170 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74 75  2], &idx) ) retu
15180 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
15190 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
151a0 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
151b0 6a 76 5b 33 5d 2c 20 26 76 61 6c 75 65 29 20 29  jv[3], &value) )
151c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
151d0 52 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  R;..  rc = sqlit
151e0 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 74 6d  e3_bind_int(pStm
151f0 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a  t, idx, value);.
15200 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
15210 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  tErrCode(interp,
15220 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74 29   StmtToDb(pStmt)
15230 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
15240 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
15250 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
15260 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
15270 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65  ERROR;.  }..  re
15280 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
15290 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20  ./*.** Usage:   
152a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
152b0 36 34 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45  64  STMT N VALUE
152c0 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20  .**.** Test the 
152d0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
152e0 36 34 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  64 interface.  S
152f0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
15300 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
15310 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
15320 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
15330 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
15340 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
15350 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
15360 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
15370 56 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69  VALUE to that wi
15380 6c 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69  ldcard..*/.stati
15390 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f  c int test_bind_
153a0 69 6e 74 36 34 28 0a 20 20 76 6f 69 64 20 2a 20  int64(.  void * 
153b0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
153c0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
153d0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
153e0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
153f0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
15400 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
15410 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 54 63 6c    int idx;.  Tcl
15420 5f 57 69 64 65 49 6e 74 20 76 61 6c 75 65 3b 0a  _WideInt value;.
15430 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
15440 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
15450 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
15460 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
15470 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
15480 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54  e \"",.        T
15490 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  cl_GetStringFrom
154a0 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c  Obj(objv[0], 0),
154b0 20 22 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 22   " STMT N VALUE"
154c0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
154d0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
154e0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
154f0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
15500 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
15510 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
15520 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
15530 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
15540 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
15550 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 69 64 78 29  , objv[2], &idx)
15560 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
15570 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
15580 65 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a  etWideIntFromObj
15590 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
155a0 2c 20 26 76 61 6c 75 65 29 20 29 20 72 65 74 75  , &value) ) retu
155b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20  rn TCL_ERROR;.. 
155c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69   rc = sqlite3_bi
155d0 6e 64 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c 20  nd_int64(pStmt, 
155e0 69 64 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 69  idx, value);.  i
155f0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
15600 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 53 74  rCode(interp, St
15610 6d 74 54 6f 44 62 28 70 53 74 6d 74 29 2c 20 72  mtToDb(pStmt), r
15620 63 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  c) ) return TCL_
15630 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 21  ERROR;.  if( rc!
15640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15650 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
15660 4f 52 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  OR;.  }..  retur
15670 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  n TCL_OK;.}.../*
15680 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c  .** Usage:   sql
15690 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65  ite3_bind_double
156a0 20 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 0a 2a    STMT N VALUE.*
156b0 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71  *.** Test the sq
156c0 6c 69 74 65 33 5f 62 69 6e 64 5f 64 6f 75 62 6c  lite3_bind_doubl
156d0 65 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53 54  e interface.  ST
156e0 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65 64  MT is a prepared
156f0 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e   statement..** N
15700 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f 66   is the index of
15710 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20 74   a wildcard in t
15720 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61 74  he prepared stat
15730 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d  ement.  This com
15740 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20  mand.** binds a 
15750 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20 56  64-bit integer V
15760 41 4c 55 45 20 74 6f 20 74 68 61 74 20 77 69 6c  ALUE to that wil
15770 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
15780 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 64   int test_bind_d
15790 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a 20  ouble(.  void * 
157a0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
157b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
157c0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
157d0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
157e0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
157f0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
15800 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 64 6f 75    int idx;.  dou
15810 62 6c 65 20 76 61 6c 75 65 3b 0a 20 20 69 6e 74  ble value;.  int
15820 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61   rc;.  const cha
15830 72 20 2a 7a 56 61 6c 3b 0a 20 20 69 6e 74 20 69  r *zVal;.  int i
15840 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
15850 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 63 6f   struct {.    co
15860 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
15870 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
15880 74 68 65 20 73 70 65 63 69 61 6c 20 66 6c 6f 61  the special floa
15890 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65  ting point value
158a0 20 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64   */.    unsigned
158b0 20 69 6e 74 20 69 55 70 70 65 72 3b 20 20 20 2f   int iUpper;   /
158c0 2a 20 55 70 70 65 72 20 33 32 20 62 69 74 73 20  * Upper 32 bits 
158d0 2a 2f 0a 20 20 20 20 75 6e 73 69 67 6e 65 64 20  */.    unsigned 
158e0 69 6e 74 20 69 4c 6f 77 65 72 3b 20 20 20 2f 2a  int iLower;   /*
158f0 20 4c 6f 77 65 72 20 33 32 20 62 69 74 73 20 2a   Lower 32 bits *
15900 2f 0a 20 20 7d 20 61 53 70 65 63 69 61 6c 46 70  /.  } aSpecialFp
15910 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 20 22 4e  [] = {.    {  "N
15920 61 4e 22 2c 20 20 20 20 20 20 30 78 37 66 66 66  aN",      0x7fff
15930 66 66 66 66 2c 20 30 78 66 66 66 66 66 66 66 66  ffff, 0xffffffff
15940 20 7d 2c 0a 20 20 20 20 7b 20 20 22 53 4e 61 4e   },.    {  "SNaN
15950 22 2c 20 20 20 20 20 30 78 37 66 66 37 66 66 66  ",     0x7ff7fff
15960 66 2c 20 30 78 66 66 66 66 66 66 66 66 20 7d 2c  f, 0xffffffff },
15970 0a 20 20 20 20 7b 20 20 22 2d 4e 61 4e 22 2c 20  .    {  "-NaN", 
15980 20 20 20 20 30 78 66 66 66 66 66 66 66 66 2c 20      0xffffffff, 
15990 30 78 66 66 66 66 66 66 66 66 20 7d 2c 0a 20 20  0xffffffff },.  
159a0 20 20 7b 20 20 22 2d 53 4e 61 4e 22 2c 20 20 20    {  "-SNaN",   
159b0 20 30 78 66 66 66 37 66 66 66 66 2c 20 30 78 66   0xfff7ffff, 0xf
159c0 66 66 66 66 66 66 66 20 7d 2c 0a 20 20 20 20 7b  fffffff },.    {
159d0 20 20 22 2b 49 6e 66 22 2c 20 20 20 20 20 30 78    "+Inf",     0x
159e0 37 66 66 30 30 30 30 30 2c 20 30 78 30 30 30 30  7ff00000, 0x0000
159f0 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22  0000 },.    {  "
15a00 2d 49 6e 66 22 2c 20 20 20 20 20 30 78 66 66 66  -Inf",     0xfff
15a10 30 30 30 30 30 2c 20 30 78 30 30 30 30 30 30 30  00000, 0x0000000
15a20 30 20 7d 2c 0a 20 20 20 20 7b 20 20 22 45 70 73  0 },.    {  "Eps
15a30 69 6c 6f 6e 22 2c 20 20 30 78 30 30 30 30 30 30  ilon",  0x000000
15a40 30 30 2c 20 30 78 30 30 30 30 30 30 30 31 20 7d  00, 0x00000001 }
15a50 2c 0a 20 20 20 20 7b 20 20 22 2d 45 70 73 69 6c  ,.    {  "-Epsil
15a60 6f 6e 22 2c 20 30 78 38 30 30 30 30 30 30 30 2c  on", 0x80000000,
15a70 20 30 78 30 30 30 30 30 30 30 31 20 7d 2c 0a 20   0x00000001 },. 
15a80 20 20 20 7b 20 20 22 4e 61 4e 30 22 2c 20 20 20     {  "NaN0",   
15a90 20 20 30 78 37 66 66 38 30 30 30 30 2c 20 30 78    0x7ff80000, 0x
15aa0 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20  00000000 },.    
15ab0 7b 20 20 22 2d 4e 61 4e 30 22 2c 20 20 20 20 30  {  "-NaN0",    0
15ac0 78 66 66 66 38 30 30 30 30 2c 20 30 78 30 30 30  xfff80000, 0x000
15ad0 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 0a 20  00000 },.  };.. 
15ae0 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
15af0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
15b00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
15b10 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
15b20 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
15b30 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
15b40 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
15b50 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
15b60 4c 55 45 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  LUE", 0);.    re
15b70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
15b80 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
15b90 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
15ba0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
15bb0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
15bc0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
15bd0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
15be0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
15bf0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
15c00 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
15c10 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 49  L_ERROR;..  /* I
15c20 6e 74 65 72 63 65 70 74 20 74 68 65 20 73 74 72  ntercept the str
15c30 69 6e 67 20 22 4e 61 4e 22 20 61 6e 64 20 67 65  ing "NaN" and ge
15c40 6e 65 72 61 74 65 20 61 20 4e 61 4e 20 76 61 6c  nerate a NaN val
15c50 75 65 20 66 6f 72 20 69 74 2e 0a 20 20 2a 2a 20  ue for it..  ** 
15c60 41 6c 6c 20 6f 74 68 65 72 20 73 74 72 69 6e 67  All other string
15c70 73 20 61 72 65 20 70 61 73 73 65 64 20 74 68 72  s are passed thr
15c80 6f 75 67 68 20 74 6f 20 54 63 6c 5f 47 65 74 44  ough to Tcl_GetD
15c90 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 29 2e 0a  oubleFromObj()..
15ca0 20 20 2a 2a 20 54 63 6c 5f 47 65 74 44 6f 75 62    ** Tcl_GetDoub
15cb0 6c 65 46 72 6f 6d 4f 62 6a 28 29 20 73 68 6f 75  leFromObj() shou
15cc0 6c 64 20 75 6e 64 65 72 73 74 61 6e 64 20 22 4e  ld understand "N
15cd0 61 4e 22 20 62 75 74 20 73 6f 6d 65 20 76 65 72  aN" but some ver
15ce0 73 69 6f 6e 73 0a 20 20 2a 2a 20 63 6f 6e 74 61  sions.  ** conta
15cf0 69 6e 20 61 20 62 75 67 2e 0a 20 20 2a 2f 0a 20  in a bug..  */. 
15d00 20 7a 56 61 6c 20 3d 20 54 63 6c 5f 47 65 74 53   zVal = Tcl_GetS
15d10 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a  tring(objv[3]);.
15d20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a    for(i=0; i<siz
15d30 65 6f 66 28 61 53 70 65 63 69 61 6c 46 70 29 2f  eof(aSpecialFp)/
15d40 73 69 7a 65 6f 66 28 61 53 70 65 63 69 61 6c 46  sizeof(aSpecialF
15d50 70 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  p[0]); i++){.   
15d60 20 69 66 28 20 73 74 72 63 6d 70 28 61 53 70 65   if( strcmp(aSpe
15d70 63 69 61 6c 46 70 5b 69 5d 2e 7a 4e 61 6d 65 2c  cialFp[i].zName,
15d80 20 7a 56 61 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zVal)==0 ){.   
15d90 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
15da0 34 20 78 3b 0a 20 20 20 20 20 20 78 20 3d 20 61  4 x;.      x = a
15db0 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 55 70  SpecialFp[i].iUp
15dc0 70 65 72 3b 0a 20 20 20 20 20 20 78 20 3c 3c 3d  per;.      x <<=
15dd0 20 33 32 3b 0a 20 20 20 20 20 20 78 20 7c 3d 20   32;.      x |= 
15de0 61 53 70 65 63 69 61 6c 46 70 5b 69 5d 2e 69 4c  aSpecialFp[i].iL
15df0 6f 77 65 72 3b 0a 20 20 20 20 20 20 61 73 73 65  ower;.      asse
15e00 72 74 28 20 73 69 7a 65 6f 66 28 76 61 6c 75 65  rt( sizeof(value
15e10 29 3d 3d 38 20 29 3b 0a 20 20 20 20 20 20 61 73  )==8 );.      as
15e20 73 65 72 74 28 20 73 69 7a 65 6f 66 28 78 29 3d  sert( sizeof(x)=
15e30 3d 38 20 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63  =8 );.      memc
15e40 70 79 28 26 76 61 6c 75 65 2c 20 26 78 2c 20 38  py(&value, &x, 8
15e50 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
15e60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
15e70 69 3e 3d 73 69 7a 65 6f 66 28 61 53 70 65 63 69  i>=sizeof(aSpeci
15e80 61 6c 46 70 29 2f 73 69 7a 65 6f 66 28 61 53 70  alFp)/sizeof(aSp
15e90 65 63 69 61 6c 46 70 5b 30 5d 29 20 26 26 0a 20  ecialFp[0]) &&. 
15ea0 20 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 44          Tcl_GetD
15eb0 6f 75 62 6c 65 46 72 6f 6d 4f 62 6a 28 69 6e 74  oubleFromObj(int
15ec0 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76  erp, objv[3], &v
15ed0 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 72 65 74  alue) ){.    ret
15ee0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
15ef0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
15f00 33 5f 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 53  3_bind_double(pS
15f10 74 6d 74 2c 20 69 64 78 2c 20 76 61 6c 75 65 29  tmt, idx, value)
15f20 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
15f30 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
15f40 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
15f50 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
15f60 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
15f70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15f80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
15f90 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
15fa0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
15fb0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
15fc0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75   sqlite3_bind_nu
15fd0 6c 6c 20 20 53 54 4d 54 20 4e 0a 2a 2a 0a 2a 2a  ll  STMT N.**.**
15fe0 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74 65   Test the sqlite
15ff0 33 5f 62 69 6e 64 5f 6e 75 6c 6c 20 69 6e 74 65  3_bind_null inte
16000 72 66 61 63 65 2e 20 20 53 54 4d 54 20 69 73 20  rface.  STMT is 
16010 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74 65  a prepared state
16020 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73 20 74 68  ment..** N is th
16030 65 20 69 6e 64 65 78 20 6f 66 20 61 20 77 69 6c  e index of a wil
16040 64 63 61 72 64 20 69 6e 20 74 68 65 20 70 72 65  dcard in the pre
16050 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 2e  pared statement.
16060 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64 0a 2a    This command.*
16070 2a 20 62 69 6e 64 73 20 61 20 4e 55 4c 4c 20 74  * binds a NULL t
16080 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64 2e 0a  o the wildcard..
16090 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
160a0 73 74 5f 62 69 6e 64 5f 6e 75 6c 6c 28 0a 20 20  st_bind_null(.  
160b0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
160c0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
160d0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
160e0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
160f0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
16100 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
16110 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 69 64 78  pStmt;.  int idx
16120 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
16130 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20  f( objc!=3 ){.  
16140 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
16150 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e  lt(interp, "wron
16160 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64  g # args: should
16170 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20   be \"",.       
16180 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72   Tcl_GetStringFr
16190 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30  omObj(objv[0], 0
161a0 29 2c 20 22 20 53 54 4d 54 20 4e 22 2c 20 30 29  ), " STMT N", 0)
161b0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
161c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69  _ERROR;.  }..  i
161d0 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65  f( getStmtPointe
161e0 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65  r(interp, Tcl_Ge
161f0 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
16200 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74 75  , &pStmt) ) retu
16210 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
16220 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
16230 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
16240 6a 76 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72  jv[2], &idx) ) r
16250 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
16260 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
16270 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74  _bind_null(pStmt
16280 2c 20 69 64 78 29 3b 0a 20 20 69 66 28 20 73 71  , idx);.  if( sq
16290 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
162a0 28 69 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44  (interp, StmtToD
162b0 62 28 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20  b(pStmt), rc) ) 
162c0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
162d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
162e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
162f0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16300 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 54 43 4c   }..  return TCL
16310 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
16320 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 62  age:   sqlite3_b
16330 69 6e 64 5f 74 65 78 74 20 20 53 54 4d 54 20 4e  ind_text  STMT N
16340 20 53 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a   STRING BYTES.**
16350 0a 2a 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c  .** Test the sql
16360 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 20 69  ite3_bind_text i
16370 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
16380 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
16390 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
163a0 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
163b0 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
163c0 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
163d0 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
163e0 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46  d.** binds a UTF
163f0 2d 38 20 73 74 72 69 6e 67 20 53 54 52 49 4e 47  -8 string STRING
16400 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72 64   to the wildcard
16410 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69 73  .  The string is
16420 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a 20   BYTES bytes.** 
16430 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  long..*/.static 
16440 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74 65  int test_bind_te
16450 78 74 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  xt(.  void * cli
16460 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
16470 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
16480 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
16490 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
164a0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  [].){.  sqlite3_
164b0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69  stmt *pStmt;.  i
164c0 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74 20 62 79  nt idx;.  int by
164d0 74 65 73 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c  tes;.  char *val
164e0 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  ue;.  int rc;.. 
164f0 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 29 7b 0a   if( objc!=5 ){.
16500 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
16510 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
16520 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
16530 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20 20 20  ld be \"",.     
16540 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
16550 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30 5d 2c  FromObj(objv[0],
16560 20 30 29 2c 20 22 20 53 54 4d 54 20 4e 20 56 41   0), " STMT N VA
16570 4c 55 45 20 42 59 54 45 53 22 2c 20 30 29 3b 0a  LUE BYTES", 0);.
16580 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
16590 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  RROR;.  }..  if(
165a0 20 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28   getStmtPointer(
165b0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
165c0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
165d0 26 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e  &pStmt) ) return
165e0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
165f0 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
16600 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
16610 5b 32 5d 2c 20 26 69 64 78 29 20 29 20 72 65 74  [2], &idx) ) ret
16620 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
16630 20 76 61 6c 75 65 20 3d 20 28 63 68 61 72 2a 29   value = (char*)
16640 54 63 6c 5f 47 65 74 42 79 74 65 41 72 72 61 79  Tcl_GetByteArray
16650 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c  FromObj(objv[3],
16660 20 26 62 79 74 65 73 29 3b 0a 20 20 69 66 28 20   &bytes);.  if( 
16670 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62  Tcl_GetIntFromOb
16680 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34  j(interp, objv[4
16690 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65 74  ], &bytes) ) ret
166a0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
166b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62    rc = sqlite3_b
166c0 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
166d0 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74 65  idx, value, byte
166e0 73 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  s, SQLITE_TRANSI
166f0 45 4e 54 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ENT);.  if( sqli
16700 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
16710 6e 74 65 72 70 2c 20 53 74 6d 74 54 6f 44 62 28  nterp, StmtToDb(
16720 70 53 74 6d 74 29 2c 20 72 63 29 20 29 20 72 65  pStmt), rc) ) re
16730 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16740 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
16750 5f 4f 4b 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  _OK ){.    Tcl_A
16760 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
16770 72 70 2c 20 73 71 6c 69 74 65 33 45 72 72 4e 61  rp, sqlite3ErrNa
16780 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 20 20  me(rc), 0);.    
16790 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
167a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
167b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
167c0 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74 65   Usage:   sqlite
167d0 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 3f 2d  3_bind_text16 ?-
167e0 73 74 61 74 69 63 3f 20 53 54 4d 54 20 4e 20 53  static? STMT N S
167f0 54 52 49 4e 47 20 42 59 54 45 53 0a 2a 2a 0a 2a  TRING BYTES.**.*
16800 2a 20 54 65 73 74 20 74 68 65 20 73 71 6c 69 74  * Test the sqlit
16810 65 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 20 69  e3_bind_text16 i
16820 6e 74 65 72 66 61 63 65 2e 20 20 53 54 4d 54 20  nterface.  STMT 
16830 69 73 20 61 20 70 72 65 70 61 72 65 64 20 73 74  is a prepared st
16840 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20 4e 20 69 73  atement..** N is
16850 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 61 20   the index of a 
16860 77 69 6c 64 63 61 72 64 20 69 6e 20 74 68 65 20  wildcard in the 
16870 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
16880 6e 74 2e 20 20 54 68 69 73 20 63 6f 6d 6d 61 6e  nt.  This comman
16890 64 0a 2a 2a 20 62 69 6e 64 73 20 61 20 55 54 46  d.** binds a UTF
168a0 2d 31 36 20 73 74 72 69 6e 67 20 53 54 52 49 4e  -16 string STRIN
168b0 47 20 74 6f 20 74 68 65 20 77 69 6c 64 63 61 72  G to the wildcar
168c0 64 2e 20 20 54 68 65 20 73 74 72 69 6e 67 20 69  d.  The string i
168d0 73 20 42 59 54 45 53 20 62 79 74 65 73 0a 2a 2a  s BYTES bytes.**
168e0 20 6c 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63   long..*/.static
168f0 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 74   int test_bind_t
16900 65 78 74 31 36 28 0a 20 20 76 6f 69 64 20 2a 20  ext16(.  void * 
16910 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16920 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16930 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16940 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16950 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65 66  bjv[].){.#ifndef
16960 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
16970 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  16.  sqlite3_stm
16980 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20  t *pStmt;.  int 
16990 69 64 78 3b 0a 20 20 69 6e 74 20 62 79 74 65 73  idx;.  int bytes
169a0 3b 0a 20 20 63 68 61 72 20 2a 76 61 6c 75 65 3b  ;.  char *value;
169b0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 76 6f  .  int rc;..  vo
169c0 69 64 20 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  id (*xDel)(void*
169d0 29 20 3d 20 28 6f 62 6a 63 3d 3d 36 3f 53 51 4c  ) = (objc==6?SQL
169e0 49 54 45 5f 53 54 41 54 49 43 3a 53 51 4c 49 54  ITE_STATIC:SQLIT
169f0 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20  E_TRANSIENT);.  
16a00 54 63 6c 5f 4f 62 6a 20 2a 6f 53 74 6d 74 20 20  Tcl_Obj *oStmt  
16a10 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a 63 2d 34 5d    = objv[objc-4]
16a20 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 4e 20  ;.  Tcl_Obj *oN 
16a30 20 20 20 20 20 20 3d 20 6f 62 6a 76 5b 6f 62 6a        = objv[obj
16a40 63 2d 33 5d 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20  c-3];.  Tcl_Obj 
16a50 2a 6f 53 74 72 69 6e 67 20 20 3d 20 6f 62 6a 76  *oString  = objv
16a60 5b 6f 62 6a 63 2d 32 5d 3b 0a 20 20 54 63 6c 5f  [objc-2];.  Tcl_
16a70 4f 62 6a 20 2a 6f 42 79 74 65 73 20 20 20 3d 20  Obj *oBytes   = 
16a80 6f 62 6a 76 5b 6f 62 6a 63 2d 31 5d 3b 0a 0a 20  objv[objc-1];.. 
16a90 20 69 66 28 20 6f 62 6a 63 21 3d 35 20 26 26 20   if( objc!=5 && 
16aa0 6f 62 6a 63 21 3d 36 29 7b 0a 20 20 20 20 54 63  objc!=6){.    Tc
16ab0 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
16ac0 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
16ad0 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
16ae0 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
16af0 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
16b00 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
16b10 20 53 54 4d 54 20 4e 20 56 41 4c 55 45 20 42 59   STMT N VALUE BY
16b20 54 45 53 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  TES", 0);.    re
16b30 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
16b40 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
16b50 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
16b60 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
16b70 6f 53 74 6d 74 29 2c 20 26 70 53 74 6d 74 29 20  oStmt), &pStmt) 
16b80 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
16b90 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
16ba0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
16bb0 72 70 2c 20 6f 4e 2c 20 26 69 64 78 29 20 29 20  rp, oN, &idx) ) 
16bc0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
16bd0 3b 0a 20 20 76 61 6c 75 65 20 3d 20 28 63 68 61  ;.  value = (cha
16be0 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65 41 72  r*)Tcl_GetByteAr
16bf0 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 53 74 72 69  rayFromObj(oStri
16c00 6e 67 2c 20 30 29 3b 0a 20 20 69 66 28 20 54 63  ng, 0);.  if( Tc
16c10 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
16c20 69 6e 74 65 72 70 2c 20 6f 42 79 74 65 73 2c 20  interp, oBytes, 
16c30 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
16c40 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
16c50 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  c = sqlite3_bind
16c60 5f 74 65 78 74 31 36 28 70 53 74 6d 74 2c 20 69  _text16(pStmt, i
16c70 64 78 2c 20 28 76 6f 69 64 20 2a 29 76 61 6c 75  dx, (void *)valu
16c80 65 2c 20 62 79 74 65 73 2c 20 78 44 65 6c 29 3b  e, bytes, xDel);
16c90 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
16ca0 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
16cb0 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d 74  , StmtToDb(pStmt
16cc0 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20  ), rc) ) return 
16cd0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
16ce0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
16cf0 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
16d00 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 73  Result(interp, s
16d10 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 72 63  qlite3ErrName(rc
16d20 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
16d30 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
16d40 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ..#endif /* SQLI
16d50 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
16d60 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
16d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
16d80 3a 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  :   sqlite3_bind
16d90 5f 62 6c 6f 62 20 3f 2d 73 74 61 74 69 63 3f 20  _blob ?-static? 
16da0 53 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45  STMT N DATA BYTE
16db0 53 0a 2a 2a 0a 2a 2a 20 54 65 73 74 20 74 68 65  S.**.** Test the
16dc0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62 6c   sqlite3_bind_bl
16dd0 6f 62 20 69 6e 74 65 72 66 61 63 65 2e 20 20 53  ob interface.  S
16de0 54 4d 54 20 69 73 20 61 20 70 72 65 70 61 72 65  TMT is a prepare
16df0 64 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2a 20  d statement..** 
16e00 4e 20 69 73 20 74 68 65 20 69 6e 64 65 78 20 6f  N is the index o
16e10 66 20 61 20 77 69 6c 64 63 61 72 64 20 69 6e 20  f a wildcard in 
16e20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74 61  the prepared sta
16e30 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20 63 6f  tement.  This co
16e40 6d 6d 61 6e 64 0a 2a 2a 20 62 69 6e 64 73 20 61  mmand.** binds a
16e50 20 42 4c 4f 42 20 74 6f 20 74 68 65 20 77 69 6c   BLOB to the wil
16e60 64 63 61 72 64 2e 20 20 54 68 65 20 42 4c 4f 42  dcard.  The BLOB
16e70 20 69 73 20 42 59 54 45 53 20 62 79 74 65 73 20   is BYTES bytes 
16e80 69 6e 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  in size..*/.stat
16e90 69 63 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64  ic int test_bind
16ea0 5f 62 6c 6f 62 28 0a 20 20 76 6f 69 64 20 2a 20  _blob(.  void * 
16eb0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
16ec0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
16ed0 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
16ee0 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
16ef0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
16f00 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a  e3_stmt *pStmt;.
16f10 20 20 69 6e 74 20 69 64 78 3b 0a 20 20 69 6e 74    int idx;.  int
16f20 20 62 79 74 65 73 3b 0a 20 20 63 68 61 72 20 2a   bytes;.  char *
16f30 76 61 6c 75 65 3b 0a 20 20 69 6e 74 20 72 63 3b  value;.  int rc;
16f40 0a 20 20 73 71 6c 69 74 65 33 5f 64 65 73 74 72  .  sqlite3_destr
16f50 75 63 74 6f 72 5f 74 79 70 65 20 78 44 65 73 74  uctor_type xDest
16f60 72 75 63 74 6f 72 20 3d 20 53 51 4c 49 54 45 5f  ructor = SQLITE_
16f70 54 52 41 4e 53 49 45 4e 54 3b 0a 0a 20 20 69 66  TRANSIENT;..  if
16f80 28 20 6f 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a  ( objc!=5 && obj
16f90 63 21 3d 36 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=6 ){.    Tcl_
16fa0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
16fb0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
16fc0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
16fd0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
16fe0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
16ff0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 53  objv[0], 0), " S
17000 54 4d 54 20 4e 20 44 41 54 41 20 42 59 54 45 53  TMT N DATA BYTES
17010 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
17020 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17030 0a 0a 20 20 69 66 28 20 6f 62 6a 63 3d 3d 36 20  ..  if( objc==6 
17040 29 7b 0a 20 20 20 20 78 44 65 73 74 72 75 63 74  ){.    xDestruct
17050 6f 72 20 3d 20 53 51 4c 49 54 45 5f 53 54 41 54  or = SQLITE_STAT
17060 49 43 3b 0a 20 20 20 20 6f 62 6a 76 2b 2b 3b 0a  IC;.    objv++;.
17070 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
17080 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
17090 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
170a0 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
170b0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
170c0 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
170d0 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
170e0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
170f0 69 64 78 29 20 29 20 72 65 74 75 72 6e 20 54 43  idx) ) return TC
17100 4c 5f 45 52 52 4f 52 3b 0a 20 20 76 61 6c 75 65  L_ERROR;.  value
17110 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
17120 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20 20 69 66 28  (objv[3]);.  if(
17130 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
17140 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
17150 34 5d 2c 20 26 62 79 74 65 73 29 20 29 20 72 65  4], &bytes) ) re
17160 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
17170 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
17180 62 69 6e 64 5f 62 6c 6f 62 28 70 53 74 6d 74 2c  bind_blob(pStmt,
17190 20 69 64 78 2c 20 76 61 6c 75 65 2c 20 62 79 74   idx, value, byt
171a0 65 73 2c 20 78 44 65 73 74 72 75 63 74 6f 72 29  es, xDestructor)
171b0 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54  ;.  if( sqlite3T
171c0 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72  estErrCode(inter
171d0 70 2c 20 53 74 6d 74 54 6f 44 62 28 70 53 74 6d  p, StmtToDb(pStm
171e0 74 29 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e  t), rc) ) return
171f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66   TCL_ERROR;.  if
17200 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17210 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  ){.    return TC
17220 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
17230 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
17240 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20  ../*.** Usage:  
17250 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
17260 72 61 6d 65 74 65 72 5f 63 6f 75 6e 74 20 20 53  rameter_count  S
17270 54 4d 54 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  TMT.**.** Return
17280 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 77   the number of w
17290 69 6c 64 63 61 72 64 73 20 69 6e 20 74 68 65 20  ildcards in the 
172a0 67 69 76 65 6e 20 73 74 61 74 65 6d 65 6e 74 2e  given statement.
172b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
172c0 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  est_bind_paramet
172d0 65 72 5f 63 6f 75 6e 74 28 0a 20 20 76 6f 69 64  er_count(.  void
172e0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
172f0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
17300 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
17310 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
17320 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71  T objv[].){.  sq
17330 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
17340 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  t;..  if( objc!=
17350 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
17360 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
17370 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53 54 4d 54  , 1, objv, "STMT
17380 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
17390 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
173a0 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
173b0 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
173c0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
173d0 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
173e0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
173f0 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
17400 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
17410 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f  wIntObj(sqlite3_
17420 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 63  bind_parameter_c
17430 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b 0a 20  ount(pStmt)));. 
17440 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
17450 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
17460 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70    sqlite3_bind_p
17470 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 20 20 53  arameter_name  S
17480 54 4d 54 20 20 4e 0a 2a 2a 0a 2a 2a 20 52 65 74  TMT  N.**.** Ret
17490 75 72 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  urn the name of 
174a0 74 68 65 20 4e 74 68 20 77 69 6c 64 63 61 72 64  the Nth wildcard
174b0 2e 20 20 54 68 65 20 66 69 72 73 74 20 77 69 6c  .  The first wil
174c0 64 63 61 72 64 20 69 73 20 31 2e 0a 2a 2a 20 41  dcard is 1..** A
174d0 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67 20 69  n empty string i
174e0 73 20 72 65 74 75 72 6e 65 64 20 69 66 20 4e 20  s returned if N 
174f0 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  is out of range 
17500 6f 72 20 69 66 20 74 68 65 20 77 69 6c 64 63 61  or if the wildca
17510 72 64 0a 2a 2a 20 69 73 20 6e 61 6d 65 6c 65 73  rd.** is nameles
17520 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
17530 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72 61 6d   test_bind_param
17540 65 74 65 72 5f 6e 61 6d 65 28 0a 20 20 76 6f 69  eter_name(.  voi
17550 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
17560 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
17570 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
17580 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
17590 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
175a0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
175b0 6d 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  mt;.  int i;..  
175c0 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20  if( objc!=3 ){. 
175d0 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41     Tcl_WrongNumA
175e0 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f  rgs(interp, 1, o
175f0 62 6a 76 2c 20 22 53 54 4d 54 20 4e 22 29 3b 0a  bjv, "STMT N");.
17600 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
17610 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
17620 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
17630 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
17640 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
17650 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
17660 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
17670 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
17680 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
17690 32 5d 2c 20 26 69 29 20 29 20 72 65 74 75 72 6e  2], &i) ) return
176a0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63   TCL_ERROR;.  Tc
176b0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
176c0 6e 74 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c  nterp, .     Tcl
176d0 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71  _NewStringObj(sq
176e0 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
176f0 65 74 65 72 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  eter_name(pStmt,
17700 69 29 2c 2d 31 29 0a 20 20 29 3b 0a 20 20 72 65  i),-1).  );.  re
17710 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17720 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
17730 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
17740 6d 65 74 65 72 5f 69 6e 64 65 78 20 20 53 54 4d  meter_index  STM
17750 54 20 20 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65  T  NAME.**.** Re
17760 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 6f  turn the index o
17770 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 20 63  f the wildcard c
17780 61 6c 6c 65 64 20 4e 41 4d 45 2e 20 20 52 65 74  alled NAME.  Ret
17790 75 72 6e 20 30 20 69 66 20 74 68 65 72 65 20 69  urn 0 if there i
177a0 73 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 77 69 6c  s.** no such wil
177b0 64 63 61 72 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  dcard..*/.static
177c0 20 69 6e 74 20 74 65 73 74 5f 62 69 6e 64 5f 70   int test_bind_p
177d0 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 0a  arameter_index(.
177e0 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
177f0 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
17800 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
17810 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
17820 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
17830 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
17840 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20   *pStmt;..  if( 
17850 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
17860 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28  cl_WrongNumArgs(
17870 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c  interp, 1, objv,
17880 20 22 53 54 4d 54 20 4e 41 4d 45 22 29 3b 0a 20   "STMT NAME");. 
17890 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
178a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
178b0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
178c0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
178d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
178e0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
178f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c 5f  CL_ERROR;.  Tcl_
17900 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
17910 65 72 70 2c 20 0a 20 20 20 20 20 54 63 6c 5f 4e  erp, .     Tcl_N
17920 65 77 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20  ewIntObj(.      
17930 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61   sqlite3_bind_pa
17940 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53  rameter_index(pS
17950 74 6d 74 2c 54 63 6c 5f 47 65 74 53 74 72 69 6e  tmt,Tcl_GetStrin
17960 67 28 6f 62 6a 76 5b 32 5d 29 29 0a 20 20 20 20  g(objv[2])).    
17970 20 29 0a 20 20 29 3b 0a 20 20 72 65 74 75 72 6e   ).  );.  return
17980 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
17990 2a 20 55 73 61 67 65 3a 20 20 20 73 71 6c 69 74  * Usage:   sqlit
179a0 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
179b0 73 20 53 54 4d 54 0a 2a 2a 0a 2a 2f 0a 73 74 61  s STMT.**.*/.sta
179c0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6c 65  tic int test_cle
179d0 61 72 5f 62 69 6e 64 69 6e 67 73 28 0a 20 20 76  ar_bindings(.  v
179e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
179f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
17a00 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
17a10 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
17a20 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
17a30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
17a40 53 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  Stmt;..  if( obj
17a50 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=2 ){.    Tcl_
17a60 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
17a70 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 53  erp, 1, objv, "S
17a80 54 4d 54 22 29 3b 0a 20 20 20 20 72 65 74 75 72  TMT");.    retur
17a90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17aa0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
17ab0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
17ac0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
17ad0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
17ae0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
17af0 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65  ;.  Tcl_SetObjRe
17b00 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
17b10 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69 74  _NewIntObj(sqlit
17b20 65 33 5f 63 6c 65 61 72 5f 62 69 6e 64 69 6e 67  e3_clear_binding
17b30 73 28 70 53 74 6d 74 29 29 29 3b 0a 20 20 72 65  s(pStmt)));.  re
17b40 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17b50 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 73  /*.** Usage:   s
17b60 71 6c 69 74 65 33 5f 73 6c 65 65 70 20 4d 49 4c  qlite3_sleep MIL
17b70 4c 49 53 45 43 4f 4e 44 53 0a 2a 2f 0a 73 74 61  LISECONDS.*/.sta
17b80 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 6c 65  tic int test_sle
17b90 65 70 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  ep(.  void * cli
17ba0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17bb0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17bc0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17bd0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17be0 5b 5d 0a 29 7b 0a 20 20 69 6e 74 20 6d 73 3b 0a  [].){.  int ms;.
17bf0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29  .  if( objc!=2 )
17c00 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
17c10 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
17c20 2c 20 6f 62 6a 76 2c 20 22 4d 49 4c 4c 49 53 45  , objv, "MILLISE
17c30 43 4f 4e 44 53 22 29 3b 0a 20 20 20 20 72 65 74  CONDS");.    ret
17c40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
17c50 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
17c60 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
17c70 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 6d 73 29  p, objv[1], &ms)
17c80 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
17c90 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
17ca0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
17cb0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
17cc0 49 6e 74 4f 62 6a 28 73 71 6c 69 74 65 33 5f 73  IntObj(sqlite3_s
17cd0 6c 65 65 70 28 6d 73 29 29 29 3b 0a 20 20 72 65  leep(ms)));.  re
17ce0 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
17cf0 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
17d00 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
17d10 72 63 6f 64 65 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rcode DB.**.** R
17d20 65 74 75 72 6e 20 74 68 65 20 73 74 72 69 6e 67  eturn the string
17d30 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
17d40 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
17d50 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
17d60 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 20  .** error code. 
17d70 65 2e 67 2e 20 22 53 51 4c 49 54 45 5f 45 52 52  e.g. "SQLITE_ERR
17d80 4f 52 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  OR"..*/.static i
17d90 6e 74 20 74 65 73 74 5f 65 78 5f 65 72 72 63 6f  nt test_ex_errco
17da0 64 65 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  de(.  void * cli
17db0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
17dc0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
17dd0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
17de0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
17df0 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  [].){.  sqlite3 
17e00 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
17e10 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b    if( objc!=2 ){
17e20 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
17e30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77  esult(interp, "w
17e40 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f  rong # args: sho
17e50 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20  uld be \"", .   
17e60 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e      Tcl_GetStrin
17e70 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44 42  g(objv[0]), " DB
17e80 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
17e90 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
17ea0 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
17eb0 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
17ec0 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
17ed0 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74 75 72  ]), &db) ) retur
17ee0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
17ef0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 74 65  c = sqlite3_exte
17f00 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 64 62 29  nded_errcode(db)
17f10 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
17f20 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68  sult(interp, (ch
17f30 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65  ar *)t1ErrorName
17f40 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65 74 75  (rc), 0);.  retu
17f50 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  rn TCL_OK;.}.../
17f60 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69  *.** Usage: sqli
17f70 74 65 33 5f 65 72 72 63 6f 64 65 20 44 42 0a 2a  te3_errcode DB.*
17f80 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17f90 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74  string represent
17fa0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
17fb0 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65 33  t recent sqlite3
17fc0 5f 2a 20 41 50 49 0a 2a 2a 20 65 72 72 6f 72 20  _* API.** error 
17fd0 63 6f 64 65 2e 20 65 2e 67 2e 20 22 53 51 4c 49  code. e.g. "SQLI
17fe0 54 45 5f 45 52 52 4f 52 22 2e 0a 2a 2f 0a 73 74  TE_ERROR"..*/.st
17ff0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 65 72  atic int test_er
18000 72 63 6f 64 65 28 0a 20 20 76 6f 69 64 20 2a 20  rcode(.  void * 
18010 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18020 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18030 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18040 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18050 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18060 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
18070 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
18080 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18090 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
180a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
180b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
180c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
180d0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
180e0 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
180f0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18100 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
18110 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
18120 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
18130 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65  v[1]), &db) ) re
18140 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
18150 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
18160 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 54 63  rrcode(db);.  Tc
18170 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
18180 6e 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74  nterp, (char *)t
18190 31 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20  1ErrorName(rc), 
181a0 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  0);.  return TCL
181b0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
181c0 61 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 65  age:   sqlite3_e
181d0 72 72 6d 73 67 20 44 42 0a 2a 2a 0a 2a 2a 20 52  rrmsg DB.**.** R
181e0 65 74 75 72 6e 73 20 74 68 65 20 55 54 46 2d 38  eturns the UTF-8
181f0 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
18200 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73  of the error mes
18210 73 61 67 65 20 73 74 72 69 6e 67 20 66 6f 72 20  sage string for 
18220 74 68 65 0a 2a 2a 20 6d 6f 73 74 20 72 65 63 65  the.** most rece
18230 6e 74 20 73 71 6c 69 74 65 33 5f 2a 20 41 50 49  nt sqlite3_* API
18240 20 63 61 6c 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63   call..*/.static
18250 20 69 6e 74 20 74 65 73 74 5f 65 72 72 6d 73 67   int test_errmsg
18260 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
18270 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
18280 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
18290 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
182a0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
182b0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
182c0 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b;.  const char 
182d0 2a 7a 45 72 72 3b 0a 0a 20 20 69 66 28 20 6f 62  *zErr;..  if( ob
182e0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
182f0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
18300 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
18310 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
18320 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f  "", .       Tcl_
18330 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30  GetString(objv[0
18340 5d 29 2c 20 22 20 44 42 22 2c 20 30 29 3b 0a 20  ]), " DB", 0);. 
18350 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
18360 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
18370 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
18380 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
18390 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
183a0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
183b0 52 4f 52 3b 0a 0a 20 20 7a 45 72 72 20 3d 20 73  ROR;..  zErr = s
183c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
183d0 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  );.  Tcl_SetObjR
183e0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
183f0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
18400 45 72 72 2c 20 2d 31 29 29 3b 0a 20 20 72 65 74  Err, -1));.  ret
18410 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
18420 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 20 74 65  *.** Usage:   te
18430 73 74 5f 65 72 72 6d 73 67 31 36 20 44 42 0a 2a  st_errmsg16 DB.*
18440 2a 0a 2a 2a 20 52 65 74 75 72 6e 73 20 74 68 65  *.** Returns the
18450 20 55 54 46 2d 31 36 20 72 65 70 72 65 73 65 6e   UTF-16 represen
18460 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 65 72  tation of the er
18470 72 6f 72 20 6d 65 73 73 61 67 65 20 73 74 72 69  ror message stri
18480 6e 67 20 66 6f 72 20 74 68 65 0a 2a 2a 20 6d 6f  ng for the.** mo
18490 73 74 20 72 65 63 65 6e 74 20 73 71 6c 69 74 65  st recent sqlite
184a0 33 5f 2a 20 41 50 49 20 63 61 6c 6c 2e 20 54 68  3_* API call. Th
184b0 69 73 20 69 73 20 61 20 62 79 74 65 20 61 72 72  is is a byte arr
184c0 61 79 20 6f 62 6a 65 63 74 20 61 74 20 74 68 65  ay object at the
184d0 20 54 43 4c 20 0a 2a 2a 20 6c 65 76 65 6c 2c 20   TCL .** level, 
184e0 61 6e 64 20 69 74 20 69 6e 63 6c 75 64 65 73 20  and it includes 
184f0 74 68 65 20 30 78 30 30 20 30 78 30 30 20 74 65  the 0x00 0x00 te
18500 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 73 20 61  rminator bytes a
18510 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
18520 0a 2a 2a 20 55 54 46 2d 31 36 20 73 74 72 69 6e  .** UTF-16 strin
18530 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
18540 20 74 65 73 74 5f 65 72 72 6d 73 67 31 36 28 0a   test_errmsg16(.
18550 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
18560 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
18570 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
18580 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
18590 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
185a0 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
185b0 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71  _OMIT_UTF16.  sq
185c0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
185d0 73 74 20 76 6f 69 64 20 2a 7a 45 72 72 3b 0a 20  st void *zErr;. 
185e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a   const char *z;.
185f0 20 20 69 6e 74 20 62 79 74 65 73 20 3d 20 30 3b    int bytes = 0;
18600 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
18610 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
18620 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
18630 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
18640 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
18650 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
18660 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
18670 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
18680 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
18690 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
186a0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
186b0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
186c0 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
186d0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a  urn TCL_ERROR;..
186e0 20 20 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33    zErr = sqlite3
186f0 5f 65 72 72 6d 73 67 31 36 28 64 62 29 3b 0a 20  _errmsg16(db);. 
18700 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
18710 20 7a 20 3d 20 7a 45 72 72 3b 0a 20 20 20 20 66   z = zErr;.    f
18720 6f 72 28 62 79 74 65 73 3d 30 3b 20 7a 5b 62 79  or(bytes=0; z[by
18730 74 65 73 5d 20 7c 7c 20 7a 5b 62 79 74 65 73 2b  tes] || z[bytes+
18740 31 5d 3b 20 62 79 74 65 73 2b 3d 32 29 7b 7d 0a  1]; bytes+=2){}.
18750 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a    }.  Tcl_SetObj
18760 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54  Result(interp, T
18770 63 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f  cl_NewByteArrayO
18780 62 6a 28 7a 45 72 72 2c 20 62 79 74 65 73 29 29  bj(zErr, bytes))
18790 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
187a0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
187b0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
187c0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
187d0 3a 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  : sqlite3_prepar
187e0 65 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f  e DB sql bytes ?
187f0 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43  tailvar?.**.** C
18800 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79  ompile up to <by
18810 74 65 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68  tes> bytes of th
18820 65 20 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73  e supplied SQL s
18830 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e  tring <sql> usin
18840 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61  g.** database ha
18850 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70  ndle <DB>. The p
18860 61 72 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61  arameter <tailva
18870 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  l> is the name o
18880 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61  f a global.** va
18890 72 69 61 62 6c 65 20 74 68 61 74 20 69 73 20 73  riable that is s
188a0 65 74 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64  et to the unused
188b0 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c   portion of <sql
188c0 3e 20 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a  > (if any). A.**
188d0 20 53 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20   STMT handle is 
188e0 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
188f0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65  tic int test_pre
18900 70 61 72 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  pare(.  void * c
18910 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
18920 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
18930 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
18940 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
18950 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65  jv[].){.  sqlite
18960 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63  3 *db;.  const c
18970 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
18980 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74 20   bytes;.  const 
18990 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30 3b  char *zTail = 0;
189a0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
189b0 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68  *pStmt = 0;.  ch
189c0 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69  ar zBuf[50];.  i
189d0 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62  nt rc;..  if( ob
189e0 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34  jc!=5 && objc!=4
189f0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
18a00 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
18a10 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
18a20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
18a30 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
18a40 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
18a50 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74   DB sql bytes ?t
18a60 61 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20  ailvar?", 0);.  
18a70 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
18a80 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65  OR;.  }.  if( ge
18a90 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72  tDbPointer(inter
18aa0 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  p, Tcl_GetString
18ab0 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20  (objv[1]), &db) 
18ac0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
18ad0 4f 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c  OR;.  zSql = Tcl
18ae0 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
18af0 32 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  2]);.  if( Tcl_G
18b00 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
18b10 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62  erp, objv[3], &b
18b20 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54  ytes) ) return T
18b30 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20  CL_ERROR;..  rc 
18b40 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
18b50 65 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79 74 65  e(db, zSql, byte
18b60 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a 63 3e  s, &pStmt, objc>
18b70 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20 30 29  =5 ? &zTail : 0)
18b80 3b 0a 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73  ;.  Tcl_ResetRes
18b90 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 69  ult(interp);.  i
18ba0 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 45 72  f( sqlite3TestEr
18bb0 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 64 62  rCode(interp, db
18bc0 2c 20 72 63 29 20 29 20 72 65 74 75 72 6e 20 54  , rc) ) return T
18bd0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20  CL_ERROR;.  if( 
18be0 7a 54 61 69 6c 20 26 26 20 6f 62 6a 63 3e 3d 35  zTail && objc>=5
18bf0 20 29 7b 0a 20 20 20 20 69 66 28 20 62 79 74 65   ){.    if( byte
18c00 73 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 79  s>=0 ){.      by
18c10 74 65 73 20 3d 20 62 79 74 65 73 20 2d 20 28 69  tes = bytes - (i
18c20 6e 74 29 28 7a 54 61 69 6c 2d 7a 53 71 6c 29 3b  nt)(zTail-zSql);
18c30 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 28  .    }.    if( (
18c40 69 6e 74 29 73 74 72 6c 65 6e 28 7a 54 61 69 6c  int)strlen(zTail
18c50 29 3c 62 79 74 65 73 20 29 7b 0a 20 20 20 20 20  )<bytes ){.     
18c60 20 62 79 74 65 73 20 3d 20 28 69 6e 74 29 73 74   bytes = (int)st
18c70 72 6c 65 6e 28 7a 54 61 69 6c 29 3b 0a 20 20 20  rlen(zTail);.   
18c80 20 7d 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 53 65   }.    Tcl_ObjSe
18c90 74 56 61 72 32 28 69 6e 74 65 72 70 2c 20 6f 62  tVar2(interp, ob
18ca0 6a 76 5b 34 5d 2c 20 30 2c 20 54 63 6c 5f 4e 65  jv[4], 0, Tcl_Ne
18cb0 77 53 74 72 69 6e 67 4f 62 6a 28 7a 54 61 69 6c  wStringObj(zTail
18cc0 2c 20 62 79 74 65 73 29 2c 20 30 29 3b 0a 20 20  , bytes), 0);.  
18cd0 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
18ce0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73  TE_OK ){.    ass
18cf0 65 72 74 28 20 70 53 74 6d 74 3d 3d 30 20 29 3b  ert( pStmt==0 );
18d00 0a 20 20 20 20 73 70 72 69 6e 74 66 28 7a 42 75  .    sprintf(zBu
18d10 66 2c 20 22 28 25 64 29 20 22 2c 20 72 63 29 3b  f, "(%d) ", rc);
18d20 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18d30 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
18d40 75 66 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  uf, sqlite3_errm
18d50 73 67 28 64 62 29 2c 20 30 29 3b 0a 20 20 20 20  sg(db), 0);.    
18d60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
18d70 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 53 74  ;.  }..  if( pSt
18d80 6d 74 20 29 7b 0a 20 20 20 20 69 66 28 20 73 71  mt ){.    if( sq
18d90 6c 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69  lite3TestMakePoi
18da0 6e 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20  nterStr(interp, 
18db0 7a 42 75 66 2c 20 70 53 74 6d 74 29 20 29 20 72  zBuf, pStmt) ) r
18dc0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
18dd0 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52  .    Tcl_AppendR
18de0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42  esult(interp, zB
18df0 75 66 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  uf, 0);.  }.  re
18e00 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
18e10 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
18e20 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 20  ite3_prepare_v2 
18e30 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
18e40 69 6c 76 61 72 3f 0a 2a 2a 0a 2a 2a 20 43 6f 6d  ilvar?.**.** Com
18e50 70 69 6c 65 20 75 70 20 74 6f 20 3c 62 79 74 65  pile up to <byte
18e60 73 3e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20  s> bytes of the 
18e70 73 75 70 70 6c 69 65 64 20 53 51 4c 20 73 74 72  supplied SQL str
18e80 69 6e 67 20 3c 73 71 6c 3e 20 75 73 69 6e 67 0a  ing <sql> using.
18e90 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
18ea0 6c 65 20 3c 44 42 3e 2e 20 54 68 65 20 70 61 72  le <DB>. The par
18eb0 61 6d 65 74 65 72 20 3c 74 61 69 6c 76 61 6c 3e  ameter <tailval>
18ec0 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
18ed0 61 20 67 6c 6f 62 61 6c 0a 2a 2a 20 76 61 72 69  a global.** vari
18ee0 61 62 6c 65 20 74 68 61 74 20 69 73 20 73 65 74  able that is set
18ef0 20 74 6f 20 74 68 65 20 75 6e 75 73 65 64 20 70   to the unused p
18f00 6f 72 74 69 6f 6e 20 6f 66 20 3c 73 71 6c 3e 20  ortion of <sql> 
18f10 28 69 66 20 61 6e 79 29 2e 20 41 0a 2a 2a 20 53  (if any). A.** S
18f20 54 4d 54 20 68 61 6e 64 6c 65 20 69 73 20 72 65  TMT handle is re
18f30 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
18f40 63 20 69 6e 74 20 74 65 73 74 5f 70 72 65 70 61  c int test_prepa
18f50 72 65 5f 76 32 28 0a 20 20 76 6f 69 64 20 2a 20  re_v2(.  void * 
18f60 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
18f70 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
18f80 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
18f90 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
18fa0 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
18fb0 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
18fc0 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e  char *zSql;.  in
18fd0 74 20 62 79 74 65 73 3b 0a 20 20 63 6f 6e 73 74  t bytes;.  const
18fe0 20 63 68 61 72 20 2a 7a 54 61 69 6c 20 3d 20 30   char *zTail = 0
18ff0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
19000 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
19010 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
19020 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
19030 62 6a 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d  bjc!=5 && objc!=
19040 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  4 ){.    Tcl_App
19050 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
19060 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a  , "wrong # args:
19070 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20   should be \"", 
19080 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53  .       Tcl_GetS
19090 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20  tring(objv[0]), 
190a0 22 20 44 42 20 73 71 6c 20 62 79 74 65 73 20 74  " DB sql bytes t
190b0 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20 20 20  ailvar", 0);.   
190c0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
190d0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
190e0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
190f0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
19100 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
19110 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19120 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
19130 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32  GetString(objv[2
19140 5d 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  ]);.  if( Tcl_Ge
19150 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
19160 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 62 79  rp, objv[3], &by
19170 74 65 73 29 20 29 20 72 65 74 75 72 6e 20 54 43  tes) ) return TC
19180 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63 20 3d  L_ERROR;..  rc =
19190 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
191a0 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 62 79  _v2(db, zSql, by
191b0 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f 62 6a  tes, &pStmt, obj
191c0 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20 3a 20  c>=5 ? &zTail : 
191d0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 72 63 3d  0);.  assert(rc=
191e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 53  =SQLITE_OK || pS
191f0 74 6d 74 3d 3d 30 29 3b 0a 20 20 54 63 6c 5f 52  tmt==0);.  Tcl_R
19200 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
19210 70 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  p);.  if( sqlite
19220 33 54 65 73 74 45 72 72 43 6f 64 65 28 69 6e 74  3TestErrCode(int
19230 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29 20 72  erp, db, rc) ) r
19240 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
19250 0a 20 20 69 66 28 20 7a 54 61 69 6c 20 26 26 20  .  if( zTail && 
19260 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69  objc>=5 ){.    i
19270 66 28 20 62 79 74 65 73 3e 3d 30 20 29 7b 0a 20  f( bytes>=0 ){. 
19280 20 20 20 20 20 62 79 74 65 73 20 3d 20 62 79 74       bytes = byt
19290 65 73 20 2d 20 28 69 6e 74 29 28 7a 54 61 69 6c  es - (int)(zTail
192a0 2d 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  -zSql);.    }.  
192b0 20 20 54 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32    Tcl_ObjSetVar2
192c0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d  (interp, objv[4]
192d0 2c 20 30 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69  , 0, Tcl_NewStri
192e0 6e 67 4f 62 6a 28 7a 54 61 69 6c 2c 20 62 79 74  ngObj(zTail, byt
192f0 65 73 29 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69  es), 0);.  }.  i
19300 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19310 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
19320 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
19330 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22 28  sprintf(zBuf, "(
19340 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d) ", rc);.    
19350 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19360 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 73  (interp, zBuf, s
19370 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
19380 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ), 0);.    retur
19390 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
193a0 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b  ..  if( pStmt ){
193b0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
193c0 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53  TestMakePointerS
193d0 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c  tr(interp, zBuf,
193e0 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e   pStmt) ) return
193f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
19400 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
19410 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30  (interp, zBuf, 0
19420 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19430 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
19440 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
19450 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 20  prepare_tkt3134 
19460 44 42 0a 2a 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  DB.**.** Generat
19470 65 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  e a prepared sta
19480 74 65 6d 65 6e 74 20 66 6f 72 20 61 20 7a 65 72  tement for a zer
19490 6f 2d 62 79 74 65 20 73 74 72 69 6e 67 20 61 73  o-byte string as
194a0 20 61 20 74 65 73 74 0a 2a 2a 20 66 6f 72 20 74   a test.** for t
194b0 69 63 6b 65 74 20 23 33 31 33 34 2e 20 20 54 68  icket #3134.  Th
194c0 65 20 73 74 72 69 6e 67 20 73 68 6f 75 6c 64 20  e string should 
194d0 62 65 20 70 72 65 63 65 65 64 65 64 20 62 79 20  be preceeded by 
194e0 61 20 7a 65 72 6f 20 62 79 74 65 2e 0a 2a 2f 0a  a zero byte..*/.
194f0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
19500 70 72 65 70 61 72 65 5f 74 6b 74 33 31 33 34 28  prepare_tkt3134(
19510 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
19520 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
19530 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
19540 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
19550 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
19560 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
19570 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
19580 20 63 68 61 72 20 7a 53 71 6c 5b 5d 20 3d 20 22   char zSql[] = "
19590 5c 30 30 30 53 45 4c 45 43 54 20 31 22 3b 0a 20  \000SELECT 1";. 
195a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
195b0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
195c0 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 69 6e 74   zBuf[50];.  int
195d0 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
195e0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
195f0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
19600 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
19610 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
19620 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
19630 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
19640 2c 20 22 20 44 42 20 73 71 6c 20 62 79 74 65 73  , " DB sql bytes
19650 20 74 61 69 6c 76 61 72 22 2c 20 30 29 3b 0a 20   tailvar", 0);. 
19660 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19670 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
19680 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
19690 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
196a0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
196b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
196c0 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ROR;.  rc = sqli
196d0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
196e0 62 2c 20 26 7a 53 71 6c 5b 31 5d 2c 20 30 2c 20  b, &zSql[1], 0, 
196f0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 61 73  &pStmt, 0);.  as
19700 73 65 72 74 28 72 63 3d 3d 53 51 4c 49 54 45 5f  sert(rc==SQLITE_
19710 4f 4b 20 7c 7c 20 70 53 74 6d 74 3d 3d 30 29 3b  OK || pStmt==0);
19720 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65  .  if( sqlite3Te
19730 73 74 45 72 72 43 6f 64 65 28 69 6e 74 65 72 70  stErrCode(interp
19740 2c 20 64 62 2c 20 72 63 29 20 29 20 72 65 74 75  , db, rc) ) retu
19750 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19770 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
19780 20 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20   pStmt==0 );.   
19790 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20 22   sprintf(zBuf, "
197a0 28 25 64 29 20 22 2c 20 72 63 29 3b 0a 20 20 20  (%d) ", rc);.   
197b0 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
197c0 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
197d0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
197e0 62 29 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  b), 0);.    retu
197f0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
19800 7d 0a 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29  }..  if( pStmt )
19810 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
19820 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e 74 65 72  3TestMakePointer
19830 53 74 72 28 69 6e 74 65 72 70 2c 20 7a 42 75 66  Str(interp, zBuf
19840 2c 20 70 53 74 6d 74 29 20 29 20 72 65 74 75 72  , pStmt) ) retur
19850 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
19860 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
19870 74 28 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20  t(interp, zBuf, 
19880 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
19890 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
198a0 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33  * Usage: sqlite3
198b0 5f 70 72 65 70 61 72 65 31 36 20 44 42 20 73 71  _prepare16 DB sq
198c0 6c 20 62 79 74 65 73 20 74 61 69 6c 76 61 72 0a  l bytes tailvar.
198d0 2a 2a 0a 2a 2a 20 43 6f 6d 70 69 6c 65 20 75 70  **.** Compile up
198e0 20 74 6f 20 3c 62 79 74 65 73 3e 20 62 79 74 65   to <bytes> byte
198f0 73 20 6f 66 20 74 68 65 20 73 75 70 70 6c 69 65  s of the supplie
19900 64 20 53 51 4c 20 73 74 72 69 6e 67 20 3c 73 71  d SQL string <sq
19910 6c 3e 20 75 73 69 6e 67 0a 2a 2a 20 64 61 74 61  l> using.** data
19920 62 61 73 65 20 68 61 6e 64 6c 65 20 3c 44 42 3e  base handle <DB>
19930 2e 20 54 68 65 20 70 61 72 61 6d 65 74 65 72 20  . The parameter 
19940 3c 74 61 69 6c 76 61 6c 3e 20 69 73 20 74 68 65  <tailval> is the
19950 20 6e 61 6d 65 20 6f 66 20 61 20 67 6c 6f 62 61   name of a globa
19960 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74 68  l.** variable th
19970 61 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  at is set to the
19980 20 75 6e 75 73 65 64 20 70 6f 72 74 69 6f 6e 20   unused portion 
19990 6f 66 20 3c 73 71 6c 3e 20 28 69 66 20 61 6e 79  of <sql> (if any
199a0 29 2e 20 41 0a 2a 2a 20 53 54 4d 54 20 68 61 6e  ). A.** STMT han
199b0 64 6c 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  dle is returned.
199c0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
199d0 65 73 74 5f 70 72 65 70 61 72 65 31 36 28 0a 20  est_prepare16(. 
199e0 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
199f0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
19a00 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
19a10 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
19a20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
19a30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
19a40 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c  OMIT_UTF16.  sql
19a50 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73  ite3 *db;.  cons
19a60 74 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20  t void *zSql;.  
19a70 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69  const void *zTai
19a80 6c 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a  l = 0;.  Tcl_Obj
19a90 20 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73   *pTail = 0;.  s
19aa0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
19ab0 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  mt = 0;.  char z
19ac0 42 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20  Buf[50]; .  int 
19ad0 72 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b  rc;.  int bytes;
19ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19af0 2f 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73  /* The integer s
19b00 70 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20  pecified as arg 
19b10 33 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65  3 */.  int objle
19b20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
19b30 20 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72   /* The byte-arr
19b40 61 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67  ay length of arg
19b50 20 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a   2 */..  if( obj
19b60 63 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20  c!=5 && objc!=4 
19b70 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
19b80 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
19b90 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
19ba0 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20  hould be \"", . 
19bb0 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72        Tcl_GetStr
19bc0 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20  ing(objv[0]), " 
19bd0 44 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61  DB sql bytes ?ta
19be0 69 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20  ilvar?", 0);.   
19bf0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19c00 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
19c10 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
19c20 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
19c30 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
19c40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19c50 52 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f  R;.  zSql = Tcl_
19c60 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d  GetByteArrayFrom
19c70 4f 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62  Obj(objv[2], &ob
19c80 6a 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c  jlen);.  if( Tcl
19c90 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69  _GetIntFromObj(i
19ca0 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20  nterp, objv[3], 
19cb0 26 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e  &bytes) ) return
19cc0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72   TCL_ERROR;..  r
19cd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
19ce0 61 72 65 31 36 28 64 62 2c 20 7a 53 71 6c 2c 20  are16(db, zSql, 
19cf0 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c 20 6f  bytes, &pStmt, o
19d00 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69 6c 20  bjc>=5 ? &zTail 
19d10 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  : 0);.  if( sqli
19d20 74 65 33 54 65 73 74 45 72 72 43 6f 64 65 28 69  te3TestErrCode(i
19d30 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29 20 29  nterp, db, rc) )
19d40 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
19d50 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  R;.  if( rc ){. 
19d60 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
19d70 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
19d80 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20 20 69  objc>=5 ){.    i
19d90 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20 20 20  f( zTail ){.    
19da0 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a 6c 65    objlen = objle
19db0 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20 2a 29  n - (int)((u8 *)
19dc0 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53 71 6c  zTail-(u8 *)zSql
19dd0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
19de0 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30 3b 0a      objlen = 0;.
19df0 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69 6c 20      }.    pTail 
19e00 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72 72  = Tcl_NewByteArr
19e10 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54 61 69  ayObj((u8 *)zTai
19e20 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20 20 20  l, objlen);.    
19e30 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
19e40 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54 63 6c  (pTail);.    Tcl
19e50 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e 74 65  _ObjSetVar2(inte
19e60 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30 2c 20  rp, objv[4], 0, 
19e70 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20 20 54  pTail, 0);.    T
19e80 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
19e90 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20 20 69  pTail);.  }..  i
19ea0 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
19eb0 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
19ec0 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
19ed0 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53 74 6d  terp, zBuf, pStm
19ee0 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  t) ) return TCL_
19ef0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
19f00 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
19f10 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a  terp, zBuf, 0);.
19f20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
19f30 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 20  _OMIT_UTF16 */. 
19f40 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
19f50 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
19f60 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 31  sqlite3_prepare1
19f70 36 5f 76 32 20 44 42 20 73 71 6c 20 62 79 74 65  6_v2 DB sql byte
19f80 73 20 3f 74 61 69 6c 76 61 72 3f 0a 2a 2a 0a 2a  s ?tailvar?.**.*
19f90 2a 20 43 6f 6d 70 69 6c 65 20 75 70 20 74 6f 20  * Compile up to 
19fa0 3c 62 79 74 65 73 3e 20 62 79 74 65 73 20 6f 66  <bytes> bytes of
19fb0 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 53 51   the supplied SQ
19fc0 4c 20 73 74 72 69 6e 67 20 3c 73 71 6c 3e 20 75  L string <sql> u
19fd0 73 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65  sing.** database
19fe0 20 68 61 6e 64 6c 65 20 3c 44 42 3e 2e 20 54 68   handle <DB>. Th
19ff0 65 20 70 61 72 61 6d 65 74 65 72 20 3c 74 61 69  e parameter <tai
1a000 6c 76 61 6c 3e 20 69 73 20 74 68 65 20 6e 61 6d  lval> is the nam
1a010 65 20 6f 66 20 61 20 67 6c 6f 62 61 6c 0a 2a 2a  e of a global.**
1a020 20 76 61 72 69 61 62 6c 65 20 74 68 61 74 20 69   variable that i
1a030 73 20 73 65 74 20 74 6f 20 74 68 65 20 75 6e 75  s set to the unu
1a040 73 65 64 20 70 6f 72 74 69 6f 6e 20 6f 66 20 3c  sed portion of <
1a050 73 71 6c 3e 20 28 69 66 20 61 6e 79 29 2e 20 41  sql> (if any). A
1a060 0a 2a 2a 20 53 54 4d 54 20 68 61 6e 64 6c 65 20  .** STMT handle 
1a070 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
1a080 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1a090 70 72 65 70 61 72 65 31 36 5f 76 32 28 0a 20 20  prepare16_v2(.  
1a0a0 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1a0b0 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1a0c0 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f  *interp,.  int o
1a0d0 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  bjc,.  Tcl_Obj *
1a0e0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a  CONST objv[].){.
1a0f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a100 4d 49 54 5f 55 54 46 31 36 0a 20 20 73 71 6c 69  MIT_UTF16.  sqli
1a110 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74  te3 *db;.  const
1a120 20 76 6f 69 64 20 2a 7a 53 71 6c 3b 0a 20 20 63   void *zSql;.  c
1a130 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 54 61 69 6c  onst void *zTail
1a140 20 3d 20 30 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   = 0;.  Tcl_Obj 
1a150 2a 70 54 61 69 6c 20 3d 20 30 3b 0a 20 20 73 71  *pTail = 0;.  sq
1a160 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1a170 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 42  t = 0;.  char zB
1a180 75 66 5b 35 30 5d 3b 20 0a 20 20 69 6e 74 20 72  uf[50]; .  int r
1a190 63 3b 0a 20 20 69 6e 74 20 62 79 74 65 73 3b 20  c;.  int bytes; 
1a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a1b0 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 73 70  * The integer sp
1a1c0 65 63 69 66 69 65 64 20 61 73 20 61 72 67 20 33  ecified as arg 3
1a1d0 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 6c 65 6e   */.  int objlen
1a1e0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1a1f0 2f 2a 20 54 68 65 20 62 79 74 65 2d 61 72 72 61  /* The byte-arra
1a200 79 20 6c 65 6e 67 74 68 20 6f 66 20 61 72 67 20  y length of arg 
1a210 32 20 2a 2f 0a 0a 20 20 69 66 28 20 6f 62 6a 63  2 */..  if( objc
1a220 21 3d 35 20 26 26 20 6f 62 6a 63 21 3d 34 20 29  !=5 && objc!=4 )
1a230 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
1a240 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
1a250 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
1a260 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20  ould be \"", .  
1a270 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
1a280 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 44  ng(objv[0]), " D
1a290 42 20 73 71 6c 20 62 79 74 65 73 20 3f 74 61 69  B sql bytes ?tai
1a2a0 6c 76 61 72 3f 22 2c 20 30 29 3b 0a 20 20 20 20  lvar?", 0);.    
1a2b0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a2c0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44  ;.  }.  if( getD
1a2d0 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
1a2e0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1a2f0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 20  bjv[1]), &db) ) 
1a300 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1a310 3b 0a 20 20 7a 53 71 6c 20 3d 20 54 63 6c 5f 47  ;.  zSql = Tcl_G
1a320 65 74 42 79 74 65 41 72 72 61 79 46 72 6f 6d 4f  etByteArrayFromO
1a330 62 6a 28 6f 62 6a 76 5b 32 5d 2c 20 26 6f 62 6a  bj(objv[2], &obj
1a340 6c 65 6e 29 3b 0a 20 20 69 66 28 20 54 63 6c 5f  len);.  if( Tcl_
1a350 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1a360 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26  terp, objv[3], &
1a370 62 79 74 65 73 29 20 29 20 72 65 74 75 72 6e 20  bytes) ) return 
1a380 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 63  TCL_ERROR;..  rc
1a390 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1a3a0 72 65 31 36 5f 76 32 28 64 62 2c 20 7a 53 71 6c  re16_v2(db, zSql
1a3b0 2c 20 62 79 74 65 73 2c 20 26 70 53 74 6d 74 2c  , bytes, &pStmt,
1a3c0 20 6f 62 6a 63 3e 3d 35 20 3f 20 26 7a 54 61 69   objc>=5 ? &zTai
1a3d0 6c 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 73 71  l : 0);.  if( sq
1a3e0 6c 69 74 65 33 54 65 73 74 45 72 72 43 6f 64 65  lite3TestErrCode
1a3f0 28 69 6e 74 65 72 70 2c 20 64 62 2c 20 72 63 29  (interp, db, rc)
1a400 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1a410 52 4f 52 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  ROR;.  if( rc ){
1a420 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
1a430 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66  ERROR;.  }..  if
1a440 28 20 6f 62 6a 63 3e 3d 35 20 29 7b 0a 20 20 20  ( objc>=5 ){.   
1a450 20 69 66 28 20 7a 54 61 69 6c 20 29 7b 0a 20 20   if( zTail ){.  
1a460 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 6f 62 6a      objlen = obj
1a470 6c 65 6e 20 2d 20 28 69 6e 74 29 28 28 75 38 20  len - (int)((u8 
1a480 2a 29 7a 54 61 69 6c 2d 28 75 38 20 2a 29 7a 53  *)zTail-(u8 *)zS
1a490 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ql);.    }else{.
1a4a0 20 20 20 20 20 20 6f 62 6a 6c 65 6e 20 3d 20 30        objlen = 0
1a4b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 54 61 69  ;.    }.    pTai
1a4c0 6c 20 3d 20 54 63 6c 5f 4e 65 77 42 79 74 65 41  l = Tcl_NewByteA
1a4d0 72 72 61 79 4f 62 6a 28 28 75 38 20 2a 29 7a 54  rrayObj((u8 *)zT
1a4e0 61 69 6c 2c 20 6f 62 6a 6c 65 6e 29 3b 0a 20 20  ail, objlen);.  
1a4f0 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75    Tcl_IncrRefCou
1a500 6e 74 28 70 54 61 69 6c 29 3b 0a 20 20 20 20 54  nt(pTail);.    T
1a510 63 6c 5f 4f 62 6a 53 65 74 56 61 72 32 28 69 6e  cl_ObjSetVar2(in
1a520 74 65 72 70 2c 20 6f 62 6a 76 5b 34 5d 2c 20 30  terp, objv[4], 0
1a530 2c 20 70 54 61 69 6c 2c 20 30 29 3b 0a 20 20 20  , pTail, 0);.   
1a540 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e   Tcl_DecrRefCoun
1a550 74 28 70 54 61 69 6c 29 3b 0a 20 20 7d 0a 0a 20  t(pTail);.  }.. 
1a560 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20   if( pStmt ){.  
1a570 20 20 69 66 28 20 73 71 6c 69 74 65 33 54 65 73    if( sqlite3Tes
1a580 74 4d 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28  tMakePointerStr(
1a590 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 70 53  interp, zBuf, pS
1a5a0 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43  tmt) ) return TC
1a5b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54  L_ERROR;.  }.  T
1a5c0 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1a5d0 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1a5e0 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1a5f0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1a600 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1a610 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1a620 3a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 20 66  : sqlite3_open f
1a630 69 6c 65 6e 61 6d 65 20 3f 6f 70 74 69 6f 6e 73  ilename ?options
1a640 2d 6c 69 73 74 3f 0a 2a 2f 0a 73 74 61 74 69 63  -list?.*/.static
1a650 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 28 0a   int test_open(.
1a660 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1a670 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1a680 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1a690 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1a6a0 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1a6b0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1a6c0 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c  zFilename;.  sql
1a6d0 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 68 61 72  ite3 *db;.  char
1a6e0 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69   zBuf[100];..  i
1a6f0 66 28 20 6f 62 6a 63 21 3d 33 20 26 26 20 6f 62  f( objc!=3 && ob
1a700 6a 63 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 31  jc!=2 && objc!=1
1a710 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1a720 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1a730 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1a740 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1a750 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1a760 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1a770 20 66 69 6c 65 6e 61 6d 65 20 6f 70 74 69 6f 6e   filename option
1a780 73 2d 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20 20  s-list", 0);.   
1a790 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1a7a0 52 3b 0a 20 20 7d 0a 0a 20 20 7a 46 69 6c 65 6e  R;.  }..  zFilen
1a7b0 61 6d 65 20 3d 20 6f 62 6a 63 3e 31 20 3f 20 54  ame = objc>1 ? T
1a7c0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1a7d0 76 5b 31 5d 29 20 3a 20 30 3b 0a 20 20 73 71 6c  v[1]) : 0;.  sql
1a7e0 69 74 65 33 5f 6f 70 65 6e 28 7a 46 69 6c 65 6e  ite3_open(zFilen
1a7f0 61 6d 65 2c 20 26 64 62 29 3b 0a 20 20 0a 20 20  ame, &db);.  .  
1a800 69 66 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d  if( sqlite3TestM
1a810 61 6b 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e  akePointerStr(in
1a820 74 65 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20  terp, zBuf, db) 
1a830 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1a840 4f 52 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  OR;.  Tcl_Append
1a850 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
1a860 42 75 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72  Buf, 0);.  retur
1a870 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1a880 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1a890 33 5f 6f 70 65 6e 5f 76 32 20 46 49 4c 45 4e 41  3_open_v2 FILENA
1a8a0 4d 45 20 46 4c 41 47 53 20 56 46 53 0a 2a 2f 0a  ME FLAGS VFS.*/.
1a8b0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1a8c0 6f 70 65 6e 5f 76 32 28 0a 20 20 76 6f 69 64 20  open_v2(.  void 
1a8d0 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  * clientData,.  
1a8e0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
1a8f0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
1a900 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
1a910 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 63 6f 6e   objv[].){.  con
1a920 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1a930 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  me;.  const char
1a940 20 2a 7a 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c   *zVfs;.  int fl
1a950 61 67 73 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ags = 0;.  sqlit
1a960 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1a970 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
1a980 30 5d 3b 0a 0a 20 20 69 6e 74 20 6e 46 6c 61 67  0];..  int nFlag
1a990 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 61 70  ;.  Tcl_Obj **ap
1a9a0 46 6c 61 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a  Flag;.  int i;..
1a9b0 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b    if( objc!=4 ){
1a9c0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
1a9d0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
1a9e0 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45   objv, "FILENAME
1a9f0 20 46 4c 41 47 53 20 56 46 53 22 29 3b 0a 20 20   FLAGS VFS");.  
1aa00 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
1aa10 4f 52 3b 0a 20 20 7d 0a 20 20 7a 46 69 6c 65 6e  OR;.  }.  zFilen
1aa20 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
1aa30 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20  ing(objv[1]);.  
1aa40 7a 56 66 73 20 3d 20 54 63 6c 5f 47 65 74 53 74  zVfs = Tcl_GetSt
1aa50 72 69 6e 67 28 6f 62 6a 76 5b 33 5d 29 3b 0a 20  ring(objv[3]);. 
1aa60 20 69 66 28 20 7a 56 66 73 5b 30 5d 3d 3d 30 78   if( zVfs[0]==0x
1aa70 30 30 20 29 20 7a 56 66 73 20 3d 20 30 3b 0a 0a  00 ) zVfs = 0;..
1aa80 20 20 72 63 20 3d 20 54 63 6c 5f 4c 69 73 74 4f    rc = Tcl_ListO
1aa90 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e  bjGetElements(in
1aaa0 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1aab0 6e 46 6c 61 67 2c 20 26 61 70 46 6c 61 67 29 3b  nFlag, &apFlag);
1aac0 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
1aad0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1aae0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 46 6c 61   for(i=0; i<nFla
1aaf0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  g; i++){.    int
1ab00 20 69 46 6c 61 67 3b 0a 20 20 20 20 73 74 72 75   iFlag;.    stru
1ab10 63 74 20 4f 70 65 6e 46 6c 61 67 20 7b 0a 20 20  ct OpenFlag {.  
1ab20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1ab30 7a 46 6c 61 67 3b 0a 20 20 20 20 20 20 69 6e 74  zFlag;.      int
1ab40 20 66 6c 61 67 3b 0a 20 20 20 20 7d 20 61 46 6c   flag;.    } aFl
1ab50 61 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b  ag[] = {.      {
1ab60 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   "SQLITE_OPEN_RE
1ab70 41 44 4f 4e 4c 59 22 2c 20 53 51 4c 49 54 45 5f  ADONLY", SQLITE_
1ab80 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d 2c  OPEN_READONLY },
1ab90 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1aba0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 22  _OPEN_READWRITE"
1abb0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  , SQLITE_OPEN_RE
1abc0 41 44 57 52 49 54 45 20 7d 2c 0a 20 20 20 20 20  ADWRITE },.     
1abd0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1abe0 43 52 45 41 54 45 22 2c 20 53 51 4c 49 54 45 5f  CREATE", SQLITE_
1abf0 4f 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20  OPEN_CREATE },. 
1ac00 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1ac10 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
1ac20 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1ac30 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7d 2c  DELETEONCLOSE },
1ac40 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1ac50 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 22  _OPEN_EXCLUSIVE"
1ac60 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58  , SQLITE_OPEN_EX
1ac70 43 4c 55 53 49 56 45 20 7d 2c 0a 20 20 20 20 20  CLUSIVE },.     
1ac80 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1ac90 41 55 54 4f 50 52 4f 58 59 22 2c 20 53 51 4c 49  AUTOPROXY", SQLI
1aca0 54 45 5f 4f 50 45 4e 5f 41 55 54 4f 50 52 4f 58  TE_OPEN_AUTOPROX
1acb0 59 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 53 51  Y },.      { "SQ
1acc0 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
1acd0 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  B", SQLITE_OPEN_
1ace0 4d 41 49 4e 5f 44 42 20 7d 2c 0a 20 20 20 20 20  MAIN_DB },.     
1acf0 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   { "SQLITE_OPEN_
1ad00 54 45 4d 50 5f 44 42 22 2c 20 53 51 4c 49 54 45  TEMP_DB", SQLITE
1ad10 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7d 2c  _OPEN_TEMP_DB },
1ad20 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1ad30 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
1ad40 44 42 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  DB", SQLITE_OPEN
1ad50 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7d 2c  _TRANSIENT_DB },
1ad60 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1ad70 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
1ad80 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1ad90 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  _MAIN_JOURNAL },
1ada0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1adb0 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
1adc0 41 4c 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  AL", SQLITE_OPEN
1add0 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  _TEMP_JOURNAL },
1ade0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1adf0 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
1ae00 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53  ", SQLITE_OPEN_S
1ae10 55 42 4a 4f 55 52 4e 41 4c 20 7d 2c 0a 20 20 20  UBJOURNAL },.   
1ae20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1ae30 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
1ae40 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
1ae50 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7d 2c  ASTER_JOURNAL },
1ae60 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1ae70 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 22 2c 20  _OPEN_NOMUTEX", 
1ae80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
1ae90 54 45 58 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  TEX },.      { "
1aea0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
1aeb0 4d 55 54 45 58 22 2c 20 53 51 4c 49 54 45 5f 4f  MUTEX", SQLITE_O
1aec0 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7d 2c  PEN_FULLMUTEX },
1aed0 0a 20 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45  .      { "SQLITE
1aee0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
1aef0 45 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E", SQLITE_OPEN_
1af00 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
1af10 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1af20 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
1af30 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
1af40 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
1af50 20 20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f       { "SQLITE_O
1af60 50 45 4e 5f 57 41 4c 22 2c 20 53 51 4c 49 54 45  PEN_WAL", SQLITE
1af70 5f 4f 50 45 4e 5f 57 41 4c 20 7d 2c 0a 20 20 20  _OPEN_WAL },.   
1af80 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 4f 50 45     { "SQLITE_OPE
1af90 4e 5f 55 52 49 22 2c 20 53 51 4c 49 54 45 5f 4f  N_URI", SQLITE_O
1afa0 50 45 4e 5f 55 52 49 20 7d 2c 0a 20 20 20 20 20  PEN_URI },.     
1afb0 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 7d 3b   { 0, 0 }.    };
1afc0 0a 20 20 20 20 72 63 20 3d 20 54 63 6c 5f 47 65  .    rc = Tcl_Ge
1afd0 74 49 6e 64 65 78 46 72 6f 6d 4f 62 6a 53 74 72  tIndexFromObjStr
1afe0 75 63 74 28 69 6e 74 65 72 70 2c 20 61 70 46 6c  uct(interp, apFl
1aff0 61 67 5b 69 5d 2c 20 61 46 6c 61 67 2c 20 73 69  ag[i], aFlag, si
1b000 7a 65 6f 66 28 61 46 6c 61 67 5b 30 5d 29 2c 20  zeof(aFlag[0]), 
1b010 0a 20 20 20 20 20 20 20 20 22 66 6c 61 67 22 2c  .        "flag",
1b020 20 30 2c 20 26 69 46 6c 61 67 0a 20 20 20 20 29   0, &iFlag.    )
1b030 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 54 43  ;.    if( rc!=TC
1b040 4c 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  L_OK ) return rc
1b050 3b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 61  ;.    flags |= a
1b060 46 6c 61 67 5b 69 46 6c 61 67 5d 2e 66 6c 61 67  Flag[iFlag].flag
1b070 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  ;.  }..  rc = sq
1b080 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 46  lite3_open_v2(zF
1b090 69 6c 65 6e 61 6d 65 2c 20 26 64 62 2c 20 66 6c  ilename, &db, fl
1b0a0 61 67 73 2c 20 7a 56 66 73 29 3b 0a 20 20 69 66  ags, zVfs);.  if
1b0b0 28 20 73 71 6c 69 74 65 33 54 65 73 74 4d 61 6b  ( sqlite3TestMak
1b0c0 65 50 6f 69 6e 74 65 72 53 74 72 28 69 6e 74 65  ePointerStr(inte
1b0d0 72 70 2c 20 7a 42 75 66 2c 20 64 62 29 20 29 20  rp, zBuf, db) ) 
1b0e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b0f0 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
1b100 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 42 75  sult(interp, zBu
1b110 66 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  f, 0);.  return 
1b120 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1b130 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1b140 6f 70 65 6e 31 36 20 66 69 6c 65 6e 61 6d 65 20  open16 filename 
1b150 6f 70 74 69 6f 6e 73 0a 2a 2f 0a 73 74 61 74 69  options.*/.stati
1b160 63 20 69 6e 74 20 74 65 73 74 5f 6f 70 65 6e 31  c int test_open1
1b170 36 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  6(.  void * clie
1b180 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1b190 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1b1a0 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1b1b0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1b1c0 5d 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ].){.#ifndef SQL
1b1d0 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20  ITE_OMIT_UTF16. 
1b1e0 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
1b1f0 6c 65 6e 61 6d 65 3b 0a 20 20 73 71 6c 69 74 65  lename;.  sqlite
1b200 33 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 7a 42  3 *db;.  char zB
1b210 75 66 5b 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20  uf[100];..  if( 
1b220 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1b230 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b240 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1b250 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1b260 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1b270 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1b280 5b 30 5d 29 2c 20 22 20 66 69 6c 65 6e 61 6d 65  [0]), " filename
1b290 20 6f 70 74 69 6f 6e 73 2d 6c 69 73 74 22 2c 20   options-list", 
1b2a0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
1b2b0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20  CL_ERROR;.  }.. 
1b2c0 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c   zFilename = Tcl
1b2d0 5f 47 65 74 42 79 74 65 41 72 72 61 79 46 72 6f  _GetByteArrayFro
1b2e0 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 30 29  mObj(objv[1], 0)
1b2f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  ;.  sqlite3_open
1b300 31 36 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 64  16(zFilename, &d
1b310 62 29 3b 0a 20 20 0a 20 20 69 66 28 20 73 71 6c  b);.  .  if( sql
1b320 69 74 65 33 54 65 73 74 4d 61 6b 65 50 6f 69 6e  ite3TestMakePoin
1b330 74 65 72 53 74 72 28 69 6e 74 65 72 70 2c 20 7a  terStr(interp, z
1b340 42 75 66 2c 20 64 62 29 20 29 20 72 65 74 75 72  Buf, db) ) retur
1b350 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54  n TCL_ERROR;.  T
1b360 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1b370 69 6e 74 65 72 70 2c 20 7a 42 75 66 2c 20 30 29  interp, zBuf, 0)
1b380 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ;.#endif /* SQLI
1b390 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
1b3a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1b3b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1b3c0 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  : sqlite3_comple
1b3d0 74 65 31 36 20 3c 55 54 46 2d 31 36 20 73 74 72  te16 <UTF-16 str
1b3e0 69 6e 67 3e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ing>.**.** Retur
1b3f0 6e 20 31 20 69 66 20 74 68 65 20 73 75 70 70 6c  n 1 if the suppl
1b400 69 65 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ied argument is 
1b410 61 20 63 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73  a complete SQL s
1b420 74 61 74 65 6d 65 6e 74 2c 20 6f 72 20 7a 65 72  tatement, or zer
1b430 6f 0a 2a 2a 20 6f 74 68 65 72 77 69 73 65 2e 0a  o.** otherwise..
1b440 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1b450 73 74 5f 63 6f 6d 70 6c 65 74 65 31 36 28 0a 20  st_complete16(. 
1b460 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b470 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b480 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b490 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b4a0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b4b0 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
1b4c0 4c 49 54 45 5f 4f 4d 49 54 5f 43 4f 4d 50 4c 45  LITE_OMIT_COMPLE
1b4d0 54 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  TE) && !defined(
1b4e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
1b4f0 36 29 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 3b  6).  char *zBuf;
1b500 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ..  if( objc!=2 
1b510 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1b520 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1b530 31 2c 20 6f 62 6a 76 2c 20 22 3c 75 74 66 2d 31  1, objv, "<utf-1
1b540 36 20 73 71 6c 3e 22 29 3b 0a 20 20 20 20 72 65  6 sql>");.    re
1b550 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1b560 20 20 7d 0a 0a 20 20 7a 42 75 66 20 3d 20 28 63    }..  zBuf = (c
1b570 68 61 72 2a 29 54 63 6c 5f 47 65 74 42 79 74 65  har*)Tcl_GetByte
1b580 41 72 72 61 79 46 72 6f 6d 4f 62 6a 28 6f 62 6a  ArrayFromObj(obj
1b590 76 5b 31 5d 2c 20 30 29 3b 0a 20 20 54 63 6c 5f  v[1], 0);.  Tcl_
1b5a0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1b5b0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1b5c0 62 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c  bj(sqlite3_compl
1b5d0 65 74 65 31 36 28 7a 42 75 66 29 29 29 3b 0a 23  ete16(zBuf)));.#
1b5e0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1b5f0 4f 4d 49 54 5f 43 4f 4d 50 4c 45 54 45 20 26 26  OMIT_COMPLETE &&
1b600 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
1b610 31 36 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 54  16 */.  return T
1b620 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1b630 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 73  Usage: sqlite3_s
1b640 74 65 70 20 53 54 4d 54 0a 2a 2a 0a 2a 2a 20 41  tep STMT.**.** A
1b650 64 76 61 6e 63 65 20 74 68 65 20 73 74 61 74 65  dvance the state
1b660 6d 65 6e 74 20 74 6f 20 74 68 65 20 6e 65 78 74  ment to the next
1b670 20 72 6f 77 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   row..*/.static 
1b680 69 6e 74 20 74 65 73 74 5f 73 74 65 70 28 0a 20  int test_step(. 
1b690 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61   void * clientDa
1b6a0 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70  ta,.  Tcl_Interp
1b6b0 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1b6c0 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1b6d0 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1b6e0 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1b6f0 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 63  *pStmt;.  int rc
1b700 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
1b710 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1b720 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1b730 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1b740 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1b750 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1b760 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1b770 20 53 54 4d 54 22 2c 20 30 29 3b 0a 20 20 20 20   STMT", 0);.    
1b780 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1b790 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1b7a0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1b7b0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1b7c0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1b7d0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1b7e0 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73  _ERROR;.  rc = s
1b7f0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1b800 74 29 3b 0a 0a 20 20 2f 2a 20 69 66 28 20 72 63  t);..  /* if( rc
1b810 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 26 26  !=SQLITE_DONE &&
1b820 20 72 63 21 3d 53 51 4c 49 54 45 5f 52 4f 57 20   rc!=SQLITE_ROW 
1b830 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1b840 4f 52 3b 20 2a 2f 0a 20 20 54 63 6c 5f 53 65 74  OR; */.  Tcl_Set
1b850 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28  Result(interp, (
1b860 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61  char *)t1ErrorNa
1b870 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72 65  me(rc), 0);.  re
1b880 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1b890 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1b8a0 73 71 6c 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c  sql(.  void * cl
1b8b0 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
1b8c0 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
1b8d0 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63    int objc,.  Tc
1b8e0 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
1b8f0 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  v[].){.  sqlite3
1b900 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
1b910 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
1b920 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1b930 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1b940 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
1b950 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1b960 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1b970 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1b980 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1b990 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1b9a0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1b9b0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 54 63 6c  TCL_ERROR;.  Tcl
1b9c0 5f 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  _SetResult(inter
1b9d0 70 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74  p, (char *)sqlit
1b9e0 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 2c 20 54  e3_sql(pStmt), T
1b9f0 43 4c 5f 56 4f 4c 41 54 49 4c 45 29 3b 0a 20 20  CL_VOLATILE);.  
1ba00 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1ba10 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1ba20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
1ba30 75 6e 74 20 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20  unt STMT .**.** 
1ba40 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
1ba50 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 72 65 74  r of columns ret
1ba60 75 72 6e 65 64 20 62 79 20 74 68 65 20 73 71 6c  urned by the sql
1ba70 20 73 74 61 74 65 6d 65 6e 74 20 53 54 4d 54 2e   statement STMT.
1ba80 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1ba90 65 73 74 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74  est_column_count
1baa0 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e  (.  void * clien
1bab0 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74  tData,.  Tcl_Int
1bac0 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69  erp *interp,.  i
1bad0 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f  nt objc,.  Tcl_O
1bae0 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
1baf0 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
1bb00 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20 20 69 66  mt *pStmt;..  if
1bb10 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20  ( objc!=2 ){.   
1bb20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1bb30 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1bb40 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1bb50 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1bb60 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1bb70 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1bb80 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1bb90 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1bba0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1bbb0 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1bbc0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1bbd0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1bbe0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1bbf0 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53  _ERROR;..  Tcl_S
1bc00 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1bc10 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1bc20 6a 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  j(sqlite3_column
1bc30 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 29 29 3b  _count(pStmt)));
1bc40 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1bc50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65  ;.}../*.** Usage
1bc60 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1bc70 5f 74 79 70 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _type STMT colum
1bc80 6e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  n.**.** Return t
1bc90 68 65 20 74 79 70 65 20 6f 66 20 74 68 65 20 64  he type of the d
1bca0 61 74 61 20 69 6e 20 63 6f 6c 75 6d 6e 20 27 63  ata in column 'c
1bcb0 6f 6c 75 6d 6e 27 20 6f 66 20 74 68 65 20 63 75  olumn' of the cu
1bcc0 72 72 65 6e 74 20 72 6f 77 2e 0a 2a 2f 0a 73 74  rrent row..*/.st
1bcd0 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f  atic int test_co
1bce0 6c 75 6d 6e 5f 74 79 70 65 28 0a 20 20 76 6f 69  lumn_type(.  voi
1bcf0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1bd00 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1bd10 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1bd20 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1bd30 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1bd40 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1bd50 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1bd60 20 69 6e 74 20 74 70 3b 0a 0a 20 20 69 66 28 20   int tp;..  if( 
1bd70 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54  objc!=3 ){.    T
1bd80 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28  cl_AppendResult(
1bd90 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23  interp, "wrong #
1bda0 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65   args: should be
1bdb0 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63   \"", .       Tc
1bdc0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1bdd0 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c  [0]), " STMT col
1bde0 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  umn", 0);.    re
1bdf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
1be00 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74    }..  if( getSt
1be10 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  mtPointer(interp
1be20 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1be30 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74  objv[1]), &pStmt
1be40 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1be50 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f  RROR;.  if( Tcl_
1be60 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
1be70 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
1be80 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43  col) ) return TC
1be90 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 74 70 20 3d  L_ERROR;..  tp =
1bea0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1beb0 74 79 70 65 28 70 53 74 6d 74 2c 20 63 6f 6c 29  type(pStmt, col)
1bec0 3b 0a 20 20 73 77 69 74 63 68 28 20 74 70 20 29  ;.  switch( tp )
1bed0 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
1bee0 45 5f 49 4e 54 45 47 45 52 3a 20 0a 20 20 20 20  E_INTEGER: .    
1bef0 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28    Tcl_SetResult(
1bf00 69 6e 74 65 72 70 2c 20 22 49 4e 54 45 47 45 52  interp, "INTEGER
1bf10 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b 20  ", TCL_STATIC); 
1bf20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bf30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 55    case SQLITE_NU
1bf40 4c 4c 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53 65  LL:.      Tcl_Se
1bf50 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1bf60 22 4e 55 4c 4c 22 2c 20 54 43 4c 5f 53 54 41 54  "NULL", TCL_STAT
1bf70 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65 61  IC); .      brea
1bf80 6b 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  k;.    case SQLI
1bf90 54 45 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20  TE_FLOAT:.      
1bfa0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1bfb0 74 65 72 70 2c 20 22 46 4c 4f 41 54 22 2c 20 54  terp, "FLOAT", T
1bfc0 43 4c 5f 53 54 41 54 49 43 29 3b 20 0a 20 20 20  CL_STATIC); .   
1bfd0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1bfe0 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a 0a  se SQLITE_TEXT:.
1bff0 20 20 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73        Tcl_SetRes
1c000 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 54 45 58  ult(interp, "TEX
1c010 54 22 2c 20 54 43 4c 5f 53 54 41 54 49 43 29 3b  T", TCL_STATIC);
1c020 20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20   .      break;. 
1c030 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42     case SQLITE_B
1c040 4c 4f 42 3a 0a 20 20 20 20 20 20 54 63 6c 5f 53  LOB:.      Tcl_S
1c050 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  etResult(interp,
1c060 20 22 42 4c 4f 42 22 2c 20 54 43 4c 5f 53 54 41   "BLOB", TCL_STA
1c070 54 49 43 29 3b 20 0a 20 20 20 20 20 20 62 72 65  TIC); .      bre
1c080 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
1c090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30 29  .      assert(0)
1c0a0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
1c0b0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1c0c0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1c0d0 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 20 53 54 4d  column_int64 STM
1c0e0 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52  T column.**.** R
1c0f0 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69  eturn the data i
1c100 6e 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e  n column 'column
1c110 27 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  ' of the current
1c120 20 72 6f 77 20 63 61 73 74 20 61 73 20 61 6e 0a   row cast as an.
1c130 2a 2a 20 77 69 64 65 20 28 36 34 2d 62 69 74 29  ** wide (64-bit)
1c140 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74 61   integer..*/.sta
1c150 74 69 63 20 69 6e 74 20 74 65 73 74 5f 63 6f 6c  tic int test_col
1c160 75 6d 6e 5f 69 6e 74 36 34 28 0a 20 20 76 6f 69  umn_int64(.  voi
1c170 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1c180 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1c190 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1c1a0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1c1b0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
1c1c0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
1c1d0 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20  mt;.  int col;. 
1c1e0 20 69 36 34 20 69 56 61 6c 3b 0a 0a 20 20 69 66   i64 iVal;..  if
1c1f0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1c200 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c210 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1c220 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c230 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1c240 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c250 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1c260 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1c270 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c280 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1c290 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1c2a0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1c2b0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1c2c0 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1c2d0 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1c2e0 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1c2f0 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1c300 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1c310 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 69 56  TCL_ERROR;..  iV
1c320 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
1c330 75 6d 6e 5f 69 6e 74 36 34 28 70 53 74 6d 74 2c  umn_int64(pStmt,
1c340 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65 74   col);.  Tcl_Set
1c350 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1c360 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e 74  , Tcl_NewWideInt
1c370 4f 62 6a 28 69 56 61 6c 29 29 3b 0a 20 20 72 65  Obj(iVal));.  re
1c380 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c390 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c3a0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62  ite3_column_blob
1c3b0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a   STMT column.*/.
1c3c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1c3d0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 0a 20 20 76  column_blob(.  v
1c3e0 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1c3f0 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1c400 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1c410 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1c420 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1c430 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c440 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1c450 0a 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 63  ..  int len;.  c
1c460 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
1c470 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33  ;..  if( objc!=3
1c480 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1c490 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1c4a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1c4b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 0a  should be \"", .
1c4c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
1c4d0 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29 2c 20 22  ring(objv[0]), "
1c4e0 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22 2c 20 30   STMT column", 0
1c4f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1c500 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20  L_ERROR;.  }..  
1c510 69 66 28 20 67 65 74 53 74 6d 74 50 6f 69 6e 74  if( getStmtPoint
1c520 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
1c530 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
1c540 29 2c 20 26 70 53 74 6d 74 29 20 29 20 72 65 74  ), &pStmt) ) ret
1c550 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1c560 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46   if( Tcl_GetIntF
1c570 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f  romObj(interp, o
1c580 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29 20 29 20  bjv[2], &col) ) 
1c590 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c5a0 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 71 6c 69 74  ;..  len = sqlit
1c5b0 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
1c5c0 70 53 74 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 70  pStmt, col);.  p
1c5d0 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
1c5e0 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
1c5f0 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
1c600 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1c610 70 2c 20 54 63 6c 5f 4e 65 77 42 79 74 65 41 72  p, Tcl_NewByteAr
1c620 72 61 79 4f 62 6a 28 70 42 6c 6f 62 2c 20 6c 65  rayObj(pBlob, le
1c630 6e 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  n));.  return TC
1c640 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  L_OK;.}../*.** U
1c650 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1c660 6c 75 6d 6e 5f 64 6f 75 62 6c 65 20 53 54 4d 54  lumn_double STMT
1c670 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 52 65   column.**.** Re
1c680 74 75 72 6e 20 74 68 65 20 64 61 74 61 20 69 6e  turn the data in
1c690 20 63 6f 6c 75 6d 6e 20 27 63 6f 6c 75 6d 6e 27   column 'column'
1c6a0 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
1c6b0 72 6f 77 20 63 61 73 74 20 61 73 20 61 20 64 6f  row cast as a do
1c6c0 75 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  uble..*/.static 
1c6d0 69 6e 74 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f  int test_column_
1c6e0 64 6f 75 62 6c 65 28 0a 20 20 76 6f 69 64 20 2a  double(.  void *
1c6f0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1c700 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1c710 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1c720 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1c730 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69  objv[].){.  sqli
1c740 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
1c750 0a 20 20 69 6e 74 20 63 6f 6c 3b 0a 20 20 64 6f  .  int col;.  do
1c760 75 62 6c 65 20 72 56 61 6c 3b 0a 0a 20 20 69 66  uble rVal;..  if
1c770 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
1c780 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1c790 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67  t(interp, "wrong
1c7a0 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20   # args: should 
1c7b0 62 65 20 5c 22 22 2c 20 0a 20 20 20 20 20 20 20  be \"", .       
1c7c0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
1c7d0 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d 54 20 63  jv[0]), " STMT c
1c7e0 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20  olumn", 0);.    
1c7f0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1c800 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74  ;.  }..  if( get
1c810 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e 74 65  StmtPointer(inte
1c820 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
1c830 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74  g(objv[1]), &pSt
1c840 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  mt) ) return TCL
1c850 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 54 63  _ERROR;.  if( Tc
1c860 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28  l_GetIntFromObj(
1c870 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c  interp, objv[2],
1c880 20 26 63 6f 6c 29 20 29 20 72 65 74 75 72 6e 20   &col) ) return 
1c890 54 43 4c 5f 45 52 52 4f 52 3b 0a 0a 20 20 72 56  TCL_ERROR;..  rV
1c8a0 61 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  al = sqlite3_col
1c8b0 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 53 74 6d 74  umn_double(pStmt
1c8c0 2c 20 63 6f 6c 29 3b 0a 20 20 54 63 6c 5f 53 65  , col);.  Tcl_Se
1c8d0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1c8e0 70 2c 20 54 63 6c 5f 4e 65 77 44 6f 75 62 6c 65  p, Tcl_NewDouble
1c8f0 4f 62 6a 28 72 56 61 6c 29 29 3b 0a 20 20 72 65  Obj(rVal));.  re
1c900 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a  turn TCL_OK;.}..
1c910 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c  /*.** Usage: sql
1c920 69 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 20  ite3_data_count 
1c930 53 54 4d 54 20 0a 2a 2a 0a 2a 2a 20 52 65 74 75  STMT .**.** Retu
1c940 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1c950 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75 72 6e 65   columns returne
1c960 64 20 62 79 20 74 68 65 20 73 71 6c 20 73 74 61  d by the sql sta
1c970 74 65 6d 65 6e 74 20 53 54 4d 54 2e 0a 2a 2f 0a  tement STMT..*/.
1c980 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1c990 64 61 74 61 5f 63 6f 75 6e 74 28 0a 20 20 76 6f  data_count(.  vo
1c9a0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1c9b0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1c9c0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1c9d0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1c9e0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1c9f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1ca00 74 6d 74 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  tmt;..  if( objc
1ca10 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1ca20 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1ca30 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1ca40 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1ca50 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1ca60 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1ca70 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1ca80 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1ca90 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1caa0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1cab0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1cac0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1cad0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1cae0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1caf0 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  ;..  Tcl_SetObjR
1cb00 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
1cb10 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 73 71 6c 69  l_NewIntObj(sqli
1cb20 74 65 33 5f 64 61 74 61 5f 63 6f 75 6e 74 28 70  te3_data_count(p
1cb30 53 74 6d 74 29 29 29 3b 0a 20 20 72 65 74 75 72  Stmt)));.  retur
1cb40 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1cb50 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1cb60 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 53 54  3_column_text ST
1cb70 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20  MT column.**.** 
1cb80 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63  Usage: sqlite3_c
1cb90 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79 70 65 20 53  olumn_decltype S
1cba0 54 4d 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a  TMT column.**.**
1cbb0 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f   Usage: sqlite3_
1cbc0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 53 54 4d 54  column_name STMT
1cbd0 20 63 6f 6c 75 6d 6e 0a 2a 2f 0a 73 74 61 74 69   column.*/.stati
1cbe0 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d 74 5f  c int test_stmt_
1cbf0 75 74 66 38 28 0a 20 20 76 6f 69 64 20 2a 20 63  utf8(.  void * c
1cc00 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 20  lientData,      
1cc10 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
1cc20 53 51 4c 69 74 65 20 41 50 49 20 66 75 6e 63 74  SQLite API funct
1cc30 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ion to be invoke
1cc40 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
1cc50 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20   *interp,.  int 
1cc60 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20  objc,.  Tcl_Obj 
1cc70 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b  *CONST objv[].){
1cc80 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1cc90 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f  *pStmt;.  int co
1cca0 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
1ccb0 2a 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65  *(*xFunc)(sqlite
1ccc0 33 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 3b 0a 20  3_stmt*, int);. 
1ccd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 52 65   const char *zRe
1cce0 74 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20 28 63  t;..  xFunc = (c
1ccf0 6f 6e 73 74 20 63 68 61 72 20 2a 28 2a 29 28 73  onst char *(*)(s
1cd00 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69 6e  qlite3_stmt*, in
1cd10 74 29 29 63 6c 69 65 6e 74 44 61 74 61 3b 0a 20  t))clientData;. 
1cd20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1cd30 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1cd40 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1cd50 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1cd60 6c 64 20 62 65 20 5c 22 22 2c 20 0a 20 20 20 20  ld be \"", .    
1cd70 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
1cd80 28 6f 62 6a 76 5b 30 5d 29 2c 20 22 20 53 54 4d  (objv[0]), " STM
1cd90 54 20 63 6f 6c 75 6d 6e 22 2c 20 30 29 3b 0a 20  T column", 0);. 
1cda0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1cdb0 52 4f 52 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ROR;.  }..  if( 
1cdc0 67 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69  getStmtPointer(i
1cdd0 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74  nterp, Tcl_GetSt
1cde0 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26  ring(objv[1]), &
1cdf0 70 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20  pStmt) ) return 
1ce00 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  TCL_ERROR;.  if(
1ce10 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f   Tcl_GetIntFromO
1ce20 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
1ce30 32 5d 2c 20 26 63 6f 6c 29 20 29 20 72 65 74 75  2], &col) ) retu
1ce40 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ce50 7a 52 65 74 20 3d 20 78 46 75 6e 63 28 70 53 74  zRet = xFunc(pSt
1ce60 6d 74 2c 20 63 6f 6c 29 3b 0a 20 20 69 66 28 20  mt, col);.  if( 
1ce70 7a 52 65 74 20 29 7b 0a 20 20 20 20 54 63 6c 5f  zRet ){.    Tcl_
1ce80 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
1ce90 2c 20 28 63 68 61 72 20 2a 29 7a 52 65 74 2c 20  , (char *)zRet, 
1cea0 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
1ceb0 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74   TCL_OK;.}..stat
1cec0 69 63 20 69 6e 74 20 74 65 73 74 5f 67 6c 6f 62  ic int test_glob
1ced0 61 6c 5f 72 65 63 6f 76 65 72 28 0a 20 20 76 6f  al_recover(.  vo
1cee0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1cef0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1cf00 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1cf10 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1cf20 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69  NST objv[].){.#i
1cf30 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1cf40 54 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 69  T_DEPRECATED.  i
1cf50 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 6f 62 6a  nt rc;.  if( obj
1cf60 63 21 3d 31 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=1 ){.    Tcl_
1cf70 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
1cf80 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 22  erp, 1, objv, ""
1cf90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1cfa0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
1cfb0 63 20 3d 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62  c = sqlite3_glob
1cfc0 61 6c 5f 72 65 63 6f 76 65 72 28 29 3b 0a 20 20  al_recover();.  
1cfd0 54 63 6c 5f 53 65 74 52 65 73 75 6c 74 28 69 6e  Tcl_SetResult(in
1cfe0 74 65 72 70 2c 20 28 63 68 61 72 20 2a 29 74 31  terp, (char *)t1
1cff0 45 72 72 6f 72 4e 61 6d 65 28 72 63 29 2c 20 54  ErrorName(rc), T
1d000 43 4c 5f 53 54 41 54 49 43 29 3b 0a 23 65 6e 64  CL_STATIC);.#end
1d010 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  if.  return TCL_
1d020 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1d030 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1d040 6d 6e 5f 74 65 78 74 20 53 54 4d 54 20 63 6f 6c  mn_text STMT col
1d050 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65 3a  umn.**.** Usage:
1d060 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1d070 64 65 63 6c 74 79 70 65 20 53 54 4d 54 20 63 6f  decltype STMT co
1d080 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61 67 65  lumn.**.** Usage
1d090 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  : sqlite3_column
1d0a0 5f 6e 61 6d 65 20 53 54 4d 54 20 63 6f 6c 75 6d  _name STMT colum
1d0b0 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n.*/.static int 
1d0c0 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 31 36 28  test_stmt_utf16(
1d0d0 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1d0e0 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 50 6f 69  Data,     /* Poi
1d0f0 6e 74 65 72 20 74 6f 20 53 51 4c 69 74 65 20 41  nter to SQLite A
1d100 50 49 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62  PI function to b
1d110 65 20 69 6e 76 6f 6b 65 64 20 2a 2f 0a 20 20 54  e invoked */.  T
1d120 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1d130 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20  p,.  int objc,. 
1d140 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
1d150 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66 6e 64 65  objv[].){.#ifnde
1d160 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
1d170 46 31 36 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  F16.  sqlite3_st
1d180 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 69 6e 74  mt *pStmt;.  int
1d190 20 63 6f 6c 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20   col;.  Tcl_Obj 
1d1a0 2a 70 52 65 74 3b 0a 20 20 63 6f 6e 73 74 20 76  *pRet;.  const v
1d1b0 6f 69 64 20 2a 7a 4e 61 6d 65 31 36 3b 0a 20 20  oid *zName16;.  
1d1c0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 28 2a 78 46  const void *(*xF
1d1d0 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 73 74 6d  unc)(sqlite3_stm
1d1e0 74 2a 2c 20 69 6e 74 29 3b 0a 0a 20 20 78 46 75  t*, int);..  xFu
1d1f0 6e 63 20 3d 20 28 63 6f 6e 73 74 20 76 6f 69 64  nc = (const void
1d200 20 2a 28 2a 29 28 73 71 6c 69 74 65 33 5f 73 74   *(*)(sqlite3_st
1d210 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69 65 6e 74  mt*, int))client
1d220 44 61 74 61 3b 0a 20 20 69 66 28 20 6f 62 6a 63  Data;.  if( objc
1d230 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=3 ){.    Tcl_A
1d240 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1d250 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1d260 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1d270 2c 20 0a 20 20 20 20 20 20 20 54 63 6c 5f 47 65  , .       Tcl_Ge
1d280 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 30 5d 29  tString(objv[0])
1d290 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75 6d 6e 22  , " STMT column"
1d2a0 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  , 0);.    return
1d2b0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
1d2c0 0a 20 20 69 66 28 20 67 65 74 53 74 6d 74 50 6f  .  if( getStmtPo
1d2d0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1d2e0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1d2f0 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29 20 29 20  [1]), &pStmt) ) 
1d300 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1d310 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
1d320 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
1d330 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63 6f 6c 29  , objv[2], &col)
1d340 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d350 52 4f 52 3b 0a 0a 20 20 7a 4e 61 6d 65 31 36 20  ROR;..  zName16 
1d360 3d 20 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  = xFunc(pStmt, c
1d370 6f 6c 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65  ol);.  if( zName
1d380 31 36 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 3b  16 ){.    int n;
1d390 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
1d3a0 2a 7a 20 3d 20 7a 4e 61 6d 65 31 36 3b 0a 20 20  *z = zName16;.  
1d3b0 20 20 66 6f 72 28 6e 3d 30 3b 20 7a 5b 6e 5d 20    for(n=0; z[n] 
1d3c0 7c 7c 20 7a 5b 6e 2b 31 5d 3b 20 6e 2b 3d 32 29  || z[n+1]; n+=2)
1d3d0 7b 7d 0a 20 20 20 20 70 52 65 74 20 3d 20 54 63  {}.    pRet = Tc
1d3e0 6c 5f 4e 65 77 42 79 74 65 41 72 72 61 79 4f 62  l_NewByteArrayOb
1d3f0 6a 28 7a 4e 61 6d 65 31 36 2c 20 6e 2b 32 29 3b  j(zName16, n+2);
1d400 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
1d410 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
1d420 65 74 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 20  et);.  }.#endif 
1d430 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
1d440 54 46 31 36 20 2a 2f 0a 0a 20 20 72 65 74 75 72  TF16 */..  retur
1d450 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
1d460 2a 2a 20 55 73 61 67 65 3a 20 73 71 6c 69 74 65  ** Usage: sqlite
1d470 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 20 53 54 4d  3_column_int STM
1d480 54 20 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55  T column.**.** U
1d490 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f  sage: sqlite3_co
1d4a0 6c 75 6d 6e 5f 62 79 74 65 73 20 53 54 4d 54 20  lumn_bytes STMT 
1d4b0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2a 20 55 73 61  column.**.** Usa
1d4c0 67 65 3a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ge: sqlite3_colu
1d4d0 6d 6e 5f 62 79 74 65 73 31 36 20 53 54 4d 54 20  mn_bytes16 STMT 
1d4e0 63 6f 6c 75 6d 6e 0a 2a 2a 0a 2a 2f 0a 73 74 61  column.**.*/.sta
1d4f0 74 69 63 20 69 6e 74 20 74 65 73 74 5f 73 74 6d  tic int test_stm
1d500 74 5f 69 6e 74 28 0a 20 20 76 6f 69 64 20 2a 20  t_int(.  void * 
1d510 63 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 2f  clientData,    /
1d520 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 51 4c  * Pointer to SQL
1d530 69 74 65 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  ite API function
1d540 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 2a   to be invoked *
1d550 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
1d560 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62  interp,.  int ob
1d570 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43  jc,.  Tcl_Obj *C
1d580 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20  ONST objv[].){. 
1d590 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1d5a0 53 74 6d 74 3b 0a 20 20 69 6e 74 20 63 6f 6c 3b  Stmt;.  int col;
1d5b0 0a 20 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28  .  int (*xFunc)(
1d5c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 20 69  sqlite3_stmt*, i
1d5d0 6e 74 29 3b 0a 0a 20 20 78 46 75 6e 63 20 3d 20  nt);..  xFunc = 
1d5e0 28 69 6e 74 20 28 2a 29 28 73 71 6c 69 74 65 33  (int (*)(sqlite3
1d5f0 5f 73 74 6d 74 2a 2c 20 69 6e 74 29 29 63 6c 69  _stmt*, int))cli
1d600 65 6e 74 44 61 74 61 3b 0a 20 20 69 66 28 20 6f  entData;.  if( o
1d610 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  bjc!=3 ){.    Tc
1d620 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1d630 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1d640 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1d650 5c 22 22 2c 20 0a 20 20 20 20 20 20 20 54 63 6c  \"", .       Tcl
1d660 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b  _GetString(objv[
1d670 30 5d 29 2c 20 22 20 53 54 4d 54 20 63 6f 6c 75  0]), " STMT colu
1d680 6d 6e 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  mn", 0);.    ret
1d690 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1d6a0 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 53 74 6d   }..  if( getStm
1d6b0 74 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  tPointer(interp,
1d6c0 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1d6d0 62 6a 76 5b 31 5d 29 2c 20 26 70 53 74 6d 74 29  bjv[1]), &pStmt)
1d6e0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1d6f0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
1d700 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74  etIntFromObj(int
1d710 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26 63  erp, objv[2], &c
1d720 6f 6c 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c  ol) ) return TCL
1d730 5f 45 52 52 4f 52 3b 0a 0a 20 20 54 63 6c 5f 53  _ERROR;..  Tcl_S
1d740 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
1d750 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
1d760 6a 28 78 46 75 6e 63 28 70 53 74 6d 74 2c 20 63  j(xFunc(pStmt, c
1d770 6f 6c 29 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  ol)));.  return 
1d780 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
1d790 20 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 5f   Usage:  sqlite_
1d7a0 73 65 74 5f 6d 61 67 69 63 20 20 44 42 20 20 4d  set_magic  DB  M
1d7b0 41 47 49 43 2d 4e 55 4d 42 45 52 0a 2a 2a 0a 2a  AGIC-NUMBER.**.*
1d7c0 2a 20 53 65 74 20 74 68 65 20 64 62 2d 3e 6d 61  * Set the db->ma
1d7d0 67 69 63 20 76 61 6c 75 65 2e 20 20 54 68 69 73  gic value.  This
1d7e0 20 69 73 20 75 73 65 64 20 74 6f 20 74 65 73 74   is used to test
1d7f0 20 65 72 72 6f 72 20 72 65 63 6f 76 65 72 79 20   error recovery 
1d800 6c 6f 67 69 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  logic..*/.static
1d810 20 69 6e 74 20 73 71 6c 69 74 65 5f 73 65 74 5f   int sqlite_set_
1d820 6d 61 67 69 63 28 0a 20 20 76 6f 69 64 20 2a 20  magic(.  void * 
1d830 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1d840 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1d850 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
1d860 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a 20  char **argv.){. 
1d870 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1d880 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1d890 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1d8a0 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1d8b0 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1d8c0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1d8d0 5d 2c 0a 20 20 20 20 20 20 20 20 20 22 20 44 42  ],.         " DB
1d8e0 20 4d 41 47 49 43 22 2c 20 30 29 3b 0a 20 20 20   MAGIC", 0);.   
1d8f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1d900 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1d910 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1d920 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62 29 20  , argv[1], &db) 
1d930 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
1d940 4f 52 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70  OR;.  if( strcmp
1d950 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c 49 54  (argv[2], "SQLIT
1d960 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 22 29 3d 3d  E_MAGIC_OPEN")==
1d970 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67  0 ){.    db->mag
1d980 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
1d990 43 5f 4f 50 45 4e 3b 0a 20 20 7d 65 6c 73 65 20  C_OPEN;.  }else 
1d9a0 69 66 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b  if( strcmp(argv[
1d9b0 32 5d 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49  2], "SQLITE_MAGI
1d9c0 43 5f 43 4c 4f 53 45 44 22 29 3d 3d 30 20 29 7b  C_CLOSED")==0 ){
1d9d0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
1d9e0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
1d9f0 4f 53 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OSED;.  }else if
1da00 28 20 73 74 72 63 6d 70 28 61 72 67 76 5b 32 5d  ( strcmp(argv[2]
1da10 2c 20 22 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f  , "SQLITE_MAGIC_
1da20 42 55 53 59 22 29 3d 3d 30 20 29 7b 0a 20 20 20  BUSY")==0 ){.   
1da30 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
1da40 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
1da50 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
1da60 6d 70 28 61 72 67 76 5b 32 5d 2c 20 22 53 51 4c  mp(argv[2], "SQL
1da70 49 54 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 22  ITE_MAGIC_ERROR"
1da80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  )==0 ){.    db->
1da90 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
1daa0 41 47 49 43 5f 45 52 52 4f 52 3b 0a 20 20 7d 65  AGIC_ERROR;.  }e
1dab0 6c 73 65 20 69 66 28 20 54 63 6c 5f 47 65 74 49  lse if( Tcl_GetI
1dac0 6e 74 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b  nt(interp, argv[
1dad0 32 5d 2c 20 28 69 6e 74 2a 29 26 64 62 2d 3e 6d  2], (int*)&db->m
1dae0 61 67 69 63 29 20 29 7b 0a 20 20 20 20 72 65 74  agic) ){.    ret
1daf0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1db00 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f   }.  return TCL_
1db10 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1db20 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  ge:  sqlite3_int
1db30 65 72 72 75 70 74 20 20 44 42 20 0a 2a 2a 0a 2a  errupt  DB .**.*
1db40 2a 20 54 72 69 67 67 65 72 20 61 6e 20 69 6e 74  * Trigger an int
1db50 65 72 72 75 70 74 20 6f 6e 20 44 42 0a 2a 2f 0a  errupt on DB.*/.
1db60 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
1db70 69 6e 74 65 72 72 75 70 74 28 0a 20 20 76 6f 69  interrupt(.  voi
1db80 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1db90 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1dba0 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63  terp,.  int argc
1dbb0 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a  ,.  char **argv.
1dbc0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
1dbd0 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
1dbe0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
1dbf0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
1dc00 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73  "wrong # args: s
1dc10 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61 72  hould be \"", ar
1dc20 67 76 5b 30 5d 2c 20 22 20 44 42 22 2c 20 30 29  gv[0], " DB", 0)
1dc30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
1dc40 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
1dc50 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69  ( getDbPointer(i
1dc60 6e 74 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20  nterp, argv[1], 
1dc70 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
1dc80 4c 5f 45 52 52 4f 52 3b 0a 20 20 73 71 6c 69 74  L_ERROR;.  sqlit
1dc90 65 33 5f 69 6e 74 65 72 72 75 70 74 28 64 62 29  e3_interrupt(db)
1dca0 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1dcb0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 75 38 20  K;.}..static u8 
1dcc0 2a 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62  *sqlite3_stack_b
1dcd0 61 73 65 6c 69 6e 65 20 3d 20 30 3b 0a 0a 2f 2a  aseline = 0;../*
1dce0 0a 2a 2a 20 46 69 6c 6c 20 74 68 65 20 73 74 61  .** Fill the sta
1dcf0 63 6b 20 77 69 74 68 20 61 20 6b 6e 6f 77 6e 20  ck with a known 
1dd00 62 69 74 70 61 74 74 65 72 6e 2e 0a 2a 2f 0a 73  bitpattern..*/.s
1dd10 74 61 74 69 63 20 76 6f 69 64 20 70 72 65 70 53  tatic void prepS
1dd20 74 61 63 6b 28 76 6f 69 64 29 7b 0a 20 20 69 6e  tack(void){.  in
1dd30 74 20 69 3b 0a 20 20 75 33 32 20 62 69 67 42 75  t i;.  u32 bigBu
1dd40 66 5b 36 35 35 33 36 5d 3b 0a 20 20 66 6f 72 28  f[65536];.  for(
1dd50 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 62 69  i=0; i<sizeof(bi
1dd60 67 42 75 66 29 2f 73 69 7a 65 6f 66 28 62 69 67  gBuf)/sizeof(big
1dd70 42 75 66 5b 30 5d 29 3b 20 69 2b 2b 29 20 62 69  Buf[0]); i++) bi
1dd80 67 42 75 66 5b 69 5d 20 3d 20 30 78 64 65 61 64  gBuf[i] = 0xdead
1dd90 62 65 65 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f  beef;.  sqlite3_
1dda0 73 74 61 63 6b 5f 62 61 73 65 6c 69 6e 65 20 3d  stack_baseline =
1ddb0 20 28 75 38 2a 29 26 62 69 67 42 75 66 5b 36 35   (u8*)&bigBuf[65
1ddc0 35 33 36 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  536];.}../*.** G
1ddd0 65 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  et the current s
1dde0 74 61 63 6b 20 64 65 70 74 68 2e 20 20 55 73 65  tack depth.  Use
1ddf0 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  d for debugging 
1de00 6f 6e 6c 79 2e 0a 2a 2f 0a 75 36 34 20 73 71 6c  only..*/.u64 sql
1de10 69 74 65 33 53 74 61 63 6b 44 65 70 74 68 28 76  ite3StackDepth(v
1de20 6f 69 64 29 7b 0a 20 20 75 38 20 78 3b 0a 20 20  oid){.  u8 x;.  
1de30 72 65 74 75 72 6e 20 28 75 36 34 29 28 73 71 6c  return (u64)(sql
1de40 69 74 65 33 5f 73 74 61 63 6b 5f 62 61 73 65 6c  ite3_stack_basel
1de50 69 6e 65 20 2d 20 26 78 29 3b 0a 7d 0a 0a 2f 2a  ine - &x);.}../*
1de60 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c 69  .** Usage:  sqli
1de70 74 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 20 44  te3_stack_used D
1de80 42 20 53 51 4c 0a 2a 2a 0a 2a 2a 20 54 72 79 20  B SQL.**.** Try 
1de90 74 6f 20 6d 65 61 73 75 72 65 20 74 68 65 20 61  to measure the a
1dea0 6d 6f 75 6e 74 20 6f 66 20 73 74 61 63 6b 20 73  mount of stack s
1deb0 70 61 63 65 20 75 73 65 64 20 62 79 20 61 20 63  pace used by a c
1dec0 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65  all to sqlite3_e
1ded0 78 65 63 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  xec.*/.static in
1dee0 74 20 74 65 73 74 5f 73 74 61 63 6b 5f 75 73 65  t test_stack_use
1def0 64 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  d(.  void * clie
1df00 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1df10 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1df20 69 6e 74 20 61 72 67 63 2c 0a 20 20 63 68 61 72  int argc,.  char
1df30 20 2a 2a 61 72 67 76 0a 29 7b 0a 20 20 73 71 6c   **argv.){.  sql
1df40 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
1df50 69 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 33  i;.  if( argc!=3
1df60 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
1df70 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
1df80 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
1df90 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 20 61  should be \"", a
1dfa0 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20 20 20 20  rgv[0], .       
1dfb0 20 22 20 44 42 20 53 51 4c 22 2c 20 30 29 3b 0a   " DB SQL", 0);.
1dfc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1dfd0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1dfe0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1dff0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1e000 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1e010 45 52 52 4f 52 3b 0a 20 20 70 72 65 70 53 74 61  ERROR;.  prepSta
1e020 63 6b 28 29 3b 0a 20 20 28 76 6f 69 64 29 73 71  ck();.  (void)sq
1e030 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 61  lite3_exec(db, a
1e040 72 67 76 5b 32 5d 2c 20 30 2c 20 30 2c 20 30 29  rgv[2], 0, 0, 0)
1e050 3b 0a 20 20 66 6f 72 28 69 3d 36 35 35 33 35 3b  ;.  for(i=65535;
1e060 20 69 3e 3d 30 20 26 26 20 28 28 75 33 32 2a 29   i>=0 && ((u32*)
1e070 73 71 6c 69 74 65 33 5f 73 74 61 63 6b 5f 62 61  sqlite3_stack_ba
1e080 73 65 6c 69 6e 65 29 5b 2d 69 5d 3d 3d 30 78 64  seline)[-i]==0xd
1e090 65 61 64 62 65 65 66 3b 20 69 2d 2d 29 7b 7d 0a  eadbeef; i--){}.
1e0a0 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
1e0b0 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
1e0c0 65 77 49 6e 74 4f 62 6a 28 69 2a 34 29 29 3b 0a  ewIntObj(i*4));.
1e0d0 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
1e0e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a  .}../*.** Usage:
1e0f0 20 73 71 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66   sqlite_delete_f
1e100 75 6e 63 74 69 6f 6e 20 44 42 20 66 75 6e 63 74  unction DB funct
1e110 69 6f 6e 2d 6e 61 6d 65 0a 2a 2a 0a 2a 2a 20 44  ion-name.**.** D
1e120 65 6c 65 74 65 20 74 68 65 20 75 73 65 72 20 66  elete the user f
1e130 75 6e 63 74 69 6f 6e 20 27 66 75 6e 63 74 69 6f  unction 'functio
1e140 6e 2d 6e 61 6d 65 27 20 66 72 6f 6d 20 64 61 74  n-name' from dat
1e150 61 62 61 73 65 20 68 61 6e 64 6c 65 20 44 42 2e  abase handle DB.
1e160 20 49 74 0a 2a 2a 20 69 73 20 61 73 73 75 6d 65   It.** is assume
1e170 64 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  d that the user 
1e180 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63 72 65  function was cre
1e190 61 74 65 64 20 61 73 20 55 54 46 38 2c 20 61 6e  ated as UTF8, an
1e1a0 79 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 61  y number of.** a
1e1b0 72 67 75 6d 65 6e 74 73 20 28 74 68 65 20 77 61  rguments (the wa
1e1c0 79 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72 66  y the TCL interf
1e1d0 61 63 65 20 64 6f 65 73 20 69 74 29 2e 0a 2a 2f  ace does it)..*/
1e1e0 0a 73 74 61 74 69 63 20 69 6e 74 20 64 65 6c 65  .static int dele
1e1f0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 76  te_function(.  v
1e200 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61  oid * clientData
1e210 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  ,.  Tcl_Interp *
1e220 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61 72  interp,.  int ar
1e230 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72 67  gc,.  char **arg
1e240 76 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  v.){.  int rc;. 
1e250 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
1e260 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a 20  if( argc!=3 ){. 
1e270 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73     Tcl_AppendRes
1e280 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72 6f  ult(interp, "wro
1e290 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75 6c  ng # args: shoul
1e2a0 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b 30  d be \"", argv[0
1e2b0 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44 42  ], .        " DB
1e2c0 20 66 75 6e 63 74 69 6f 6e 2d 6e 61 6d 65 22 2c   function-name",
1e2d0 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20   0);.    return 
1e2e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  TCL_ERROR;.  }. 
1e2f0 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65   if( getDbPointe
1e300 72 28 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 31  r(interp, argv[1
1e310 5d 2c 20 26 64 62 29 20 29 20 72 65 74 75 72 6e  ], &db) ) return
1e320 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63   TCL_ERROR;.  rc
1e330 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
1e340 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 61  e_function(db, a
1e350 72 67 76 5b 32 5d 2c 20 2d 31 2c 20 53 51 4c 49  rgv[2], -1, SQLI
1e360 54 45 5f 55 54 46 38 2c 20 30 2c 20 30 2c 20 30  TE_UTF8, 0, 0, 0
1e370 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52  , 0);.  Tcl_SetR
1e380 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63  esult(interp, (c
1e390 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d  har *)t1ErrorNam
1e3a0 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49  e(rc), TCL_STATI
1e3b0 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  C);.  return TCL
1e3c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1e3d0 61 67 65 3a 20 73 71 6c 69 74 65 5f 64 65 6c 65  age: sqlite_dele
1e3e0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 44 42 20  te_collation DB 
1e3f0 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61 6d 65 0a 2a  collation-name.*
1e400 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20  *.** Delete the 
1e410 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1e420 63 65 20 27 63 6f 6c 6c 61 74 69 6f 6e 2d 6e 61  ce 'collation-na
1e430 6d 65 27 20 66 72 6f 6d 20 64 61 74 61 62 61 73  me' from databas
1e440 65 20 68 61 6e 64 6c 65 20 0a 2a 2a 20 44 42 2e  e handle .** DB.
1e450 20 49 74 20 69 73 20 61 73 73 75 6d 65 64 20 74   It is assumed t
1e460 68 61 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  hat the collatio
1e470 6e 20 73 65 71 75 65 6e 63 65 20 77 61 73 20 63  n sequence was c
1e480 72 65 61 74 65 64 20 61 73 20 55 54 46 38 20 28  reated as UTF8 (
1e490 74 68 65 20 0a 2a 2a 20 77 61 79 20 74 68 65 20  the .** way the 
1e4a0 54 43 4c 20 69 6e 74 65 72 66 61 63 65 20 64 6f  TCL interface do
1e4b0 65 73 20 69 74 29 2e 0a 2a 2f 0a 73 74 61 74 69  es it)..*/.stati
1e4c0 63 20 69 6e 74 20 64 65 6c 65 74 65 5f 63 6f 6c  c int delete_col
1e4d0 6c 61 74 69 6f 6e 28 0a 20 20 76 6f 69 64 20 2a  lation(.  void *
1e4e0 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54   clientData,.  T
1e4f0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1e500 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  p,.  int argc,. 
1e510 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29 7b 0a   char **argv.){.
1e520 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69    int rc;.  sqli
1e530 74 65 33 20 2a 64 62 3b 0a 20 20 69 66 28 20 61  te3 *db;.  if( a
1e540 72 67 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63  rgc!=3 ){.    Tc
1e550 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
1e560 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
1e570 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
1e580 5c 22 22 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20  \"", argv[0], . 
1e590 20 20 20 20 20 20 20 22 20 44 42 20 66 75 6e 63         " DB func
1e5a0 74 69 6f 6e 2d 6e 61 6d 65 22 2c 20 30 29 3b 0a  tion-name", 0);.
1e5b0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1e5c0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1e5d0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1e5e0 65 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64  erp, argv[1], &d
1e5f0 62 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f  b) ) return TCL_
1e600 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71  ERROR;.  rc = sq
1e610 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
1e620 6c 61 74 69 6f 6e 28 64 62 2c 20 61 72 67 76 5b  lation(db, argv[
1e630 32 5d 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  2], SQLITE_UTF8,
1e640 20 30 2c 20 30 29 3b 0a 20 20 54 63 6c 5f 53 65   0, 0);.  Tcl_Se
1e650 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
1e660 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
1e670 61 6d 65 28 72 63 29 2c 20 54 43 4c 5f 53 54 41  ame(rc), TCL_STA
1e680 54 49 43 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  TIC);.  return T
1e690 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1e6a0 55 73 61 67 65 3a 20 73 71 6c 69 74 65 33 5f 67  Usage: sqlite3_g
1e6b0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 20 44 42  et_autocommit DB
1e6c0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  .**.** Return tr
1e6d0 75 65 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ue if the databa
1e6e0 73 65 20 44 42 20 69 73 20 63 75 72 72 65 6e 74  se DB is current
1e6f0 6c 79 20 69 6e 20 61 75 74 6f 2d 63 6f 6d 6d 69  ly in auto-commi
1e700 74 20 6d 6f 64 65 2e 0a 2a 2a 20 52 65 74 75 72  t mode..** Retur
1e710 6e 20 66 61 6c 73 65 20 69 66 20 6e 6f 74 2e 0a  n false if not..
1e720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 67 65  */.static int ge
1e730 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 0a 20 20  t_autocommit(.  
1e740 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74  void * clientDat
1e750 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  a,.  Tcl_Interp 
1e760 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 61  *interp,.  int a
1e770 72 67 63 2c 0a 20 20 63 68 61 72 20 2a 2a 61 72  rgc,.  char **ar
1e780 67 76 0a 29 7b 0a 20 20 63 68 61 72 20 7a 42 75  gv.){.  char zBu
1e790 66 5b 33 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33  f[30];.  sqlite3
1e7a0 20 2a 64 62 3b 0a 20 20 69 66 28 20 61 72 67 63   *db;.  if( argc
1e7b0 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41  !=2 ){.    Tcl_A
1e7c0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e7d0 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72 67  rp, "wrong # arg
1e7e0 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22 22  s: should be \""
1e7f0 2c 20 61 72 67 76 5b 30 5d 2c 20 0a 20 20 20 20  , argv[0], .    
1e800 20 20 20 20 22 20 44 42 22 2c 20 30 29 3b 0a 20      " DB", 0);. 
1e810 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
1e820 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
1e830 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
1e840 72 70 2c 20 61 72 67 76 5b 31 5d 2c 20 26 64 62  rp, argv[1], &db
1e850 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1e860 52 52 4f 52 3b 0a 20 20 73 70 72 69 6e 74 66 28  RROR;.  sprintf(
1e870 7a 42 75 66 2c 20 22 25 64 22 2c 20 73 71 6c 69  zBuf, "%d", sqli
1e880 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
1e890 69 74 28 64 62 29 29 3b 0a 20 20 54 63 6c 5f 41  it(db));.  Tcl_A
1e8a0 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
1e8b0 72 70 2c 20 7a 42 75 66 2c 20 30 29 3b 0a 20 20  rp, zBuf, 0);.  
1e8c0 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
1e8d0 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 73  ../*.** Usage: s
1e8e0 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
1e8f0 6f 75 74 20 44 42 20 4d 53 0a 2a 2a 0a 2a 2a 20  out DB MS.**.** 
1e900 53 65 74 20 74 68 65 20 62 75 73 79 20 74 69 6d  Set the busy tim
1e910 65 6f 75 74 2e 20 20 54 68 69 73 20 69 73 20 6d  eout.  This is m
1e920 6f 72 65 20 65 61 73 69 6c 79 20 64 6f 6e 65 20  ore easily done 
1e930 75 73 69 6e 67 20 74 68 65 20 74 69 6d 65 6f 75  using the timeou
1e940 74 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 74  t.** method of t
1e950 68 65 20 54 43 4c 20 69 6e 74 65 72 66 61 63 65  he TCL interface
1e960 2e 20 20 42 75 74 20 77 65 20 6e 65 65 64 20 61  .  But we need a
1e970 20 77 61 79 20 74 6f 20 74 65 73 74 20 74 68 65   way to test the
1e980 20 63 61 73 65 0a 2a 2a 20 77 68 65 72 65 20 69   case.** where i
1e990 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  t returns SQLITE
1e9a0 5f 4d 49 53 55 53 45 2e 0a 2a 2f 0a 73 74 61 74  _MISUSE..*/.stat
1e9b0 69 63 20 69 6e 74 20 74 65 73 74 5f 62 75 73 79  ic int test_busy
1e9c0 5f 74 69 6d 65 6f 75 74 28 0a 20 20 76 6f 69 64  _timeout(.  void
1e9d0 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
1e9e0 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
1e9f0 65 72 70 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c  erp,.  int argc,
1ea00 0a 20 20 63 68 61 72 20 2a 2a 61 72 67 76 0a 29  .  char **argv.)
1ea10 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6d 73 3b 0a  {.  int rc, ms;.
1ea20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
1ea30 20 69 66 28 20 61 72 67 63 21 3d 33 20 29 7b 0a   if( argc!=3 ){.
1ea40 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
1ea50 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 77 72  sult(interp, "wr
1ea60 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68 6f 75  ong # args: shou
1ea70 6c 64 20 62 65 20 5c 22 22 2c 20 61 72 67 76 5b  ld be \"", argv[
1ea80 30 5d 2c 20 0a 20 20 20 20 20 20 20 20 22 20 44  0], .        " D
1ea90 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75  B", 0);.    retu
1eaa0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1eab0 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69  }.  if( getDbPoi
1eac0 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 61 72 67  nter(interp, arg
1ead0 76 5b 31 5d 2c 20 26 64 62 29 20 29 20 72 65 74  v[1], &db) ) ret
1eae0 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1eaf0 20 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 28   if( Tcl_GetInt(
1eb00 69 6e 74 65 72 70 2c 20 61 72 67 76 5b 32 5d 2c  interp, argv[2],
1eb10 20 26 6d 73 29 20 29 20 72 65 74 75 72 6e 20 54   &ms) ) return T
1eb20 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
1eb30 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
1eb40 6d 65 6f 75 74 28 64 62 2c 20 6d 73 29 3b 0a 20  meout(db, ms);. 
1eb50 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
1eb60 74 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65  t(interp, sqlite
1eb70 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 30 29  3ErrName(rc), 0)
1eb80 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1eb90 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  K;.}../*.** Usag
1eba0 65 3a 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65  e:  tcl_variable
1ebb0 5f 74 79 70 65 20 56 41 52 49 41 42 4c 45 4e 41  _type VARIABLENA
1ebc0 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ME.**.** Return 
1ebd0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
1ebe0 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
1ebf0 6e 74 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 0a  ntation for the.
1ec00 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  ** value of the 
1ec10 67 69 76 65 6e 20 76 61 72 69 61 62 6c 65 2e 0a  given variable..
1ec20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 63  */.static int tc
1ec30 6c 5f 76 61 72 69 61 62 6c 65 5f 74 79 70 65 28  l_variable_type(
1ec40 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
1ec50 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
1ec60 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
1ec70 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
1ec80 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
1ec90 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 56  ){.  Tcl_Obj *pV
1eca0 61 72 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  ar;.  if( objc!=
1ecb0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1ecc0 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1ecd0 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 41 52 49  , 1, objv, "VARI
1ece0 41 42 4c 45 22 29 3b 0a 20 20 20 20 72 65 74 75  ABLE");.    retu
1ecf0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1ed00 7d 0a 20 20 70 56 61 72 20 3d 20 54 63 6c 5f 47  }.  pVar = Tcl_G
1ed10 65 74 56 61 72 32 45 78 28 69 6e 74 65 72 70 2c  etVar2Ex(interp,
1ed20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
1ed30 62 6a 76 5b 31 5d 29 2c 20 30 2c 20 54 43 4c 5f  bjv[1]), 0, TCL_
1ed40 4c 45 41 56 45 5f 45 52 52 5f 4d 53 47 29 3b 0a  LEAVE_ERR_MSG);.
1ed50 20 20 69 66 28 20 70 56 61 72 3d 3d 30 20 29 20    if( pVar==0 ) 
1ed60 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
1ed70 3b 0a 20 20 69 66 28 20 70 56 61 72 2d 3e 74 79  ;.  if( pVar->ty
1ed80 70 65 50 74 72 20 29 7b 0a 20 20 20 20 54 63 6c  pePtr ){.    Tcl
1ed90 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
1eda0 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72  terp, Tcl_NewStr
1edb0 69 6e 67 4f 62 6a 28 70 56 61 72 2d 3e 74 79 70  ingObj(pVar->typ
1edc0 65 50 74 72 2d 3e 6e 61 6d 65 2c 20 2d 31 29 29  ePtr->name, -1))
1edd0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
1ede0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1edf0 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1ee00 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 3f  release_memory ?
1ee10 4e 3f 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  N?.**.** Attempt
1ee20 20 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f   to release memo
1ee30 72 79 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c  ry currently hel
1ee40 64 20 62 75 74 20 6e 6f 74 20 61 63 74 75 61 6c  d but not actual
1ee50 6c 79 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a 20  ly required..** 
1ee60 54 68 65 20 69 6e 74 65 67 65 72 20 4e 20 69 73  The integer N is
1ee70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
1ee80 79 74 65 73 20 77 65 20 61 72 65 20 74 72 79 69  ytes we are tryi
1ee90 6e 67 20 74 6f 20 72 65 6c 65 61 73 65 2e 20 20  ng to release.  
1eea0 54 68 65 20 0a 2a 2a 20 72 65 74 75 72 6e 20 76  The .** return v
1eeb0 61 6c 75 65 20 69 73 20 74 68 65 20 61 6d 6f 75  alue is the amou
1eec0 6e 74 20 6f 66 20 6d 65 6d 6f 72 79 20 61 63 74  nt of memory act
1eed0 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 64 2e 0a  ually released..
1eee0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1eef0 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  st_release_memor
1ef00 79 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65  y(.  void * clie
1ef10 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
1ef20 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
1ef30 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
1ef40 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
1ef50 5d 0a 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  ].){.#if defined
1ef60 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
1ef70 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
1ef80 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
1ef90 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
1efa0 29 0a 20 20 69 6e 74 20 4e 3b 0a 20 20 69 6e 74  ).  int N;.  int
1efb0 20 61 6d 74 3b 0a 20 20 69 66 28 20 6f 62 6a 63   amt;.  if( objc
1efc0 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d 32 20 29  !=1 && objc!=2 )
1efd0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
1efe0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
1eff0 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22 29 3b 0a  , objv, "?N?");.
1f000 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1f010 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1f020 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20 20 20 69  objc==2 ){.    i
1f030 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f  f( Tcl_GetIntFro
1f040 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
1f050 76 5b 31 5d 2c 20 26 4e 29 20 29 20 72 65 74 75  v[1], &N) ) retu
1f060 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
1f070 7d 65 6c 73 65 7b 0a 20 20 20 20 4e 20 3d 20 2d  }else{.    N = -
1f080 31 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d 20 73  1;.  }.  amt = s
1f090 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d  qlite3_release_m
1f0a0 65 6d 6f 72 79 28 4e 29 3b 0a 20 20 54 63 6c 5f  emory(N);.  Tcl_
1f0b0 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
1f0c0 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f  erp, Tcl_NewIntO
1f0d0 62 6a 28 61 6d 74 29 29 3b 0a 23 65 6e 64 69 66  bj(amt));.#endif
1f0e0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
1f0f0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67  ;.}.../*.** Usag
1f100 65 3a 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  e:  sqlite3_db_r
1f110 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 20 44 42  elease_memory DB
1f120 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74  .**.** Attempt t
1f130 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79  o release memory
1f140 20 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20   currently held 
1f150 62 79 20 64 61 74 61 62 61 73 65 20 44 42 2e 20  by database DB. 
1f160 20 52 65 74 75 72 6e 20 74 68 65 0a 2a 2a 20 72   Return the.** r
1f170 65 73 75 6c 74 20 63 6f 64 65 20 28 77 68 69 63  esult code (whic
1f180 68 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  h in the current
1f190 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
1f1a0 69 73 20 61 6c 77 61 79 73 20 7a 65 72 6f 29 2e  is always zero).
1f1b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1f1c0 65 73 74 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  est_db_release_m
1f1d0 65 6d 6f 72 79 28 0a 20 20 76 6f 69 64 20 2a 20  emory(.  void * 
1f1e0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1f1f0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f200 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1f210 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1f220 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1f230 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
1f240 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32 20  ;.  if( objc!=2 
1f250 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67  ){.    Tcl_Wrong
1f260 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20  NumArgs(interp, 
1f270 31 2c 20 6f 62 6a 76 2c 20 22 44 42 22 29 3b 0a  1, objv, "DB");.
1f280 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
1f290 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
1f2a0 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
1f2b0 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
1f2c0 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
1f2d0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
1f2e0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
1f2f0 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f  ite3_db_release_
1f300 6d 65 6d 6f 72 79 28 64 62 29 3b 0a 20 20 54 63  memory(db);.  Tc
1f310 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
1f320 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
1f330 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 72 65 74  tObj(rc));.  ret
1f340 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f  urn TCL_OK;.}../
1f350 2a 0a 2a 2a 20 55 73 61 67 65 3a 20 20 73 71 6c  *.** Usage:  sql
1f360 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
1f370 20 44 42 20 44 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a   DB DBNAME.**.**
1f380 20 52 65 74 75 72 6e 20 74 68 65 20 6e 61 6d 65   Return the name
1f390 20 6f 66 20 61 20 66 69 6c 65 20 61 73 73 6f 63   of a file assoc
1f3a0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
1f3b0 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
1f3c0 20 69 6e 74 20 74 65 73 74 5f 64 62 5f 66 69 6c   int test_db_fil
1f3d0 65 6e 61 6d 65 28 0a 20 20 76 6f 69 64 20 2a 20  ename(.  void * 
1f3e0 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63  clientData,.  Tc
1f3f0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
1f400 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20  ,.  int objc,.  
1f410 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
1f420 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73 71 6c 69 74  bjv[].){.  sqlit
1f430 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20  e3 *db;.  const 
1f440 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 3b 0a 20  char *zDbName;. 
1f450 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a   if( objc!=3 ){.
1f460 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
1f470 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
1f480 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
1f490 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  ");.    return T
1f4a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
1f4b0 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
1f4c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
1f4d0 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
1f4e0 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
1f4f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 44 62 4e  CL_ERROR;.  zDbN
1f500 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72  ame = Tcl_GetStr
1f510 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20  ing(objv[2]);.  
1f520 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
1f530 28 69 6e 74 65 72 70 2c 20 73 71 6c 69 74 65 33  (interp, sqlite3
1f540 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 64 62 2c  _db_filename(db,
1f550 20 7a 44 62 4e 61 6d 65 29 2c 20 28 76 6f 69 64   zDbName), (void
1f560 2a 29 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  *)0);.  return T
1f570 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
1f580 55 73 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f  Usage:  sqlite3_
1f590 64 62 5f 72 65 61 64 6f 6e 6c 79 20 44 42 20 44  db_readonly DB D
1f5a0 42 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 52 65 74 75  BNAME.**.** Retu
1f5b0 72 6e 20 31 20 6f 72 20 30 20 69 66 20 44 42 4e  rn 1 or 0 if DBN
1f5c0 41 4d 45 20 69 73 20 72 65 61 64 6f 6e 6c 79 20  AME is readonly 
1f5d0 6f 72 20 6e 6f 74 2e 20 20 52 65 74 75 72 6e 20  or not.  Return 
1f5e0 2d 31 20 69 66 20 44 42 4e 41 4d 45 20 64 6f 65  -1 if DBNAME doe
1f5f0 73 0a 2a 2a 20 6e 6f 74 20 65 78 69 73 74 2e 0a  s.** not exist..
1f600 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74 65  */.static int te
1f610 73 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 0a  st_db_readonly(.
1f620 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74 44    void * clientD
1f630 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65 72  ata,.  Tcl_Inter
1f640 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e 74  p *interp,.  int
1f650 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a   objc,.  Tcl_Obj
1f660 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29   *CONST objv[].)
1f670 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
1f680 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f690 44 62 4e 61 6d 65 3b 0a 20 20 69 66 28 20 6f 62  DbName;.  if( ob
1f6a0 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
1f6b0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
1f6c0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
1f6d0 44 42 20 44 42 4e 41 4d 45 22 29 3b 0a 20 20 20  DB DBNAME");.   
1f6e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f6f0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
1f700 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
1f710 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
1f720 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
1f730 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
1f740 52 3b 0a 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  R;.  zDbName = T
1f750 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
1f760 76 5b 32 5d 29 3b 0a 20 20 54 63 6c 5f 53 65 74  v[2]);.  Tcl_Set
1f770 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70  ObjResult(interp
1f780 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28  , Tcl_NewIntObj(
1f790 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
1f7a0 6e 6c 79 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  nly(db, zDbName)
1f7b0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  ));.  return TCL
1f7c0 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73  _OK;.}../*.** Us
1f7d0 61 67 65 3a 20 20 73 71 6c 69 74 65 33 5f 73 6f  age:  sqlite3_so
1f7e0 66 74 5f 68 65 61 70 5f 6c 69 6d 69 74 20 3f 4e  ft_heap_limit ?N
1f7f0 3f 0a 2a 2a 0a 2a 2a 20 51 75 65 72 79 20 6f 72  ?.**.** Query or
1f800 20 73 65 74 20 74 68 65 20 73 6f 66 74 20 68 65   set the soft he
1f810 61 70 20 6c 69 6d 69 74 20 66 6f 72 20 74 68 65  ap limit for the
1f820 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 2e   current thread.
1f830 20 20 54 68 65 0a 2a 2a 20 6c 69 6d 69 74 20 69    The.** limit i
1f840 73 20 6f 6e 6c 79 20 63 68 61 6e 67 65 64 20 69  s only changed i
1f850 66 20 74 68 65 20 4e 20 69 73 20 70 72 65 73 65  f the N is prese
1f860 6e 74 2e 20 20 54 68 65 20 70 72 65 76 69 6f 75  nt.  The previou
1f870 73 20 6c 69 6d 69 74 0a 2a 2a 20 69 73 20 72 65  s limit.** is re
1f880 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
1f890 63 20 69 6e 74 20 74 65 73 74 5f 73 6f 66 74 5f  c int test_soft_
1f8a0 68 65 61 70 5f 6c 69 6d 69 74 28 0a 20 20 76 6f  heap_limit(.  vo
1f8b0 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1f8c0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1f8d0 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1f8e0 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1f8f0 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1f900 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 61 6d  sqlite3_int64 am
1f910 74 3b 0a 20 20 54 63 6c 5f 57 69 64 65 49 6e 74  t;.  Tcl_WideInt
1f920 20 4e 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 6f   N = -1;.  if( o
1f930 62 6a 63 21 3d 31 20 26 26 20 6f 62 6a 63 21 3d  bjc!=1 && objc!=
1f940 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
1f950 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
1f960 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 3f 4e 3f 22  , 1, objv, "?N?"
1f970 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
1f980 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
1f990 66 28 20 6f 62 6a 63 3d 3d 32 20 29 7b 0a 20 20  f( objc==2 ){.  
1f9a0 20 20 69 66 28 20 54 63 6c 5f 47 65 74 57 69 64    if( Tcl_GetWid
1f9b0 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  eIntFromObj(inte
1f9c0 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 4e 29  rp, objv[1], &N)
1f9d0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
1f9e0 52 4f 52 3b 0a 20 20 7d 0a 20 20 61 6d 74 20 3d  ROR;.  }.  amt =
1f9f0 20 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68 65   sqlite3_soft_he
1fa00 61 70 5f 6c 69 6d 69 74 36 34 28 4e 29 3b 0a 20  ap_limit64(N);. 
1fa10 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1fa20 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
1fa30 77 57 69 64 65 49 6e 74 4f 62 6a 28 61 6d 74 29  wWideIntObj(amt)
1fa40 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
1fa50 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61  OK;.}../*.** Usa
1fa60 67 65 3a 20 20 20 73 71 6c 69 74 65 33 5f 74 68  ge:   sqlite3_th
1fa70 72 65 61 64 5f 63 6c 65 61 6e 75 70 0a 2a 2a 0a  read_cleanup.**.
1fa80 2a 2a 20 43 61 6c 6c 20 74 68 65 20 73 71 6c 69  ** Call the sqli
1fa90 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e  te3_thread_clean
1faa0 75 70 20 41 50 49 2e 0a 2a 2f 0a 73 74 61 74 69  up API..*/.stati
1fab0 63 20 69 6e 74 20 74 65 73 74 5f 74 68 72 65 61  c int test_threa
1fac0 64 5f 63 6c 65 61 6e 75 70 28 0a 20 20 76 6f 69  d_cleanup(.  voi
1fad0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
1fae0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
1faf0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
1fb00 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
1fb10 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 23 69 66  ST objv[].){.#if
1fb20 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1fb30 5f 44 45 50 52 45 43 41 54 45 44 0a 20 20 73 71  _DEPRECATED.  sq
1fb40 6c 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65  lite3_thread_cle
1fb50 61 6e 75 70 28 29 3b 0a 23 65 6e 64 69 66 0a 20  anup();.#endif. 
1fb60 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
1fb70 7d 0a 0a 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 20  }../*.** Usage: 
1fb80 20 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f    sqlite3_pager_
1fb90 72 65 66 63 6f 75 6e 74 73 20 20 44 42 0a 2a 2a  refcounts  DB.**
1fba0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73  .** Return a lis
1fbb0 74 20 6f 66 20 6e 75 6d 62 65 72 73 20 77 68 69  t of numbers whi
1fbc0 63 68 20 61 72 65 20 74 68 65 20 50 61 67 65 72  ch are the Pager
1fbd0 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 61 6c 6c  Refcount for all
1fbe0 0a 2a 2a 20 70 61 67 65 72 73 20 6f 6e 20 65 61  .** pagers on ea
1fbf0 63 68 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ch database conn
1fc00 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ection..*/.stati
1fc10 63 20 69 6e 74 20 74 65 73 74 5f 70 61 67 65 72  c int test_pager
1fc20 5f 72 65 66 63 6f 75 6e 74 73 28 0a 20 20 76 6f  _refcounts(.  vo
1fc30 69 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c  id * clientData,
1fc40 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
1fc50 6e 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a  nterp,.  int obj
1fc60 63 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  c,.  Tcl_Obj *CO
1fc70 4e 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20  NST objv[].){.  
1fc80 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
1fc90 6e 74 20 69 3b 0a 20 20 69 6e 74 20 76 2c 20 2a  nt i;.  int v, *
1fca0 61 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52  a;.  Tcl_Obj *pR
1fcb0 65 73 75 6c 74 3b 0a 0a 20 20 69 66 28 20 6f 62  esult;..  if( ob
1fcc0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
1fcd0 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
1fce0 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
1fcf0 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
1fd00 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
1fd10 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
1fd20 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
1fd30 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74  DB", 0);.    ret
1fd40 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fd50 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
1fd60 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
1fd70 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
1fd80 5b 31 5d 29 2c 20 26 64 62 29 20 29 20 72 65 74  [1]), &db) ) ret
1fd90 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
1fda0 20 70 52 65 73 75 6c 74 20 3d 20 54 63 6c 5f 4e   pResult = Tcl_N
1fdb0 65 77 4f 62 6a 28 29 3b 0a 20 20 66 6f 72 28 69  ewObj();.  for(i
1fdc0 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
1fdd0 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
1fde0 3e 61 44 62 5b 69 5d 2e 70 42 74 3d 3d 30 20 29  >aDb[i].pBt==0 )
1fdf0 7b 0a 20 20 20 20 20 20 76 20 3d 20 2d 31 3b 0a  {.      v = -1;.
1fe00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1fe10 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1fe20 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
1fe30 0a 20 20 20 20 20 20 61 20 3d 20 73 71 6c 69 74  .      a = sqlit
1fe40 65 33 50 61 67 65 72 53 74 61 74 73 28 73 71 6c  e3PagerStats(sql
1fe50 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64  ite3BtreePager(d
1fe60 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 29 3b  b->aDb[i].pBt));
1fe70 0a 20 20 20 20 20 20 76 20 3d 20 61 5b 30 5d 3b  .      v = a[0];
1fe80 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1fe90 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
1fea0 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  utex);.    }.   
1feb0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
1fec0 6e 64 45 6c 65 6d 65 6e 74 28 30 2c 20 70 52 65  ndElement(0, pRe
1fed0 73 75 6c 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  sult, Tcl_NewInt
1fee0 4f 62 6a 28 76 29 29 3b 0a 20 20 7d 0a 20 20 54  Obj(v));.  }.  T
1fef0 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28  cl_SetObjResult(
1ff00 69 6e 74 65 72 70 2c 20 70 52 65 73 75 6c 74 29  interp, pResult)
1ff10 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
1ff20 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  K;.}.../*.** tcl
1ff30 63 6d 64 3a 20 20 20 77 6f 72 6b 69 6e 67 5f 36  cmd:   working_6
1ff40 34 62 69 74 5f 69 6e 74 0a 2a 2a 0a 2a 2a 20 53  4bit_int.**.** S
1ff50 6f 6d 65 20 54 43 4c 20 62 75 69 6c 64 73 20 28  ome TCL builds (
1ff60 65 78 3a 20 63 79 67 77 69 6e 29 20 64 6f 20 6e  ex: cygwin) do n
1ff70 6f 74 20 73 75 70 70 6f 72 74 20 36 34 2d 62 69  ot support 64-bi
1ff80 74 20 69 6e 74 65 67 65 72 73 2e 20 20 54 68 69  t integers.  Thi
1ff90 73 0a 2a 2a 20 6c 65 61 64 73 20 74 6f 20 61 20  s.** leads to a 
1ffa0 6e 75 6d 62 65 72 20 6f 66 20 74 65 73 74 20 66  number of test f
1ffb0 61 69 6c 75 72 65 73 2e 20 20 54 68 65 20 70 72  ailures.  The pr
1ffc0 65 73 65 6e 74 20 63 6f 6d 6d 61 6e 64 20 63 68  esent command ch
1ffd0 65 63 6b 73 20 74 68 65 0a 2a 2a 20 54 43 4c 20  ecks the.** TCL 
1ffe0 62 75 69 6c 64 20 74 6f 20 73 65 65 20 77 68 65  build to see whe
1fff0 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 73  ther or not it s
20000 75 70 70 6f 72 74 73 20 36 34 2d 62 69 74 20 69  upports 64-bit i
20010 6e 74 65 67 65 72 73 2e 20 20 49 74 0a 2a 2a 20  ntegers.  It.** 
20020 72 65 74 75 72 6e 73 20 54 52 55 45 20 69 66 20  returns TRUE if 
20030 69 74 20 64 6f 65 73 20 61 6e 64 20 46 41 4c 53  it does and FALS
20040 45 20 69 66 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20  E if not..**.** 
20050 54 68 69 73 20 63 6f 6d 6d 61 6e 64 20 69 73 20  This command is 
20060 75 73 65 64 20 74 6f 20 77 61 72 6e 20 75 73 65  used to warn use
20070 72 73 20 74 68 61 74 20 74 68 65 69 72 20 54 43  rs that their TC
20080 4c 20 62 75 69 6c 64 20 69 73 20 64 65 66 65 63  L build is defec
20090 74 69 76 65 0a 2a 2a 20 61 6e 64 20 74 68 61 74  tive.** and that
200a0 20 74 68 65 20 65 72 72 6f 72 73 20 74 68 65 79   the errors they
200b0 20 61 72 65 20 73 65 65 69 6e 67 20 69 6e 20 74   are seeing in t
200c0 68 65 20 74 65 73 74 20 73 63 72 69 70 74 73 20  he test scripts 
200d0 6d 69 67 68 74 20 62 65 0a 2a 2a 20 61 20 72 65  might be.** a re
200e0 73 75 6c 74 20 6f 66 20 74 68 65 69 72 20 64 65  sult of their de
200f0 66 65 63 74 69 76 65 20 54 43 4c 20 72 61 74 68  fective TCL rath
20100 65 72 20 74 68 61 6e 20 70 72 6f 62 6c 65 6d 73  er than problems
20110 20 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2f 0a 73   in SQLite..*/.s
20120 74 61 74 69 63 20 69 6e 74 20 77 6f 72 6b 69 6e  tatic int workin
20130 67 5f 36 34 62 69 74 5f 69 6e 74 28 0a 20 20 43  g_64bit_int(.  C
20140 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
20150 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
20160 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
20170 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
20180 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
20190 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
201a0 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
201b0 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
201c0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
201d0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
201e0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
201f0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
20200 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
20210 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
20220 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
20230 20 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 4f 62 6a   */.){.  Tcl_Obj
20240 20 2a 70 54 65 73 74 4f 62 6a 3b 0a 20 20 69 6e   *pTestObj;.  in
20250 74 20 77 6f 72 6b 69 6e 67 20 3d 20 30 3b 0a 0a  t working = 0;..
20260 20 20 70 54 65 73 74 4f 62 6a 20 3d 20 54 63 6c    pTestObj = Tcl
20270 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 31  _NewWideIntObj(1
20280 30 30 30 30 30 30 2a 28 69 36 34 29 31 32 33 34  000000*(i64)1234
20290 35 36 37 38 39 30 29 3b 0a 20 20 77 6f 72 6b 69  567890);.  worki
202a0 6e 67 20 3d 20 73 74 72 63 6d 70 28 54 63 6c 5f  ng = strcmp(Tcl_
202b0 47 65 74 53 74 72 69 6e 67 28 70 54 65 73 74 4f  GetString(pTestO
202c0 62 6a 29 2c 20 22 31 32 33 34 35 36 37 38 39 30  bj), "1234567890
202d0 30 30 30 30 30 30 22 29 3d 3d 30 3b 0a 20 20 54  000000")==0;.  T
202e0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
202f0 70 54 65 73 74 4f 62 6a 29 3b 0a 20 20 54 63 6c  pTestObj);.  Tcl
20300 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
20310 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 42 6f 6f  terp, Tcl_NewBoo
20320 6c 65 61 6e 4f 62 6a 28 77 6f 72 6b 69 6e 67 29  leanObj(working)
20330 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
20340 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 74 63  OK;.}.../*.** tc
20350 6c 63 6d 64 3a 20 20 20 76 66 73 5f 75 6e 6c 69  lcmd:   vfs_unli
20360 6e 6b 5f 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68  nk_test.**.** Th
20370 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75  is TCL command u
20380 6e 72 65 67 69 73 74 65 72 73 20 74 68 65 20 70  nregisters the p
20390 72 69 6d 61 72 79 20 56 46 53 20 61 6e 64 20 74  rimary VFS and t
203a0 68 65 6e 20 72 65 67 69 73 74 65 72 73 0a 2a 2a  hen registers.**
203b0 20 69 74 20 62 61 63 6b 20 61 67 61 69 6e 2e 20   it back again. 
203c0 20 54 68 69 73 20 69 73 20 75 73 65 64 20 74 6f   This is used to
203d0 20 74 65 73 74 20 74 68 65 20 61 62 69 6c 69 74   test the abilit
203e0 79 20 74 6f 20 72 65 67 69 73 74 65 72 20 61 0a  y to register a.
203f0 2a 2a 20 56 46 53 20 77 68 65 6e 20 6e 6f 6e 65  ** VFS when none
20400 20 61 72 65 20 70 72 65 76 69 6f 75 73 6c 79 20   are previously 
20410 72 65 67 69 73 74 65 72 65 64 2c 20 61 6e 64 20  registered, and 
20420 74 68 65 20 61 62 69 6c 69 74 79 20 74 6f 20 0a  the ability to .
20430 2a 2a 20 75 6e 72 65 67 69 73 74 65 72 20 74 68  ** unregister th
20440 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
20450 20 56 46 53 2e 20 20 54 69 63 6b 65 74 20 23 32   VFS.  Ticket #2
20460 37 33 38 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  738.*/.static in
20470 74 20 76 66 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73  t vfs_unlink_tes
20480 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20  t(.  ClientData 
20490 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50  clientData, /* P
204a0 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
204b0 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e  3_enable_XXX fun
204c0 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49  ction */.  Tcl_I
204d0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20  nterp *interp,  
204e0 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74    /* The TCL int
204f0 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e  erpreter that in
20500 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61  voked this comma
20510 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63  nd */.  int objc
20520 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
20530 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
20540 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f  ments */.  Tcl_O
20550 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d  bj *CONST objv[]
20560 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67    /* Command arg
20570 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69  uments */.){.  i
20580 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f  nt i;.  sqlite3_
20590 76 66 73 20 2a 70 4d 61 69 6e 3b 0a 20 20 73 71  vfs *pMain;.  sq
205a0 6c 69 74 65 33 5f 76 66 73 20 2a 61 70 56 66 73  lite3_vfs *apVfs
205b0 5b 32 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  [20];.  sqlite3_
205c0 76 66 73 20 6f 6e 65 2c 20 74 77 6f 3b 0a 0a 20  vfs one, two;.. 
205d0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
205e0 65 67 69 73 74 65 72 28 30 29 3b 20 20 20 2f 2a  egister(0);   /*
205f0 20 55 6e 72 65 67 69 73 74 65 72 20 6f 66 20 4e   Unregister of N
20600 55 4c 4c 20 69 73 20 68 61 72 6d 6c 65 73 73 20  ULL is harmless 
20610 2a 2f 0a 20 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d  */.  one.zName =
20620 20 22 5f 5f 6f 6e 65 22 3b 0a 20 20 74 77 6f 2e   "__one";.  two.
20630 7a 4e 61 6d 65 20 3d 20 22 5f 5f 74 77 6f 22 3b  zName = "__two";
20640 0a 0a 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73  ..  /* Calling s
20650 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
20660 74 65 72 20 77 69 74 68 20 32 6e 64 20 61 72 67  ter with 2nd arg
20670 75 6d 65 6e 74 20 6f 66 20 30 20 64 6f 65 73 20  ument of 0 does 
20680 6e 6f 74 0a 20 20 2a 2a 20 63 68 61 6e 67 65 20  not.  ** change 
20690 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 0a  the default VFS.
206a0 20 20 2a 2f 0a 20 20 70 4d 61 69 6e 20 3d 20 73    */.  pMain = s
206b0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
206c0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  0);.  sqlite3_vf
206d0 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
206e0 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70   0);.  assert( p
206f0 4d 61 69 6e 3d 3d 30 20 7c 7c 20 70 4d 61 69 6e  Main==0 || pMain
20700 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
20710 6e 64 28 30 29 20 29 3b 0a 20 20 73 71 6c 69 74  nd(0) );.  sqlit
20720 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
20730 26 74 77 6f 2c 20 30 29 3b 0a 20 20 61 73 73 65  &two, 0);.  asse
20740 72 74 28 20 70 4d 61 69 6e 3d 3d 30 20 7c 7c 20  rt( pMain==0 || 
20750 70 4d 61 69 6e 3d 3d 73 71 6c 69 74 65 33 5f 76  pMain==sqlite3_v
20760 66 73 5f 66 69 6e 64 28 30 29 20 29 3b 0a 0a 20  fs_find(0) );.. 
20770 20 2f 2a 20 57 65 20 63 61 6e 20 66 69 6e 64 20   /* We can find 
20780 61 20 56 46 53 20 62 79 20 69 74 73 20 6e 61 6d  a VFS by its nam
20790 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 73  e */.  assert( s
207a0 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
207b0 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65 20 29  "__one")==&one )
207c0 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
207d0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f  te3_vfs_find("__
207e0 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b 0a 0a  two")==&two );..
207f0 20 20 2f 2a 20 43 61 6c 6c 69 6e 67 20 73 71 6c    /* Calling sql
20800 69 74 65 5f 76 66 73 5f 72 65 67 69 73 74 65 72  ite_vfs_register
20810 20 77 69 74 68 20 6e 6f 6e 2d 7a 65 72 6f 20 73   with non-zero s
20820 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20  econd parameter 
20830 63 68 61 6e 67 65 73 20 74 68 65 0a 20 20 2a 2a  changes the.  **
20840 20 64 65 66 61 75 6c 74 20 56 46 53 2c 20 65 76   default VFS, ev
20850 65 6e 20 69 66 20 74 68 65 20 31 73 74 20 70 61  en if the 1st pa
20860 72 61 6d 65 74 65 72 20 69 73 20 61 6e 20 65 78  rameter is an ex
20870 69 73 74 69 67 20 56 46 53 20 74 68 61 74 20 69  istig VFS that i
20880 73 0a 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 6c  s.  ** previousl
20890 79 20 72 65 67 69 73 74 65 72 65 64 20 61 73 20  y registered as 
208a0 74 68 65 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e  the non-default.
208b0 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
208c0 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e  vfs_register(&on
208d0 65 2c 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28  e, 1);.  assert(
208e0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
208f0 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f 6e 65  d("__one")==&one
20900 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71   );.  assert( sq
20910 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 22  lite3_vfs_find("
20920 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20 29 3b  __two")==&two );
20930 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
20940 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3d 3d  e3_vfs_find(0)==
20950 26 6f 6e 65 20 29 3b 0a 20 20 73 71 6c 69 74 65  &one );.  sqlite
20960 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
20970 74 77 6f 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  two, 1);.  asser
20980 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
20990 69 6e 64 28 22 5f 5f 6f 6e 65 22 29 3d 3d 26 6f  ind("__one")==&o
209a0 6e 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ne );.  assert( 
209b0 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
209c0 28 22 5f 5f 74 77 6f 22 29 3d 3d 26 74 77 6f 20  ("__two")==&two 
209d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  );.  assert( sql
209e0 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
209f0 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 69 66 28 20  ==&two );.  if( 
20a00 70 4d 61 69 6e 20 29 7b 0a 20 20 20 20 73 71 6c  pMain ){.    sql
20a10 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
20a20 72 28 70 4d 61 69 6e 2c 20 31 29 3b 0a 20 20 20  r(pMain, 1);.   
20a30 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20a40 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
20a50 22 29 3d 3d 26 6f 6e 65 20 29 3b 0a 20 20 20 20  ")==&one );.    
20a60 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
20a70 76 66 73 5f 66 69 6e 64 28 22 5f 5f 74 77 6f 22  vfs_find("__two"
20a80 29 3d 3d 26 74 77 6f 20 29 3b 0a 20 20 20 20 61  )==&two );.    a
20a90 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 76  ssert( sqlite3_v
20aa0 66 73 5f 66 69 6e 64 28 30 29 3d 3d 70 4d 61 69  fs_find(0)==pMai
20ab0 6e 20 29 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  n );.  }.  .  /*
20ac0 20 55 6e 6c 69 6e 6b 20 74 68 65 20 64 65 66 61   Unlink the defa
20ad0 75 6c 74 20 56 46 53 2e 20 20 52 65 70 65 61 74  ult VFS.  Repeat
20ae0 20 75 6e 74 69 6c 20 74 68 65 72 65 20 61 72 65   until there are
20af0 20 6e 6f 20 6d 6f 72 65 20 56 46 53 65 73 0a 20   no more VFSes. 
20b00 20 2a 2a 20 72 65 67 69 73 74 65 72 65 64 2e 0a   ** registered..
20b10 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20    */.  for(i=0; 
20b20 69 3c 73 69 7a 65 6f 66 28 61 70 56 66 73 29 2f  i<sizeof(apVfs)/
20b30 73 69 7a 65 6f 66 28 61 70 56 66 73 5b 30 5d 29  sizeof(apVfs[0])
20b40 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70 56 66  ; i++){.    apVf
20b50 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33 5f 76  s[i] = sqlite3_v
20b60 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 20 20  fs_find(0);.    
20b70 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a  if( apVfs[i] ){.
20b80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 61 70        assert( ap
20b90 56 66 73 5b 69 5d 3d 3d 73 71 6c 69 74 65 33 5f  Vfs[i]==sqlite3_
20ba0 76 66 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69  vfs_find(apVfs[i
20bb0 5d 2d 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20  ]->zName) );.   
20bc0 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75     sqlite3_vfs_u
20bd0 6e 72 65 67 69 73 74 65 72 28 61 70 56 66 73 5b  nregister(apVfs[
20be0 69 5d 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  i]);.      asser
20bf0 74 28 20 30 3d 3d 73 71 6c 69 74 65 33 5f 76 66  t( 0==sqlite3_vf
20c00 73 5f 66 69 6e 64 28 61 70 56 66 73 5b 69 5d 2d  s_find(apVfs[i]-
20c10 3e 7a 4e 61 6d 65 29 20 29 3b 0a 20 20 20 20 7d  >zName) );.    }
20c20 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 30  .  }.  assert( 0
20c30 3d 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  ==sqlite3_vfs_fi
20c40 6e 64 28 30 29 20 29 3b 0a 20 20 0a 20 20 2f 2a  nd(0) );.  .  /*
20c50 20 52 65 67 69 73 74 65 72 20 74 68 65 20 6d 61   Register the ma
20c60 69 6e 20 56 46 53 20 61 73 20 6e 6f 6e 2d 64 65  in VFS as non-de
20c70 66 61 75 6c 74 20 28 77 69 6c 6c 20 62 65 20 6d  fault (will be m
20c80 61 64 65 20 64 65 66 61 75 6c 74 2c 20 73 69 6e  ade default, sin
20c90 63 65 0a 20 20 2a 2a 20 69 74 27 6c 6c 20 62 65  ce.  ** it'll be
20ca0 20 74 68 65 20 6f 6e 6c 79 20 6f 6e 65 20 69 6e   the only one in
20cb0 20 65 78 69 73 74 65 6e 63 65 29 2e 0a 20 20 2a   existence)..  *
20cc0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f  /.  sqlite3_vfs_
20cd0 72 65 67 69 73 74 65 72 28 70 4d 61 69 6e 2c 20  register(pMain, 
20ce0 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  0);.  assert( sq
20cf0 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
20d00 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20  )==pMain );.  . 
20d10 20 2f 2a 20 55 6e 2d 72 65 67 69 73 74 65 72 20   /* Un-register 
20d20 74 68 65 20 6d 61 69 6e 20 56 46 53 20 61 67 61  the main VFS aga
20d30 69 6e 20 74 6f 20 72 65 73 74 6f 72 65 20 61 6e  in to restore an
20d40 20 65 6d 70 74 79 20 56 46 53 20 6c 69 73 74 20   empty VFS list 
20d50 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  */.  sqlite3_vfs
20d60 5f 75 6e 72 65 67 69 73 74 65 72 28 70 4d 61 69  _unregister(pMai
20d70 6e 29 3b 0a 20 20 61 73 73 65 72 74 28 20 30 3d  n);.  assert( 0=
20d80 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
20d90 64 28 30 29 20 29 3b 0a 0a 20 20 2f 2a 20 52 65  d(0) );..  /* Re
20da0 6c 69 6e 6b 20 61 6c 6c 20 56 46 53 65 73 20 69  link all VFSes i
20db0 6e 20 72 65 76 65 72 73 65 20 6f 72 64 65 72 2e  n reverse order.
20dc0 20 2a 2f 20 20 0a 20 20 66 6f 72 28 69 3d 73 69   */  .  for(i=si
20dd0 7a 65 6f 66 28 61 70 56 66 73 29 2f 73 69 7a 65  zeof(apVfs)/size
20de0 6f 66 28 61 70 56 66 73 5b 30 5d 29 2d 31 3b 20  of(apVfs[0])-1; 
20df0 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
20e00 69 66 28 20 61 70 56 66 73 5b 69 5d 20 29 7b 0a  if( apVfs[i] ){.
20e10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66        sqlite3_vf
20e20 73 5f 72 65 67 69 73 74 65 72 28 61 70 56 66 73  s_register(apVfs
20e30 5b 69 5d 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  [i], 1);.      a
20e40 73 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d  ssert( apVfs[i]=
20e50 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e  =sqlite3_vfs_fin
20e60 64 28 30 29 20 29 3b 0a 20 20 20 20 20 20 61 73  d(0) );.      as
20e70 73 65 72 74 28 20 61 70 56 66 73 5b 69 5d 3d 3d  sert( apVfs[i]==
20e80 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
20e90 28 61 70 56 66 73 5b 69 5d 2d 3e 7a 4e 61 6d 65  (apVfs[i]->zName
20ea0 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ) );.    }.  }..
20eb0 20 20 2f 2a 20 55 6e 72 65 67 69 73 74 65 72 20    /* Unregister 
20ec0 6f 75 74 20 73 61 6d 70 6c 65 20 56 46 53 65 73  out sample VFSes
20ed0 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  . */.  sqlite3_v
20ee0 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6f  fs_unregister(&o
20ef0 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ne);.  sqlite3_v
20f00 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 74  fs_unregister(&t
20f10 77 6f 29 3b 0a 0a 20 20 2f 2a 20 55 6e 72 65 67  wo);..  /* Unreg
20f20 69 73 74 65 72 69 6e 67 20 61 20 56 46 53 20 74  istering a VFS t
20f30 68 61 74 20 69 73 20 6e 6f 74 20 63 75 72 72 65  hat is not curre
20f40 6e 74 6c 79 20 72 65 67 69 73 74 65 72 65 64 20  ntly registered 
20f50 69 73 20 68 61 72 6d 6c 65 73 73 20 2a 2f 0a 20  is harmless */. 
20f60 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
20f70 65 67 69 73 74 65 72 28 26 6f 6e 65 29 3b 0a 20  egister(&one);. 
20f80 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72   sqlite3_vfs_unr
20f90 65 67 69 73 74 65 72 28 26 74 77 6f 29 3b 0a 20  egister(&two);. 
20fa0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
20fb0 5f 76 66 73 5f 66 69 6e 64 28 22 5f 5f 6f 6e 65  _vfs_find("__one
20fc0 22 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ")==0 );.  asser
20fd0 74 28 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  t( sqlite3_vfs_f
20fe0 69 6e 64 28 22 5f 5f 74 77 6f 22 29 3d 3d 30 20  ind("__two")==0 
20ff0 29 3b 0a 0a 20 20 2f 2a 20 57 65 20 73 68 6f 75  );..  /* We shou
21000 6c 64 20 62 65 20 6c 65 66 74 20 77 69 74 68 20  ld be left with 
21010 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 65 66  the original def
21020 61 75 6c 74 20 56 46 53 20 62 61 63 6b 20 61 73  ault VFS back as
21030 20 74 68 65 0a 20 20 2a 2a 20 6f 72 69 67 69 6e   the.  ** origin
21040 61 6c 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  al */.  assert( 
21050 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
21060 28 30 29 3d 3d 70 4d 61 69 6e 20 29 3b 0a 0a 20  (0)==pMain );.. 
21070 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a   return TCL_OK;.
21080 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  }../*.** tclcmd:
21090 20 20 20 76 66 73 5f 69 6e 69 74 66 61 69 6c 5f     vfs_initfail_
210a0 74 65 73 74 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  test.**.** This 
210b0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 61 74 74 65  TCL command atte
210c0 6d 70 74 73 20 74 6f 20 76 66 73 5f 66 69 6e 64  mpts to vfs_find
210d0 20 61 6e 64 20 76 66 73 5f 72 65 67 69 73 74 65   and vfs_registe
210e0 72 20 77 68 65 6e 20 74 68 65 0a 2a 2a 20 73 71  r when the.** sq
210f0 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
21100 28 29 20 69 6e 74 65 72 66 61 63 65 20 69 73 20  () interface is 
21110 66 61 69 6c 69 6e 67 2e 20 20 41 6c 6c 20 63 61  failing.  All ca
21120 6c 6c 73 20 73 68 6f 75 6c 64 20 66 61 69 6c 2e  lls should fail.
21130 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76  .*/.static int v
21140 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
21150 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
21160 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
21170 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
21180 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
21190 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
211a0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
211b0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
211c0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
211d0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
211e0 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
211f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21200 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
21210 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
21220 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
21230 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
21240 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
21250 6c 69 74 65 33 5f 76 66 73 20 6f 6e 65 3b 0a 20  lite3_vfs one;. 
21260 20 6f 6e 65 2e 7a 4e 61 6d 65 20 3d 20 22 5f 5f   one.zName = "__
21270 6f 6e 65 22 3b 0a 0a 20 20 69 66 28 20 73 71 6c  one";..  if( sql
21280 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
21290 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
212a0 52 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ROR;.  sqlite3_v
212b0 66 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65  fs_register(&one
212c0 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  , 0);.  if( sqli
212d0 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20  te3_vfs_find(0) 
212e0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
212f0 4f 52 3b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  OR;.  sqlite3_vf
21300 73 5f 72 65 67 69 73 74 65 72 28 26 6f 6e 65 2c  s_register(&one,
21310 20 31 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74   1);.  if( sqlit
21320 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 20 29  e3_vfs_find(0) )
21330 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
21340 52 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  R;.  return TCL_
21350 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  OK;.}../*.** Sav
21360 65 64 20 56 46 53 65 73 0a 2a 2f 0a 73 74 61 74  ed VFSes.*/.stat
21370 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ic sqlite3_vfs *
21380 61 70 56 66 73 5b 32 30 5d 3b 0a 73 74 61 74 69  apVfs[20];.stati
21390 63 20 69 6e 74 20 6e 56 66 73 20 3d 20 30 3b 0a  c int nVfs = 0;.
213a0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
213b0 20 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f   vfs_unregister_
213c0 61 6c 6c 0a 2a 2a 0a 2a 2a 20 55 6e 72 65 67 69  all.**.** Unregi
213d0 73 74 65 72 20 61 6c 6c 20 56 46 53 65 73 2e 0a  ster all VFSes..
213e0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 76 66  */.static int vf
213f0 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_unregister_all
21400 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
21410 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
21420 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
21430 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
21440 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
21450 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
21460 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
21470 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
21480 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
21490 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
214a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
214b0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
214c0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
214d0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
214e0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
214f0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ments */.){.  in
21500 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
21510 69 3c 41 72 72 61 79 53 69 7a 65 28 61 70 56 66  i<ArraySize(apVf
21520 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 70  s); i++){.    ap
21530 56 66 73 5b 69 5d 20 3d 20 73 71 6c 69 74 65 33  Vfs[i] = sqlite3
21540 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20  _vfs_find(0);.  
21550 20 20 69 66 28 20 61 70 56 66 73 5b 69 5d 3d 3d    if( apVfs[i]==
21560 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  0 ) break;.    s
21570 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67  qlite3_vfs_unreg
21580 69 73 74 65 72 28 61 70 56 66 73 5b 69 5d 29 3b  ister(apVfs[i]);
21590 0a 20 20 7d 0a 20 20 6e 56 66 73 20 3d 20 69 3b  .  }.  nVfs = i;
215a0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
215b0 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64  ;.}./*.** tclcmd
215c0 3a 20 20 20 76 66 73 5f 72 65 72 65 67 69 73 74  :   vfs_reregist
215d0 65 72 5f 61 6c 6c 0a 2a 2a 0a 2a 2a 20 52 65 73  er_all.**.** Res
215e0 74 6f 72 65 20 61 6c 6c 20 56 46 53 65 73 20 74  tore all VFSes t
215f0 68 61 74 20 77 65 72 65 20 72 65 6d 6f 76 65 64  hat were removed
21600 20 75 73 69 6e 67 20 76 66 73 5f 75 6e 72 65 67   using vfs_unreg
21610 69 73 74 65 72 5f 61 6c 6c 0a 2a 2f 0a 73 74 61  ister_all.*/.sta
21620 74 69 63 20 69 6e 74 20 76 66 73 5f 72 65 72 65  tic int vfs_rere
21630 67 69 73 74 65 72 5f 61 6c 6c 28 0a 20 20 43 6c  gister_all(.  Cl
21640 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
21650 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
21660 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
21670 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
21680 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
21690 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
216a0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
216b0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
216c0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
216d0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
216e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
216f0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
21700 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
21710 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
21720 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
21730 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  */.){.  int i;. 
21740 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 56 66 73   for(i=0; i<nVfs
21750 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
21760 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
21770 28 61 70 56 66 73 5b 69 5d 2c 20 69 3d 3d 30 29  (apVfs[i], i==0)
21780 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54  ;.  }.  return T
21790 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
217a0 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
217b0 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 20 44 42 0a  control_test DB.
217c0 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43 4c 20 63  **.** This TCL c
217d0 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74 68 65 20  ommand runs the 
217e0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
217f0 74 72 6f 6c 20 69 6e 74 65 72 66 61 63 65 20 61  trol interface a
21800 6e 64 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63  nd.** verifies c
21810 6f 72 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e  orrect operation
21820 20 6f 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f   of the same..*/
21830 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c 65  .static int file
21840 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74 28 0a 20  _control_test(. 
21850 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
21860 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
21870 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
21880 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
21890 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
218a0 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
218b0 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
218c0 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
218d0 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
218e0 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
218f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
21900 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
21910 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
21920 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
21930 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
21940 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  ts */.){.  int i
21950 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Arg = 0;.  sqlit
21960 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
21970 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ;..  if( objc!=2
21980 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
21990 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
219a0 20 22 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20   "wrong # args: 
219b0 73 68 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20  should be \"",. 
219c0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
219d0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76  ringFromObj(objv
219e0 5b 30 5d 2c 20 30 29 2c 20 22 20 44 42 22 2c 20  [0], 0), " DB", 
219f0 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
21a00 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
21a10 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72  if( getDbPointer
21a20 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74  (interp, Tcl_Get
21a30 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c  String(objv[1]),
21a40 20 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54   &db) ) return T
21a50 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
21a60 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
21a70 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20 30 2c 20  ntrol(db, 0, 0, 
21a80 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72 74  &iArg);.  assert
21a90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 54  ( rc==SQLITE_NOT
21aa0 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63 20 3d 20  FOUND );.  rc = 
21ab0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
21ac0 74 72 6f 6c 28 64 62 2c 20 22 6e 6f 74 61 64 61  trol(db, "notada
21ad0 74 61 62 61 73 65 22 2c 20 53 51 4c 49 54 45 5f  tabase", SQLITE_
21ae0 46 43 4e 54 4c 5f 4c 4f 43 4b 53 54 41 54 45 2c  FCNTL_LOCKSTATE,
21af0 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73 65 72   &iArg);.  asser
21b00 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52  t( rc==SQLITE_ER
21b10 52 4f 52 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  ROR );.  rc = sq
21b20 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
21b30 6f 6c 28 64 62 2c 20 22 6d 61 69 6e 22 2c 20 2d  ol(db, "main", -
21b40 31 2c 20 26 69 41 72 67 29 3b 0a 20 20 61 73 73  1, &iArg);.  ass
21b50 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
21b60 4e 4f 54 46 4f 55 4e 44 20 29 3b 0a 20 20 72 63  NOTFOUND );.  rc
21b70 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f   = sqlite3_file_
21b80 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 22 74 65 6d  control(db, "tem
21b90 70 22 2c 20 2d 31 2c 20 26 69 41 72 67 29 3b 0a  p", -1, &iArg);.
21ba0 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51    assert( rc==SQ
21bb0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 7c 7c  LITE_NOTFOUND ||
21bc0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 45 52 52 4f   rc==SQLITE_ERRO
21bd0 52 20 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 54  R );..  return T
21be0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  CL_OK;.}.../*.**
21bf0 20 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f   tclcmd:   file_
21c00 63 6f 6e 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e  control_lasterrn
21c10 6f 5f 74 65 73 74 20 44 42 0a 2a 2a 0a 2a 2a 20  o_test DB.**.** 
21c20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
21c30 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
21c40 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
21c50 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20  nterface and.** 
21c60 76 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74  verifies correct
21c70 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68   operation of th
21c80 65 20 53 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52  e SQLITE_LAST_ER
21c90 52 4e 4f 20 76 65 72 62 2e 0a 2a 2f 0a 73 74 61  RNO verb..*/.sta
21ca0 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e  tic int file_con
21cb0 74 72 6f 6c 5f 6c 61 73 74 65 72 72 6e 6f 5f 74  trol_lasterrno_t
21cc0 65 73 74 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  est(.  ClientDat
21cd0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
21ce0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
21cf0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
21d00 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
21d10 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
21d20 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
21d30 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
21d40 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
21d50 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
21d60 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
21d70 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
21d80 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
21d90 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
21da0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
21db0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
21dc0 20 69 6e 74 20 69 41 72 67 20 3d 20 30 3b 0a 20   int iArg = 0;. 
21dd0 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
21de0 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f  int rc;..  if( o
21df0 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63  bjc!=2 ){.    Tc
21e00 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
21e10 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
21e20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
21e30 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
21e40 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
21e50 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
21e60 20 44 42 22 2c 20 30 29 3b 0a 20 20 20 20 72 65   DB", 0);.    re
21e70 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
21e80 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
21e90 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
21ea0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
21eb0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
21ec0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
21ed0 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  ROR;.  }.  rc = 
21ee0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
21ef0 74 72 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53  trol(db, NULL, S
21f00 51 4c 49 54 45 5f 4c 41 53 54 5f 45 52 52 4e 4f  QLITE_LAST_ERRNO
21f10 2c 20 26 69 41 72 67 29 3b 0a 20 20 69 66 28 20  , &iArg);.  if( 
21f20 72 63 20 29 7b 20 0a 20 20 20 20 54 63 6c 5f 53  rc ){ .    Tcl_S
21f30 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
21f40 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
21f50 6a 28 72 63 29 29 3b 20 0a 20 20 20 20 72 65 74  j(rc)); .    ret
21f60 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 20 0a  urn TCL_ERROR; .
21f70 20 20 7d 0a 20 20 69 66 28 20 69 41 72 67 21 3d    }.  if( iArg!=
21f80 30 20 29 20 7b 0a 20 20 20 20 54 63 6c 5f 41 70  0 ) {.    Tcl_Ap
21f90 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
21fa0 70 2c 20 22 55 6e 65 78 70 65 63 74 65 64 20 6e  p, "Unexpected n
21fb0 6f 6e 2d 7a 65 72 6f 20 65 72 72 6e 6f 3a 20 22  on-zero errno: "
21fc0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
21fd0 20 20 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74         Tcl_GetSt
21fe0 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 54 63 6c 5f  ringFromObj(Tcl_
21ff0 4e 65 77 49 6e 74 4f 62 6a 28 69 41 72 67 29 2c  NewIntObj(iArg),
22000 20 30 29 2c 20 22 20 22 2c 20 30 29 3b 0a 20 20   0), " ", 0);.  
22010 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
22020 4f 52 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  OR;.  }.  return
22030 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
22040 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20 66 69  .** tclcmd:   fi
22050 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e 6b  le_control_chunk
22060 73 69 7a 65 5f 74 65 73 74 20 44 42 20 44 42 4e  size_test DB DBN
22070 41 4d 45 20 53 49 5a 45 0a 2a 2a 0a 2a 2a 20 54  AME SIZE.**.** T
22080 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20  his TCL command 
22090 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33  runs the sqlite3
220a0 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e  _file_control in
220b0 74 65 72 66 61 63 65 20 61 6e 64 0a 2a 2a 20 76  terface and.** v
220c0 65 72 69 66 69 65 73 20 63 6f 72 72 65 63 74 20  erifies correct 
220d0 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65  operation of the
220e0 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c 4f 43 4b   SQLITE_GET_LOCK
220f0 50 52 4f 58 59 46 49 4c 45 20 61 6e 64 0a 2a 2a  PROXYFILE and.**
22100 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c 4f 43 4b   SQLITE_SET_LOCK
22110 50 52 4f 58 59 46 49 4c 45 20 76 65 72 62 73 2e  PROXYFILE verbs.
22120 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66  .*/.static int f
22130 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 63 68 75 6e  ile_control_chun
22140 6b 73 69 7a 65 5f 74 65 73 74 28 0a 20 20 43 6c  ksize_test(.  Cl
22150 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
22160 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
22170 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
22180 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
22190 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
221a0 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
221b0 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
221c0 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
221d0 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
221e0 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
221f0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
22200 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
22210 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
22220 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
22230 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
22240 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 53 69 7a  */.){.  int nSiz
22250 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
22260 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 63          /* New c
22270 68 75 6e 6b 20 73 69 7a 65 20 2a 2f 0a 20 20 63  hunk size */.  c
22280 68 61 72 20 2a 7a 44 62 3b 20 20 20 20 20 20 20  har *zDb;       
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
222a0 2a 20 44 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e  * Db name ("main
222b0 22 2c 20 22 74 65 6d 70 22 20 65 74 63 2e 29 20  ", "temp" etc.) 
222c0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
222d0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
222e0 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
222f0 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74   handle */.  int
22300 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
22310 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22320 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72  file_control() r
22330 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
22340 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a   if( objc!=4 ){.
22350 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
22360 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
22370 6f 62 6a 76 2c 20 22 44 42 20 44 42 4e 41 4d 45  objv, "DB DBNAME
22380 20 53 49 5a 45 22 29 3b 0a 20 20 20 20 72 65 74   SIZE");.    ret
22390 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
223a0 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f   }.  if( getDbPo
223b0 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63  inter(interp, Tc
223c0 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76  l_GetString(objv
223d0 5b 31 5d 29 2c 20 26 64 62 29 20 0a 20 20 20 7c  [1]), &db) .   |
223e0 7c 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  | Tcl_GetIntFrom
223f0 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
22400 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20 29  [3], &nSize).  )
22410 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
22420 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44 62  ERROR;.  }.  zDb
22430 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67   = Tcl_GetString
22440 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66 28  (objv[2]);.  if(
22450 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29 20   zDb[0]=='\0' ) 
22460 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 72  zDb = NULL;..  r
22470 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
22480 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44 62  _control(db, zDb
22490 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 43  , SQLITE_FCNTL_C
224a0 48 55 4e 4b 5f 53 49 5a 45 2c 20 28 76 6f 69 64  HUNK_SIZE, (void
224b0 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66   *)&nSize);.  if
224c0 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
224d0 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
224e0 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
224f0 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
22500 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
22510 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
22520 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
22530 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
22540 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
22550 6e 74 72 6f 6c 5f 73 69 7a 65 68 69 6e 74 5f 74  ntrol_sizehint_t
22560 65 73 74 20 44 42 20 44 42 4e 41 4d 45 20 53 49  est DB DBNAME SI
22570 5a 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 54 43  ZE.**.** This TC
22580 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73 20 74  L command runs t
22590 68 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  he sqlite3_file_
225a0 63 6f 6e 74 72 6f 6c 20 69 6e 74 65 72 66 61 63  control interfac
225b0 65 20 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  e .** with SQLIT
225c0 45 5f 46 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e  E_FCNTL_SIZE_HIN
225d0 54 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  T.*/.static int 
225e0 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73 69 7a  file_control_siz
225f0 65 68 69 6e 74 5f 74 65 73 74 28 0a 20 20 43 6c  ehint_test(.  Cl
22600 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44  ientData clientD
22610 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20  ata, /* Pointer 
22620 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c  to sqlite3_enabl
22630 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a  e_XXX function *
22640 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a  /.  Tcl_Interp *
22650 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68  interp,    /* Th
22660 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65  e TCL interprete
22670 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74  r that invoked t
22680 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  his command */. 
22690 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20   int objc,      
226a0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
226b0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a  r of arguments *
226c0 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  /.  Tcl_Obj *CON
226d0 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f  ST objv[]  /* Co
226e0 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
226f0 2a 2f 0a 29 7b 0a 20 20 54 63 6c 5f 57 69 64 65  */.){.  Tcl_Wide
22700 49 6e 74 20 6e 53 69 7a 65 3b 20 20 20 20 20 20  Int nSize;      
22710 20 20 20 20 20 20 20 20 2f 2a 20 48 69 6e 74 65          /* Hinte
22720 64 20 73 69 7a 65 20 2a 2f 0a 20 20 63 68 61 72  d size */.  char
22730 20 2a 7a 44 62 3b 20 20 20 20 20 20 20 20 20 20   *zDb;          
22740 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
22750 62 20 6e 61 6d 65 20 28 22 6d 61 69 6e 22 2c 20  b name ("main", 
22760 22 74 65 6d 70 22 20 65 74 63 2e 29 20 2a 2f 0a  "temp" etc.) */.
22770 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
22780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22790 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
227a0 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ndle */.  int rc
227b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
227c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 69 6c            /* fil
227d0 65 5f 63 6f 6e 74 72 6f 6c 28 29 20 72 65 74 75  e_control() retu
227e0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
227f0 28 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20  ( objc!=4 ){.   
22800 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
22810 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
22820 76 2c 20 22 44 42 20 44 42 4e 41 4d 45 20 53 49  v, "DB DBNAME SI
22830 5a 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ZE");.    return
22840 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
22850 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
22860 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
22870 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
22880 29 2c 20 26 64 62 29 20 0a 20 20 20 7c 7c 20 54  ), &db) .   || T
22890 63 6c 5f 47 65 74 57 69 64 65 49 6e 74 46 72 6f  cl_GetWideIntFro
228a0 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a  mObj(interp, obj
228b0 76 5b 33 5d 2c 20 26 6e 53 69 7a 65 29 0a 20 20  v[3], &nSize).  
228c0 29 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ){.   return TCL
228d0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 7a 44  _ERROR;.  }.  zD
228e0 62 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  b = Tcl_GetStrin
228f0 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20 20 69 66  g(objv[2]);.  if
22900 28 20 7a 44 62 5b 30 5d 3d 3d 27 5c 30 27 20 29  ( zDb[0]=='\0' )
22910 20 7a 44 62 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20   zDb = NULL;..  
22920 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
22930 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a 44  e_control(db, zD
22940 62 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  b, SQLITE_FCNTL_
22950 53 49 5a 45 5f 48 49 4e 54 2c 20 28 76 6f 69 64  SIZE_HINT, (void
22960 20 2a 29 26 6e 53 69 7a 65 29 3b 0a 20 20 69 66   *)&nSize);.  if
22970 28 20 72 63 20 29 7b 0a 20 20 20 20 54 63 6c 5f  ( rc ){.    Tcl_
22980 53 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  SetResult(interp
22990 2c 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  , (char *)sqlite
229a0 33 45 72 72 4e 61 6d 65 28 72 63 29 2c 20 54 43  3ErrName(rc), TC
229b0 4c 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 72  L_STATIC);.    r
229c0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
229d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 54 43  .  }.  return TC
229e0 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  L_OK;.}../*.** t
229f0 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
22a00 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f 78 79 5f  ntrol_lockproxy_
22a10 74 65 73 74 20 44 42 20 50 57 44 0a 2a 2a 0a 2a  test DB PWD.**.*
22a20 2a 20 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61  * This TCL comma
22a30 6e 64 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69  nd runs the sqli
22a40 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
22a50 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64 0a 2a   interface and.*
22a60 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72 72 65  * verifies corre
22a70 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66 20  ct operation of 
22a80 74 68 65 20 53 51 4c 49 54 45 5f 47 45 54 5f 4c  the SQLITE_GET_L
22a90 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 61 6e 64  OCKPROXYFILE and
22aa0 0a 2a 2a 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  .** SQLITE_SET_L
22ab0 4f 43 4b 50 52 4f 58 59 46 49 4c 45 20 76 65 72  OCKPROXYFILE ver
22ac0 62 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  bs..*/.static in
22ad0 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c  t file_control_l
22ae0 6f 63 6b 70 72 6f 78 79 5f 74 65 73 74 28 0a 20  ockproxy_test(. 
22af0 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65   ClientData clie
22b00 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74  ntData, /* Point
22b10 65 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e  er to sqlite3_en
22b20 61 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f  able_XXX functio
22b30 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72  n */.  Tcl_Inter
22b40 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a  p *interp,    /*
22b50 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72   The TCL interpr
22b60 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65  eter that invoke
22b70 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a  d this command *
22b80 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20  /.  int objc,   
22b90 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
22ba0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
22bb0 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a  s */.  Tcl_Obj *
22bc0 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a  CONST objv[]  /*
22bd0 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
22be0 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ts */.){.  sqlit
22bf0 65 33 20 2a 64 62 3b 0a 20 20 0a 20 20 69 66 28  e3 *db;.  .  if(
22c00 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20   objc!=3 ){.    
22c10 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
22c20 28 69 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20  (interp, "wrong 
22c30 23 20 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62  # args: should b
22c40 65 20 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  e \"",.         
22c50 20 20 20 20 20 20 20 20 20 20 20 20 54 63 6c 5f              Tcl_
22c60 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
22c70 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
22c80 44 42 20 50 57 44 22 2c 20 30 29 3b 0a 20 20 20  DB PWD", 0);.   
22c90 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
22ca0 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
22cb0 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
22cc0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
22cd0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
22ce0 7b 0a 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  {.   return TCL_
22cf0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a 23 69  ERROR;.  }.  .#i
22d00 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
22d10 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49 4e 47  E_ENABLE_LOCKING
22d20 5f 53 54 59 4c 45 29 0a 23 20 20 69 66 20 64 65  _STYLE).#  if de
22d30 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29  fined(__APPLE__)
22d40 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53 51 4c  .#    define SQL
22d50 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
22d60 4e 47 5f 53 54 59 4c 45 20 31 0a 23 20 20 65 6c  NG_STYLE 1.#  el
22d70 73 65 0a 23 20 20 20 20 64 65 66 69 6e 65 20 53  se.#    define S
22d80 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43  QLITE_ENABLE_LOC
22d90 4b 49 4e 47 5f 53 54 59 4c 45 20 30 0a 23 20 20  KING_STYLE 0.#  
22da0 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 23 69 66  endif.#endif.#if
22db0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
22dc0 4f 43 4b 49 4e 47 5f 53 54 59 4c 45 20 26 26 20  OCKING_STYLE && 
22dd0 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
22de0 5f 29 0a 20 20 7b 0a 20 20 20 20 63 68 61 72 20  _).  {.    char 
22df0 2a 74 65 73 74 50 61 74 68 3b 0a 20 20 20 20 69  *testPath;.    i
22e00 6e 74 20 72 63 3b 0a 20 20 20 20 69 6e 74 20 6e  nt rc;.    int n
22e10 50 77 64 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  Pwd;.    const c
22e20 68 61 72 20 2a 7a 50 77 64 3b 0a 20 20 20 20 63  har *zPwd;.    c
22e30 68 61 72 20 70 72 6f 78 79 50 61 74 68 5b 34 30  har proxyPath[40
22e40 30 5d 3b 0a 20 20 20 20 0a 20 20 20 20 7a 50 77  0];.    .    zPw
22e50 64 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  d = Tcl_GetStrin
22e60 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 5d  gFromObj(objv[2]
22e70 2c 20 26 6e 50 77 64 29 3b 0a 20 20 20 20 69 66  , &nPwd);.    if
22e80 28 20 73 69 7a 65 6f 66 28 70 72 6f 78 79 50 61  ( sizeof(proxyPa
22e90 74 68 29 3c 6e 50 77 64 2b 32 30 20 29 7b 0a 20  th)<nPwd+20 ){. 
22ea0 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52       Tcl_AppendR
22eb0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 50  esult(interp, "P
22ec0 57 44 20 74 6f 6f 20 62 69 67 22 2c 20 28 76 6f  WD too big", (vo
22ed0 69 64 2a 29 30 29 3b 0a 20 20 20 20 20 20 72 65  id*)0);.      re
22ee0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
22ef0 20 20 20 20 7d 0a 20 20 20 20 73 70 72 69 6e 74      }.    sprint
22f00 66 28 70 72 6f 78 79 50 61 74 68 2c 20 22 25 73  f(proxyPath, "%s
22f10 2f 74 65 73 74 2e 70 72 6f 78 79 22 2c 20 7a 50  /test.proxy", zP
22f20 77 64 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  wd);.    rc = sq
22f30 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72  lite3_file_contr
22f40 6f 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c  ol(db, NULL, SQL
22f50 49 54 45 5f 53 45 54 5f 4c 4f 43 4b 50 52 4f 58  ITE_SET_LOCKPROX
22f60 59 46 49 4c 45 2c 20 70 72 6f 78 79 50 61 74 68  YFILE, proxyPath
22f70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
22f80 0a 20 20 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  .      Tcl_SetOb
22f90 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
22fa0 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
22fb0 29 29 3b 20 0a 20 20 20 20 20 20 72 65 74 75 72  )); .      retur
22fc0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20  n TCL_ERROR;.   
22fd0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
22fe0 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
22ff0 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49 54  (db, NULL, SQLIT
23000 45 5f 47 45 54 5f 4c 4f 43 4b 50 52 4f 58 59 46  E_GET_LOCKPROXYF
23010 49 4c 45 2c 20 26 74 65 73 74 50 61 74 68 29 3b  ILE, &testPath);
23020 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70  .    if( strncmp
23030 28 70 72 6f 78 79 50 61 74 68 2c 74 65 73 74 50  (proxyPath,testP
23040 61 74 68 2c 31 31 29 20 29 7b 0a 20 20 20 20 20  ath,11) ){.     
23050 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c   Tcl_AppendResul
23060 74 28 69 6e 74 65 72 70 2c 20 22 4c 6f 63 6b 20  t(interp, "Lock 
23070 70 72 6f 78 79 20 66 69 6c 65 20 64 69 64 20 6e  proxy file did n
23080 6f 74 20 6d 61 74 63 68 20 74 68 65 20 22 0a 20  ot match the ". 
23090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
230a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 70                "p
230b0 72 65 76 69 6f 75 73 6c 79 20 61 73 73 69 67 6e  reviously assign
230c0 65 64 20 76 61 6c 75 65 22 2c 20 30 29 3b 0a 20  ed value", 0);. 
230d0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
230e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20  ERROR;.    }.   
230f0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
23100 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
23110 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
23120 77 49 6e 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20  wIntObj(rc));.  
23130 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
23140 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RROR;.    }.    
23150 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
23160 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
23170 4c 4c 2c 20 53 51 4c 49 54 45 5f 53 45 54 5f 4c  LL, SQLITE_SET_L
23180 4f 43 4b 50 52 4f 58 59 46 49 4c 45 2c 20 70 72  OCKPROXYFILE, pr
23190 6f 78 79 50 61 74 68 29 3b 0a 20 20 20 20 69 66  oxyPath);.    if
231a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 54 63  ( rc ){.      Tc
231b0 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
231c0 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e  nterp, Tcl_NewIn
231d0 74 4f 62 6a 28 72 63 29 29 3b 0a 20 20 20 20 20  tObj(rc));.     
231e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
231f0 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  R;.    }.  }.#en
23200 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  dif.  return TCL
23210 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _OK;  .}../*.** 
23220 74 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63  tclcmd:   file_c
23230 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f 61 76 5f  ontrol_win32_av_
23240 72 65 74 72 79 20 44 42 20 20 4e 52 45 54 52 59  retry DB  NRETRY
23250 20 20 44 45 4c 41 59 0a 2a 2a 0a 2a 2a 20 54 68    DELAY.**.** Th
23260 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72  is TCL command r
23270 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f  uns the sqlite3_
23280 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74  file_control int
23290 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74  erface with.** t
232a0 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f  he SQLITE_FCNTL_
232b0 57 49 4e 33 32 5f 41 56 5f 52 45 54 52 59 20 6f  WIN32_AV_RETRY o
232c0 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  pcode..*/.static
232d0 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f   int file_contro
232e0 6c 5f 77 69 6e 33 32 5f 61 76 5f 72 65 74 72 79  l_win32_av_retry
232f0 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
23300 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
23310 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
23320 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
23330 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
23340 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
23350 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
23360 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
23370 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
23380 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
23390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
233a0 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
233b0 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
233c0 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
233d0 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
233e0 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
233f0 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74  lite3 *db;.  int
23400 20 72 63 3b 0a 20 20 69 6e 74 20 61 5b 32 5d 3b   rc;.  int a[2];
23410 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
23420 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 34 20 29  .  if( objc!=4 )
23430 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
23440 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
23450 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
23460 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
23470 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
23480 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
23490 5d 2c 20 30 29 2c 20 22 20 44 42 20 4e 52 45 54  ], 0), " DB NRET
234a0 52 59 20 44 45 4c 41 59 22 2c 20 30 29 3b 0a 20  RY DELAY", 0);. 
234b0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
234c0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
234d0 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
234e0 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
234f0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
23500 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54   ){.    return T
23510 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  CL_ERROR;.  }.  
23520 69 66 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72  if( Tcl_GetIntFr
23530 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62  omObj(interp, ob
23540 6a 76 5b 32 5d 2c 20 26 61 5b 30 5d 29 20 29 20  jv[2], &a[0]) ) 
23550 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23560 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74 49  ;.  if( Tcl_GetI
23570 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70  ntFromObj(interp
23580 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 61 5b 31 5d  , objv[3], &a[1]
23590 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
235a0 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
235b0 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
235c0 6c 28 64 62 2c 20 4e 55 4c 4c 2c 20 53 51 4c 49  l(db, NULL, SQLI
235d0 54 45 5f 46 43 4e 54 4c 5f 57 49 4e 33 32 5f 41  TE_FCNTL_WIN32_A
235e0 56 5f 52 45 54 52 59 2c 20 28 76 6f 69 64 2a 29  V_RETRY, (void*)
235f0 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  a);.  sqlite3_sn
23600 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
23610 2c 20 7a 2c 20 22 25 64 20 25 64 20 25 64 22 2c  , z, "%d %d %d",
23620 20 72 63 2c 20 61 5b 30 5d 2c 20 61 5b 31 5d 29   rc, a[0], a[1])
23630 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65  ;.  Tcl_AppendRe
23640 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20  sult(interp, z, 
23650 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74  (char*)0);.  ret
23660 75 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a  urn TCL_OK;  .}.
23670 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
23680 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 70 65   file_control_pe
23690 72 73 69 73 74 5f 77 61 6c 20 44 42 20 50 45 52  rsist_wal DB PER
236a0 53 49 53 54 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20  SIST-FLAG.**.** 
236b0 54 68 69 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64  This TCL command
236c0 20 72 75 6e 73 20 74 68 65 20 73 71 6c 69 74 65   runs the sqlite
236d0 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69  3_file_control i
236e0 6e 74 65 72 66 61 63 65 20 77 69 74 68 0a 2a 2a  nterface with.**
236f0 20 74 68 65 20 53 51 4c 49 54 45 5f 46 43 4e 54   the SQLITE_FCNT
23700 4c 5f 50 45 52 53 49 53 54 5f 57 41 4c 20 6f 70  L_PERSIST_WAL op
23710 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
23720 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  int file_control
23730 5f 70 65 72 73 69 73 74 5f 77 61 6c 28 0a 20 20  _persist_wal(.  
23740 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
23750 74 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65  tData, /* Pointe
23760 72 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61  r to sqlite3_ena
23770 62 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e  ble_XXX function
23780 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70   */.  Tcl_Interp
23790 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20   *interp,    /* 
237a0 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65  The TCL interpre
237b0 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64  ter that invoked
237c0 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f   this command */
237d0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20  .  int objc,    
237e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
237f0 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
23800 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43   */.  Tcl_Obj *C
23810 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20  ONST objv[]  /* 
23820 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
23830 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  s */.){.  sqlite
23840 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b  3 *db;.  int rc;
23850 0a 20 20 69 6e 74 20 62 50 65 72 73 69 73 74 3b  .  int bPersist;
23860 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 5d 3b 0a  .  char z[100];.
23870 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 29  .  if( objc!=3 )
23880 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
23890 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
238a0 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
238b0 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
238c0 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
238d0 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
238e0 5d 2c 20 30 29 2c 20 22 20 44 42 20 46 4c 41 47  ], 0), " DB FLAG
238f0 22 2c 20 30 29 3b 0a 20 20 20 20 72 65 74 75 72  ", 0);.    retur
23900 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
23910 0a 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e  .  if( getDbPoin
23920 74 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ter(interp, Tcl_
23930 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31  GetString(objv[1
23940 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20  ]), &db) ){.    
23950 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
23960 3b 0a 20 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f  ;.  }.  if( Tcl_
23970 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e  GetIntFromObj(in
23980 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d 2c 20 26  terp, objv[2], &
23990 62 50 65 72 73 69 73 74 29 20 29 20 72 65 74 75  bPersist) ) retu
239a0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
239b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c  rc = sqlite3_fil
239c0 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 4e 55  e_control(db, NU
239d0 4c 4c 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  LL, SQLITE_FCNTL
239e0 5f 50 45 52 53 49 53 54 5f 57 41 4c 2c 20 28 76  _PERSIST_WAL, (v
239f0 6f 69 64 2a 29 26 62 50 65 72 73 69 73 74 29 3b  oid*)&bPersist);
23a00 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
23a10 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
23a20 2c 20 22 25 64 20 25 64 22 2c 20 72 63 2c 20 62  , "%d %d", rc, b
23a30 50 65 72 73 69 73 74 29 3b 0a 20 20 54 63 6c 5f  Persist);.  Tcl_
23a40 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
23a50 65 72 70 2c 20 7a 2c 20 28 63 68 61 72 2a 29 30  erp, z, (char*)0
23a60 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
23a70 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74  OK;  .}../*.** t
23a80 63 6c 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f  clcmd:   file_co
23a90 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f  ntrol_powersafe_
23aa0 6f 76 65 72 77 72 69 74 65 20 44 42 20 50 53 4f  overwrite DB PSO
23ab0 57 2d 46 4c 41 47 0a 2a 2a 0a 2a 2a 20 54 68 69  W-FLAG.**.** Thi
23ac0 73 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75  s TCL command ru
23ad0 6e 73 20 74 68 65 20 73 71 6c 69 74 65 33 5f 66  ns the sqlite3_f
23ae0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 20 69 6e 74 65  ile_control inte
23af0 72 66 61 63 65 20 77 69 74 68 0a 2a 2a 20 74 68  rface with.** th
23b00 65 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50  e SQLITE_FCNTL_P
23b10 4f 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49  OWERSAFE_OVERWRI
23b20 54 45 20 6f 70 63 6f 64 65 2e 0a 2a 2f 0a 73 74  TE opcode..*/.st
23b30 61 74 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f  atic int file_co
23b40 6e 74 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f  ntrol_powersafe_
23b50 6f 76 65 72 77 72 69 74 65 28 0a 20 20 43 6c 69  overwrite(.  Cli
23b60 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
23b70 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74  ta, /* Pointer t
23b80 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65  o sqlite3_enable
23b90 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  _XXX function */
23ba0 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
23bb0 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
23bc0 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
23bd0 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
23be0 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
23bf0 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
23c00 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
23c10 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
23c20 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
23c30 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
23c40 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
23c50 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
23c60 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
23c70 69 6e 74 20 62 3b 0a 20 20 63 68 61 72 20 7a 5b  int b;.  char z[
23c80 31 30 30 5d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a  100];..  if( obj
23c90 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c 5f  c!=3 ){.    Tcl_
23ca0 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74  AppendResult(int
23cb0 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61 72  erp, "wrong # ar
23cc0 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c 22  gs: should be \"
23cd0 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f 47  ",.        Tcl_G
23ce0 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28  etStringFromObj(
23cf0 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20 44  objv[0], 0), " D
23d00 42 20 46 4c 41 47 22 2c 20 30 29 3b 0a 20 20 20  B FLAG", 0);.   
23d10 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
23d20 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  R;.  }.  if( get
23d30 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
23d40 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
23d50 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29  objv[1]), &db) )
23d60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  {.    return TCL
23d70 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
23d80 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
23d90 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
23da0 5b 32 5d 2c 20 26 62 29 20 29 20 72 65 74 75 72  [2], &b) ) retur
23db0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72  n TCL_ERROR;.  r
23dc0 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  c = sqlite3_file
23dd0 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 4e 55 4c 4c  _control(db,NULL
23de0 2c 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 50 4f  ,SQLITE_FCNTL_PO
23df0 57 45 52 53 41 46 45 5f 4f 56 45 52 57 52 49 54  WERSAFE_OVERWRIT
23e00 45 2c 28 76 6f 69 64 2a 29 26 62 29 3b 0a 20 20  E,(void*)&b);.  
23e10 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
23e20 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
23e30 25 64 20 25 64 22 2c 20 72 63 2c 20 62 29 3b 0a  %d %d", rc, b);.
23e40 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75    Tcl_AppendResu
23e50 6c 74 28 69 6e 74 65 72 70 2c 20 7a 2c 20 28 63  lt(interp, z, (c
23e60 68 61 72 2a 29 30 29 3b 0a 20 20 72 65 74 75 72  har*)0);.  retur
23e70 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 0a  n TCL_OK;  .}...
23e80 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 20  /*.** tclcmd:   
23e90 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76 66 73  file_control_vfs
23ea0 6e 61 6d 65 20 44 42 20 3f 41 55 58 44 42 3f 0a  name DB ?AUXDB?.
23eb0 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73  **.** Return a s
23ec0 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72  tring that descr
23ed0 69 62 65 73 20 74 68 65 20 73 74 61 63 6b 20 6f  ibes the stack o
23ee0 66 20 56 46 53 65 73 2e 0a 2a 2f 0a 73 74 61 74  f VFSes..*/.stat
23ef0 69 63 20 69 6e 74 20 66 69 6c 65 5f 63 6f 6e 74  ic int file_cont
23f00 72 6f 6c 5f 76 66 73 6e 61 6d 65 28 0a 20 20 43  rol_vfsname(.  C
23f10 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74  lientData client
23f20 44 61 74 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72  Data, /* Pointer
23f30 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 6e 61 62   to sqlite3_enab
23f40 6c 65 5f 58 58 58 20 66 75 6e 63 74 69 6f 6e 20  le_XXX function 
23f50 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  */.  Tcl_Interp 
23f60 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54  *interp,    /* T
23f70 68 65 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74  he TCL interpret
23f80 65 72 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20  er that invoked 
23f90 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a  this command */.
23fa0 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20    int objc,     
23fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
23fc0 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
23fd0 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f  */.  Tcl_Obj *CO
23fe0 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43  NST objv[]  /* C
23ff0 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
24000 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
24010 20 2a 64 62 3b 0a 20 20 63 6f 6e 73 74 20 63 68   *db;.  const ch
24020 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 22 6d  ar *zDbName = "m
24030 61 69 6e 22 3b 0a 20 20 63 68 61 72 20 2a 7a 56  ain";.  char *zV
24040 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 0a 20 20 69  fsName = 0;..  i
24050 66 28 20 6f 62 6a 63 21 3d 32 20 26 26 20 6f 62  f( objc!=2 && ob
24060 6a 63 21 3d 33 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=3 ){.    Tcl
24070 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e  _AppendResult(in
24080 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20 61  terp, "wrong # a
24090 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20 5c  rgs: should be \
240a0 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c 5f  "",.        Tcl_
240b0 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
240c0 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22 20  (objv[0], 0), " 
240d0 44 42 20 3f 41 55 58 44 42 3f 22 2c 20 30 29 3b  DB ?AUXDB?", 0);
240e0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
240f0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
24100 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e   getDbPointer(in
24110 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
24120 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64  ing(objv[1]), &d
24130 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
24140 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
24150 20 20 69 66 28 20 6f 62 6a 63 3d 3d 33 20 29 7b    if( objc==3 ){
24160 0a 20 20 20 20 7a 44 62 4e 61 6d 65 20 3d 20 54  .    zDbName = T
24170 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
24180 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  v[2]);.  }.  sql
24190 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f  ite3_file_contro
241a0 6c 28 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53  l(db, zDbName, S
241b0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 4e  QLITE_FCNTL_VFSN
241c0 41 4d 45 2c 28 76 6f 69 64 2a 29 26 7a 56 66 73  AME,(void*)&zVfs
241d0 4e 61 6d 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70  Name);.  Tcl_App
241e0 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
241f0 2c 20 7a 56 66 73 4e 61 6d 65 2c 20 28 63 68 61  , zVfsName, (cha
24200 72 2a 29 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  r*)0);.  sqlite3
24210 5f 66 72 65 65 28 7a 56 66 73 4e 61 6d 65 29 3b  _free(zVfsName);
24220 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
24230 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c  ;  .}../*.** tcl
24240 63 6d 64 3a 20 20 20 66 69 6c 65 5f 63 6f 6e 74  cmd:   file_cont
24250 72 6f 6c 5f 74 65 6d 70 66 69 6c 65 6e 61 6d 65  rol_tempfilename
24260 20 44 42 20 3f 41 55 58 44 42 3f 0a 2a 2a 0a 2a   DB ?AUXDB?.**.*
24270 2a 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e  * Return a strin
24280 67 20 74 68 61 74 20 69 73 20 61 20 74 65 6d 70  g that is a temp
24290 6f 72 61 72 79 20 66 69 6c 65 6e 61 6d 65 0a 2a  orary filename.*
242a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 66 69 6c  /.static int fil
242b0 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69  e_control_tempfi
242c0 6c 65 6e 61 6d 65 28 0a 20 20 43 6c 69 65 6e 74  lename(.  Client
242d0 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c  Data clientData,
242e0 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
242f0 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58  qlite3_enable_XX
24300 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  X function */.  
24310 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
24320 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43  rp,    /* The TC
24330 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68  L interpreter th
24340 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20  at invoked this 
24350 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
24360 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20   objc,          
24370 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
24380 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
24390 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f  Tcl_Obj *CONST o
243a0 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e  bjv[]  /* Comman
243b0 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29  d arguments */.)
243c0 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  {.  sqlite3 *db;
243d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
243e0 44 62 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  DbName = "main";
243f0 0a 20 20 63 68 61 72 20 2a 7a 54 4e 61 6d 65 20  .  char *zTName 
24400 3d 20 30 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63  = 0;..  if( objc
24410 21 3d 32 20 26 26 20 6f 62 6a 63 21 3d 33 20 29  !=2 && objc!=3 )
24420 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
24430 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
24440 77 72 6f 6e 67 20 23 20 61 72 67 73 3a 20 73 68  wrong # args: sh
24450 6f 75 6c 64 20 62 65 20 5c 22 22 2c 0a 20 20 20  ould be \"",.   
24460 20 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69       Tcl_GetStri
24470 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 30  ngFromObj(objv[0
24480 5d 2c 20 30 29 2c 20 22 20 44 42 20 3f 41 55 58  ], 0), " DB ?AUX
24490 44 42 3f 22 2c 20 30 29 3b 0a 20 20 20 20 72 65  DB?", 0);.    re
244a0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
244b0 20 20 7d 0a 20 20 69 66 28 20 67 65 74 44 62 50    }.  if( getDbP
244c0 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c 20 54  ointer(interp, T
244d0 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
244e0 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b 0a 20  v[1]), &db) ){. 
244f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
24500 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6f  ROR;.  }.  if( o
24510 62 6a 63 3d 3d 33 20 29 7b 0a 20 20 20 20 7a 44  bjc==3 ){.    zD
24520 62 4e 61 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53  bName = Tcl_GetS
24530 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a  tring(objv[2]);.
24540 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
24550 6c 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 7a  le_control(db, z
24560 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46  DbName, SQLITE_F
24570 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
24580 45 2c 20 28 76 6f 69 64 2a 29 26 7a 54 4e 61 6d  E, (void*)&zTNam
24590 65 29 3b 0a 20 20 54 63 6c 5f 41 70 70 65 6e 64  e);.  Tcl_Append
245a0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 7a  Result(interp, z
245b0 54 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29  TName, (char*)0)
245c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
245d0 28 7a 54 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  (zTName);.  retu
245e0 72 6e 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a  rn TCL_OK;  .}..
245f0 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20  ./*.** tclcmd:  
24600 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 6c 69 73   sqlite3_vfs_lis
24610 74 0a 2a 2a 0a 2a 2a 20 20 20 52 65 74 75 72 6e  t.**.**   Return
24620 20 61 20 74 63 6c 20 6c 69 73 74 20 63 6f 6e 74   a tcl list cont
24630 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 73  aining the names
24640 20 6f 66 20 61 6c 6c 20 72 65 67 69 73 74 65 72   of all register
24650 65 64 20 76 66 73 27 73 2e 0a 2a 2f 0a 73 74 61  ed vfs's..*/.sta
24660 74 69 63 20 69 6e 74 20 76 66 73 5f 6c 69 73 74  tic int vfs_list
24670 28 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63  (.  ClientData c
24680 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a 20 50 6f  lientData, /* Po
24690 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 33  inter to sqlite3
246a0 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66 75 6e 63  _enable_XXX func
246b0 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e  tion */.  Tcl_In
246c0 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20  terp *interp,   
246d0 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65   /* The TCL inte
246e0 72 70 72 65 74 65 72 20 74 68 61 74 20 69 6e 76  rpreter that inv
246f0 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e  oked this comman
24700 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  d */.  int objc,
24710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24720 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
24730 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62  ents */.  Tcl_Ob
24740 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20  j *CONST objv[] 
24750 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
24760 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71  ments */.){.  sq
24770 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b  lite3_vfs *pVfs;
24780 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74  .  Tcl_Obj *pRet
24790 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
247a0 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 31 20 29  .  if( objc!=1 )
247b0 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e  {.    Tcl_WrongN
247c0 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
247d0 2c 20 6f 62 6a 76 2c 20 22 22 29 3b 0a 20 20 20  , objv, "");.   
247e0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
247f0 52 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 70 56 66  R;.  }.  for(pVf
24800 73 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  s=sqlite3_vfs_fi
24810 6e 64 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66  nd(0); pVfs; pVf
24820 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a  s=pVfs->pNext){.
24830 20 20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41      Tcl_ListObjA
24840 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74  ppendElement(int
24850 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e  erp, pRet, Tcl_N
24860 65 77 53 74 72 69 6e 67 4f 62 6a 28 70 56 66 73  ewStringObj(pVfs
24870 2d 3e 7a 4e 61 6d 65 2c 20 2d 31 29 29 3b 0a 20  ->zName, -1));. 
24880 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52   }.  Tcl_SetObjR
24890 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70 52  esult(interp, pR
248a0 65 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43  et);.  return TC
248b0 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a  L_OK;  .}../*.**
248c0 20 74 63 6c 63 6d 64 3a 20 20 20 73 71 6c 69 74   tclcmd:   sqlit
248d0 65 33 5f 6c 69 6d 69 74 20 44 42 20 49 44 20 56  e3_limit DB ID V
248e0 41 4c 55 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ALUE.**.** This 
248f0 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 72 75 6e 73  TCL command runs
24900 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 6d   the sqlite3_lim
24910 69 74 20 69 6e 74 65 72 66 61 63 65 20 61 6e 64  it interface and
24920 0a 2a 2a 20 76 65 72 69 66 69 65 73 20 63 6f 72  .** verifies cor
24930 72 65 63 74 20 6f 70 65 72 61 74 69 6f 6e 20 6f  rect operation o
24940 66 20 74 68 65 20 73 61 6d 65 2e 0a 2a 2f 0a 73  f the same..*/.s
24950 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f 6c  tatic int test_l
24960 69 6d 69 74 28 0a 20 20 43 6c 69 65 6e 74 44 61  imit(.  ClientDa
24970 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f  ta clientData, /
24980 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c  * Pointer to sql
24990 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20  ite3_enable_XXX 
249a0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63  function */.  Tc
249b0 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
249c0 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20  ,    /* The TCL 
249d0 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74  interpreter that
249e0 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f   invoked this co
249f0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f  mmand */.  int o
24a00 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  bjc,            
24a10 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
24a20 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63  rguments */.  Tc
24a30 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a  l_Obj *CONST obj
24a40 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20  v[]  /* Command 
24a50 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a  arguments */.){.
24a60 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20    sqlite3 *db;. 
24a70 20 69 6e 74 20 72 63 3b 0a 20 20 73 74 61 74 69   int rc;.  stati
24a80 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
24a90 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d  .     char *zNam
24aa0 65 3b 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a  e;.     int id;.
24ab0 20 20 7d 20 61 49 64 5b 5d 20 3d 20 7b 0a 20 20    } aId[] = {.  
24ac0 20 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49    { "SQLITE_LIMI
24ad0 54 5f 4c 45 4e 47 54 48 22 2c 20 20 20 20 20 20  T_LENGTH",      
24ae0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
24af0 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20  IMIT_LENGTH     
24b00 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
24b10 20 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54   { "SQLITE_LIMIT
24b20 5f 53 51 4c 5f 4c 45 4e 47 54 48 22 2c 20 20 20  _SQL_LENGTH",   
24b30 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
24b40 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20  MIT_SQL_LENGTH  
24b50 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
24b60 7b 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  { "SQLITE_LIMIT_
24b70 43 4f 4c 55 4d 4e 22 2c 20 20 20 20 20 20 20 20  COLUMN",        
24b80 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
24b90 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20  IT_COLUMN       
24ba0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b          },.    {
24bb0 20 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45   "SQLITE_LIMIT_E
24bc0 58 50 52 5f 44 45 50 54 48 22 2c 20 20 20 20 20  XPR_DEPTH",     
24bd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
24be0 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20  T_EXPR_DEPTH    
24bf0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20         },.    { 
24c00 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  "SQLITE_LIMIT_CO
24c10 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 22 2c 20  MPOUND_SELECT", 
24c20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
24c30 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
24c40 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
24c50 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
24c60 45 5f 4f 50 22 2c 20 20 20 20 20 20 20 20 20 20  E_OP",          
24c70 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
24c80 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20 20  VDBE_OP         
24c90 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53       },.    { "S
24ca0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
24cb0 54 49 4f 4e 5f 41 52 47 22 2c 20 20 20 20 20 20  TION_ARG",      
24cc0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46    SQLITE_LIMIT_F
24cd0 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20 20 20  UNCTION_ARG     
24ce0 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51      },.    { "SQ
24cf0 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
24d00 48 45 44 22 2c 20 20 20 20 20 20 20 20 20 20 20  HED",           
24d10 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54   SQLITE_LIMIT_AT
24d20 54 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20  TACHED          
24d30 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c     },.    { "SQL
24d40 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
24d50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 22 2c 20  ATTERN_LENGTH", 
24d60 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b  SQLITE_LIMIT_LIK
24d70 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
24d80 20 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49    },.    { "SQLI
24d90 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
24da0 45 5f 4e 55 4d 42 45 52 22 2c 20 20 20 20 20 53  E_NUMBER",     S
24db0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49  QLITE_LIMIT_VARI
24dc0 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20 20  ABLE_NUMBER     
24dd0 20 7d 2c 0a 20 20 20 20 7b 20 22 53 51 4c 49 54   },.    { "SQLIT
24de0 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
24df0 44 45 50 54 48 22 2c 20 20 20 20 20 20 20 53 51  DEPTH",       SQ
24e00 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
24e10 45 52 5f 44 45 50 54 48 20 20 20 20 20 20 20 20  ER_DEPTH        
24e20 7d 2c 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 4f  },.    .    /* O
24e30 75 74 20 6f 66 20 72 61 6e 67 65 20 74 65 73 74  ut of range test
24e40 20 63 61 73 65 73 20 2a 2f 0a 20 20 20 20 7b 20   cases */.    { 
24e50 22 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f  "SQLITE_LIMIT_TO
24e60 4f 53 4d 41 4c 4c 22 2c 20 20 20 20 20 20 20 20  OSMALL",        
24e70 20 20 20 20 2d 31 2c 20 20 20 20 20 20 20 20 20      -1,         
24e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24e90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22        },.    { "
24ea0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 4f 4f  SQLITE_LIMIT_TOO
24eb0 42 49 47 22 2c 20 20 20 20 20 20 20 20 20 20 20  BIG",           
24ec0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
24ed0 54 52 49 47 47 45 52 5f 44 45 50 54 48 2b 31 20  TRIGGER_DEPTH+1 
24ee0 20 20 20 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69       },.  };.  i
24ef0 6e 74 20 69 2c 20 69 64 3b 0a 20 20 69 6e 74 20  nt i, id;.  int 
24f00 76 61 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  val;.  const cha
24f10 72 20 2a 7a 49 64 3b 0a 0a 20 20 69 66 28 20 6f  r *zId;..  if( o
24f20 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20 54 63  bjc!=4 ){.    Tc
24f30 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74 28 69  l_AppendResult(i
24f40 6e 74 65 72 70 2c 20 22 77 72 6f 6e 67 20 23 20  nterp, "wrong # 
24f50 61 72 67 73 3a 20 73 68 6f 75 6c 64 20 62 65 20  args: should be 
24f60 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 54 63 6c  \"",.        Tcl
24f70 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
24f80 6a 28 6f 62 6a 76 5b 30 5d 2c 20 30 29 2c 20 22  j(objv[0], 0), "
24f90 20 44 42 20 49 44 20 56 41 4c 55 45 22 2c 20 30   DB ID VALUE", 0
24fa0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
24fb0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
24fc0 66 28 20 67 65 74 44 62 50 6f 69 6e 74 65 72 28  f( getDbPointer(
24fd0 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53  interp, Tcl_GetS
24fe0 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20  tring(objv[1]), 
24ff0 26 64 62 29 20 29 20 72 65 74 75 72 6e 20 54 43  &db) ) return TC
25000 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 49 64 20 3d  L_ERROR;.  zId =
25010 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
25020 62 6a 76 5b 32 5d 29 3b 0a 20 20 66 6f 72 28 69  bjv[2]);.  for(i
25030 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 49 64  =0; i<sizeof(aId
25040 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29  )/sizeof(aId[0])
25050 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
25060 73 74 72 63 6d 70 28 7a 49 64 2c 20 61 49 64 5b  strcmp(zId, aId[
25070 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  i].zName)==0 ){.
25080 20 20 20 20 20 20 69 64 20 3d 20 61 49 64 5b 69        id = aId[i
25090 5d 2e 69 64 3b 0a 20 20 20 20 20 20 62 72 65 61  ].id;.      brea
250a0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
250b0 66 28 20 69 3e 3d 73 69 7a 65 6f 66 28 61 49 64  f( i>=sizeof(aId
250c0 29 2f 73 69 7a 65 6f 66 28 61 49 64 5b 30 5d 29  )/sizeof(aId[0])
250d0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
250e0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
250f0 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 20   "unknown limit 
25100 74 79 70 65 3a 20 22 2c 20 7a 49 64 2c 20 28 63  type: ", zId, (c
25110 68 61 72 2a 29 30 29 3b 0a 20 20 20 20 72 65 74  har*)0);.    ret
25120 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20  urn TCL_ERROR;. 
25130 20 7d 0a 20 20 69 66 28 20 54 63 6c 5f 47 65 74   }.  if( Tcl_Get
25140 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  IntFromObj(inter
25150 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 76 61 6c  p, objv[3], &val
25160 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
25170 52 52 4f 52 3b 0a 20 20 72 63 20 3d 20 73 71 6c  RROR;.  rc = sql
25180 69 74 65 33 5f 6c 69 6d 69 74 28 64 62 2c 20 69  ite3_limit(db, i
25190 64 2c 20 76 61 6c 29 3b 0a 20 20 54 63 6c 5f 53  d, val);.  Tcl_S
251a0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
251b0 72 70 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62  rp, Tcl_NewIntOb
251c0 6a 28 72 63 29 29 3b 0a 20 20 72 65 74 75 72 6e  j(rc));.  return
251d0 20 54 43 4c 5f 4f 4b 3b 20 20 0a 7d 0a 0a 2f 2a   TCL_OK;  .}../*
251e0 0a 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 61 76  .** tclcmd:  sav
251f0 65 5f 70 72 6e 67 5f 73 74 61 74 65 0a 2a 2a 0a  e_prng_state.**.
25200 2a 2a 20 53 61 76 65 20 74 68 65 20 73 74 61 74  ** Save the stat
25210 65 20 6f 66 20 74 68 65 20 70 73 65 75 64 6f 2d  e of the pseudo-
25220 72 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 67 65  random number ge
25230 6e 65 72 61 74 6f 72 2e 0a 2a 2a 20 41 74 20 74  nerator..** At t
25240 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 76 65  he same time, ve
25250 72 69 66 79 20 74 68 61 74 20 73 71 6c 69 74 65  rify that sqlite
25260 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 77  3_test_control w
25270 6f 72 6b 73 20 65 76 65 6e 20 77 68 65 6e 0a 2a  orks even when.*
25280 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 6e  * called with an
25290 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 6f 70   out-of-range op
252a0 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  code..*/.static 
252b0 69 6e 74 20 73 61 76 65 5f 70 72 6e 67 5f 73 74  int save_prng_st
252c0 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44 61 74  ate(.  ClientDat
252d0 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20 2f 2a  a clientData, /*
252e0 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69   Pointer to sqli
252f0 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58 20 66  te3_enable_XXX f
25300 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 63 6c  unction */.  Tcl
25310 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
25320 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69      /* The TCL i
25330 6e 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20  nterpreter that 
25340 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d  invoked this com
25350 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62  mand */.  int ob
25360 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  jc,             
25370 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
25380 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c  guments */.  Tcl
25390 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
253a0 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61  []  /* Command a
253b0 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20  rguments */.){. 
253c0 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
253d0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 39  3_test_control(9
253e0 39 39 39 29 3b 0a 20 20 61 73 73 65 72 74 28 20  999);.  assert( 
253f0 72 63 3d 3d 30 20 29 3b 0a 20 20 72 63 20 3d 20  rc==0 );.  rc = 
25400 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
25410 74 72 6f 6c 28 2d 31 29 3b 0a 20 20 61 73 73 65  trol(-1);.  asse
25420 72 74 28 20 72 63 3d 3d 30 20 29 3b 0a 20 20 73  rt( rc==0 );.  s
25430 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
25440 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
25450 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 29 3b 0a  TRL_PRNG_SAVE);.
25460 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b    return TCL_OK;
25470 0a 7d 0a 2f 2a 0a 2a 2a 20 74 63 6c 63 6d 64 3a  .}./*.** tclcmd:
25480 20 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f 73    restore_prng_s
25490 74 61 74 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tate.*/.static i
254a0 6e 74 20 72 65 73 74 6f 72 65 5f 70 72 6e 67 5f  nt restore_prng_
254b0 73 74 61 74 65 28 0a 20 20 43 6c 69 65 6e 74 44  state(.  ClientD
254c0 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  ata clientData, 
254d0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73 71  /* Pointer to sq
254e0 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58 58 58  lite3_enable_XXX
254f0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 54   function */.  T
25500 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
25510 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54 43 4c  p,    /* The TCL
25520 20 69 6e 74 65 72 70 72 65 74 65 72 20 74 68 61   interpreter tha
25530 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73 20 63  t invoked this c
25540 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  ommand */.  int 
25550 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20 20 20  objc,           
25560 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
25570 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54  arguments */.  T
25580 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
25590 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64  jv[]  /* Command
255a0 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b   arguments */.){
255b0 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
255c0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
255d0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
255e0 54 4f 52 45 29 3b 0a 20 20 72 65 74 75 72 6e 20  TORE);.  return 
255f0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 2f 2a 0a 2a 2a 20  TCL_OK;.}./*.** 
25600 74 63 6c 63 6d 64 3a 20 20 72 65 73 65 74 5f 70  tclcmd:  reset_p
25610 72 6e 67 5f 73 74 61 74 65 0a 2a 2f 0a 73 74 61  rng_state.*/.sta
25620 74 69 63 20 69 6e 74 20 72 65 73 65 74 5f 70 72  tic int reset_pr
25630 6e 67 5f 73 74 61 74 65 28 0a 20 20 43 6c 69 65  ng_state(.  Clie
25640 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74  ntData clientDat
25650 61 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f  a, /* Pointer to
25660 20 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f   sqlite3_enable_
25670 58 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  XXX function */.
25680 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
25690 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20  terp,    /* The 
256a0 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20  TCL interpreter 
256b0 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69  that invoked thi
256c0 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  s command */.  i
256d0 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20  nt objc,        
256e0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
256f0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
25700 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
25710 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d   objv[]  /* Comm
25720 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
25730 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 74 65  .){.  sqlite3_te
25740 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
25750 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
25760 52 45 53 45 54 29 3b 0a 20 20 72 65 74 75 72 6e  RESET);.  return
25770 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a   TCL_OK;.}../*.*
25780 2a 20 74 63 6c 63 6d 64 3a 20 20 70 63 61 63 68  * tclcmd:  pcach
25790 65 5f 73 74 61 74 73 0a 2a 2f 0a 73 74 61 74 69  e_stats.*/.stati
257a0 63 20 69 6e 74 20 74 65 73 74 5f 70 63 61 63 68  c int test_pcach
257b0 65 5f 73 74 61 74 73 28 0a 20 20 43 6c 69 65 6e  e_stats(.  Clien
257c0 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
257d0 2c 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20  , /* Pointer to 
257e0 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 58  sqlite3_enable_X
257f0 58 58 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  XX function */. 
25800 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
25810 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
25820 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
25830 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
25840 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25850 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
25860 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25870 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25880 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25890 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
258a0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
258b0 29 7b 0a 20 20 69 6e 74 20 6e 4d 69 6e 3b 0a 20  ){.  int nMin;. 
258c0 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 69 6e 74   int nMax;.  int
258d0 20 6e 43 75 72 72 65 6e 74 3b 0a 20 20 69 6e 74   nCurrent;.  int
258e0 20 6e 52 65 63 79 63 6c 61 62 6c 65 3b 0a 20 20   nRecyclable;.  
258f0 54 63 6c 5f 4f 62 6a 20 2a 70 52 65 74 3b 0a 0a  Tcl_Obj *pRet;..
25900 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
25910 74 61 74 73 28 26 6e 43 75 72 72 65 6e 74 2c 20  tats(&nCurrent, 
25920 26 6e 4d 61 78 2c 20 26 6e 4d 69 6e 2c 20 26 6e  &nMax, &nMin, &n
25930 52 65 63 79 63 6c 61 62 6c 65 29 3b 0a 0a 20 20  Recyclable);..  
25940 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62  pRet = Tcl_NewOb
25950 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  j();.  Tcl_ListO
25960 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
25970 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
25980 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22  l_NewStringObj("
25990 63 75 72 72 65 6e 74 22 2c 20 2d 31 29 29 3b 0a  current", -1));.
259a0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
259b0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
259c0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
259d0 49 6e 74 4f 62 6a 28 6e 43 75 72 72 65 6e 74 29  IntObj(nCurrent)
259e0 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  );.  Tcl_ListObj
259f0 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e  AppendElement(in
25a00 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f  terp, pRet, Tcl_
25a10 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6d 61  NewStringObj("ma
25a20 78 22 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c 5f  x", -1));.  Tcl_
25a30 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
25a40 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65  ment(interp, pRe
25a50 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a  t, Tcl_NewIntObj
25a60 28 6e 4d 61 78 29 29 3b 0a 20 20 54 63 6c 5f 4c  (nMax));.  Tcl_L
25a70 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d  istObjAppendElem
25a80 65 6e 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74  ent(interp, pRet
25a90 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f  , Tcl_NewStringO
25aa0 62 6a 28 22 6d 69 6e 22 2c 20 2d 31 29 29 3b 0a  bj("min", -1));.
25ab0 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
25ac0 65 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72  endElement(inter
25ad0 70 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77  p, pRet, Tcl_New
25ae0 49 6e 74 4f 62 6a 28 6e 4d 69 6e 29 29 3b 0a 20  IntObj(nMin));. 
25af0 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65   Tcl_ListObjAppe
25b00 6e 64 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70  ndElement(interp
25b10 2c 20 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 53  , pRet, Tcl_NewS
25b20 74 72 69 6e 67 4f 62 6a 28 22 72 65 63 79 63 6c  tringObj("recycl
25b30 61 62 6c 65 22 2c 20 2d 31 29 29 3b 0a 20 20 54  able", -1));.  T
25b40 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64  cl_ListObjAppend
25b50 45 6c 65 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20  Element(interp, 
25b60 70 52 65 74 2c 20 54 63 6c 5f 4e 65 77 49 6e 74  pRet, Tcl_NewInt
25b70 4f 62 6a 28 6e 52 65 63 79 63 6c 61 62 6c 65 29  Obj(nRecyclable)
25b80 29 3b 0a 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  );..  Tcl_SetObj
25b90 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
25ba0 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
25bb0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65  TCL_OK;.}..#ifde
25bc0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
25bd0 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 73 74  UNLOCK_NOTIFY.st
25be0 61 74 69 63 20 76 6f 69 64 20 74 65 73 74 5f 75  atic void test_u
25bf0 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63 62 28  nlock_notify_cb(
25c00 76 6f 69 64 20 2a 2a 61 41 72 67 2c 20 69 6e 74  void **aArg, int
25c10 20 6e 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 69   nArg){.  int ii
25c20 3b 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69  ;.  for(ii=0; ii
25c30 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nArg; ii++){.  
25c40 20 20 54 63 6c 5f 45 76 61 6c 45 78 28 28 54 63    Tcl_EvalEx((Tc
25c50 6c 5f 49 6e 74 65 72 70 20 2a 29 61 41 72 67 5b  l_Interp *)aArg[
25c60 69 69 5d 2c 20 22 75 6e 6c 6f 63 6b 5f 6e 6f 74  ii], "unlock_not
25c70 69 66 79 22 2c 20 2d 31 2c 20 54 43 4c 5f 45 56  ify", -1, TCL_EV
25c80 41 4c 5f 47 4c 4f 42 41 4c 29 3b 0a 20 20 7d 0a  AL_GLOBAL);.  }.
25c90 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
25ca0 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f 43 4b  TE_ENABLE_UNLOCK
25cb0 5f 4e 4f 54 49 46 59 20 2a 2f 0a 0a 2f 2a 0a 2a  _NOTIFY */../*.*
25cc0 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69 74  * tclcmd:  sqlit
25cd0 65 33 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79  e3_unlock_notify
25ce0 20 64 62 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51   db.*/.#ifdef SQ
25cf0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4c 4f  LITE_ENABLE_UNLO
25d00 43 4b 5f 4e 4f 54 49 46 59 0a 73 74 61 74 69 63  CK_NOTIFY.static
25d10 20 69 6e 74 20 74 65 73 74 5f 75 6e 6c 6f 63 6b   int test_unlock
25d20 5f 6e 6f 74 69 66 79 28 0a 20 20 43 6c 69 65 6e  _notify(.  Clien
25d30 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
25d40 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f 0a 20  , /* Unused */. 
25d50 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
25d60 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65 20 54  erp,    /* The T
25d70 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72 20 74  CL interpreter t
25d80 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68 69 73  hat invoked this
25d90 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25da0 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20 20 20  t objc,         
25db0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25dc0 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
25dd0 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20   Tcl_Obj *CONST 
25de0 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d 6d 61  objv[]  /* Comma
25df0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
25e00 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
25e10 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
25e20 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20  f( objc!=2 ){.  
25e30 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
25e40 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
25e50 6a 76 2c 20 22 44 42 22 29 3b 0a 20 20 20 20 72  jv, "DB");.    r
25e60 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
25e70 0a 20 20 7d 0a 0a 20 20 69 66 28 20 67 65 74 44  .  }..  if( getD
25e80 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70 2c  bPointer(interp,
25e90 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f   Tcl_GetString(o
25ea0 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 20 29 7b  bjv[1]), &db) ){
25eb0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
25ec0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72 63 20  ERROR;.  }.  rc 
25ed0 3d 20 73 71 6c 69 74 65 33 5f 75 6e 6c 6f 63 6b  = sqlite3_unlock
25ee0 5f 6e 6f 74 69 66 79 28 64 62 2c 20 74 65 73 74  _notify(db, test
25ef0 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 5f 63  _unlock_notify_c
25f00 62 2c 20 28 76 6f 69 64 20 2a 29 69 6e 74 65 72  b, (void *)inter
25f10 70 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  p);.  Tcl_SetRes
25f20 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
25f30 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
25f40 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
25f50 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
25f60 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
25f70 2a 2a 20 74 63 6c 63 6d 64 3a 20 20 73 71 6c 69  ** tclcmd:  sqli
25f80 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
25f90 6e 74 20 64 62 20 3f 4e 41 4d 45 3f 0a 2a 2f 0a  nt db ?NAME?.*/.
25fa0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
25fb0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 0a  wal_checkpoint(.
25fc0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
25fd0 65 6e 74 44 61 74 61 2c 20 2f 2a 20 55 6e 75 73  entData, /* Unus
25fe0 65 64 20 2a 2f 0a 20 20 54 63 6c 5f 49 6e 74 65  ed */.  Tcl_Inte
25ff0 72 70 20 2a 69 6e 74 65 72 70 2c 20 20 20 20 2f  rp *interp,    /
26000 2a 20 54 68 65 20 54 43 4c 20 69 6e 74 65 72 70  * The TCL interp
26010 72 65 74 65 72 20 74 68 61 74 20 69 6e 76 6f 6b  reter that invok
26020 65 64 20 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20  ed this command 
26030 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 20 20  */.  int objc,  
26040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
26050 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
26060 74 73 20 2a 2f 0a 20 20 54 63 6c 5f 4f 62 6a 20  ts */.  Tcl_Obj 
26070 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 20 20 2f  *CONST objv[]  /
26080 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
26090 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72  nts */.){.  char
260a0 20 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 73 71 6c   *zDb = 0;.  sql
260b0 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
260c0 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21  rc;..  if( objc!
260d0 3d 33 20 26 26 20 6f 62 6a 63 21 3d 32 20 29 7b  =3 && objc!=2 ){
260e0 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75  .    Tcl_WrongNu
260f0 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c  mArgs(interp, 1,
26100 20 6f 62 6a 76 2c 20 22 44 42 20 3f 4e 41 4d 45   objv, "DB ?NAME
26110 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
26120 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
26130 20 20 69 66 28 20 67 65 74 44 62 50 6f 69 6e 74    if( getDbPoint
26140 65 72 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 47  er(interp, Tcl_G
26150 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d  etString(objv[1]
26160 29 2c 20 26 64 62 29 20 29 7b 0a 20 20 20 20 72  ), &db) ){.    r
26170 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
26180 0a 20 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3d  .  }.  if( objc=
26190 3d 33 20 29 7b 0a 20 20 20 20 7a 44 62 20 3d 20  =3 ){.    zDb = 
261a0 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
261b0 6a 76 5b 32 5d 29 3b 0a 20 20 7d 0a 20 20 72 63  jv[2]);.  }.  rc
261c0 20 3d 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63   = sqlite3_wal_c
261d0 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
261e0 62 29 3b 0a 20 20 54 63 6c 5f 53 65 74 52 65 73  b);.  Tcl_SetRes
261f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61  ult(interp, (cha
26200 72 20 2a 29 74 31 45 72 72 6f 72 4e 61 6d 65 28  r *)t1ErrorName(
26210 72 63 29 2c 20 54 43 4c 5f 53 54 41 54 49 43 29  rc), TCL_STATIC)
26220 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
26230 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 74 63 6c 63  K;.}../*.** tclc
26240 6d 64 3a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  md:  sqlite3_wal
26250 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 20 64  _checkpoint_v2 d
26260 62 20 4d 4f 44 45 20 3f 4e 41 4d 45 3f 0a 2a 2a  b MODE ?NAME?.**
26270 0a 2a 2a 20 54 68 69 73 20 63 6f 6d 6d 61 6e 64  .** This command
26280 20 63 61 6c 6c 73 20 74 68 65 20 77 61 6c 5f 63   calls the wal_c
26290 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29 20 66  heckpoint_v2() f
262a0 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
262b0 20 73 70 65 63 69 66 69 65 64 0a 2a 2a 20 6d 6f   specified.** mo
262c0 64 65 20 61 72 67 75 6d 65 6e 74 20 28 70 61 73  de argument (pas
262d0 73 69 76 65 2c 20 66 75 6c 6c 20 6f 72 20 72 65  sive, full or re
262e0 73 74 61 72 74 29 2e 20 49 66 20 70 72 65 73 65  start). If prese
262f0 6e 74 2c 20 74 68 65 20 64 61 74 61 62 61 73 65  nt, the database
26300 20 6e 61 6d 65 0a 2a 2a 20 4e 41 4d 45 20 69 73   name.** NAME is
26310 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
26320 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74  econd argument t
26330 6f 20 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  o wal_checkpoint
26340 5f 76 32 28 29 2e 20 49 66 20 69 74 20 74 68 65  _v2(). If it the
26350 0a 2a 2a 20 4e 41 4d 45 20 61 72 67 75 6d 65 6e  .** NAME argumen
26360 74 20 69 73 20 6e 6f 74 20 70 72 65 73 65 6e 74  t is not present
26370 2c 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  , a NULL pointer
26380 20 69 73 20 70 61 73 73 65 64 20 69 6e 73 74 65   is passed inste
26390 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 61 6c  ad..**.** If wal
263a0 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 29  _checkpoint_v2()
263b0 20 72 65 74 75 72 6e 73 20 61 6e 79 20 76 61 6c   returns any val
263c0 75 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  ue other than SQ
263d0 4c 49 54 45 5f 42 55 53 59 20 6f 72 0a 2a 2a 20  LITE_BUSY or.** 
263e0 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 20  SQLITE_OK, then 
263f0 74 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74  this command ret
26400 75 72 6e 73 20 54 43 4c 5f 45 52 52 4f 52 2e 20  urns TCL_ERROR. 
26410 54 68 65 20 54 63 6c 20 72 65 73 75 6c 74 20 69  The Tcl result i
26420 73 20 73 65 74 0a 2a 2a 20 74 6f 20 74 68 65 20  s set.** to the 
26430 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 62  error message ob
26440 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
26450 74 65 33 5f 65 72 72 6d 73 67 28 29 2e 0a 2a 2a  te3_errmsg()..**
26460 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 74  .** Otherwise, t
26470 68 69 73 20 63 6f 6d 6d 61 6e 64 20 72 65 74 75  his command retu
26480 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 74 68  rns a list of th
26490 72 65 65 20 69 6e 74 65 67 65 72 73 2e 20 54 68  ree integers. Th
264a0 65 20 66 69 72 73 74 20 69 6e 74 65 67 65 72 0a  e first integer.
264b0 2a 2a 20 69 73 20 31 20 69 66 20 53 51 4c 49 54  ** is 1 if SQLIT
264c0 45 5f 42 55 53 59 20 77 61 73 20 72 65 74 75 72  E_BUSY was retur
264d0 6e 65 64 2c 20 6f 72 20 30 20 6f 74 68 65 72 77  ned, or 0 otherw
264e0 69 73 65 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ise. The followi
264f0 6e 67 20 74 77 6f 20 69 6e 74 65 67 65 72 73 0a  ng two integers.
26500 2a 2a 20 61 72 65 20 74 68 65 20 76 61 6c 75 65  ** are the value
26510 73 20 72 65 74 75 72 6e 65 64 20 76 69 61 20 74  s returned via t
26520 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
26530 74 65 72 73 20 62 79 20 77 61 6c 5f 63 68 65 63  ters by wal_chec
26540 6b 70 6f 69 6e 74 5f 76 32 28 29 20 2d 0a 2a 2a  kpoint_v2() -.**
26550 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
26560 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
26570 20 61 6e 64 20 74 68 65 20 6e 75 6d 62 65 72 20   and the number 
26580 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  of frames in the
26590 20 6c 6f 67 0a 2a 2a 20 74 68 61 74 20 68 61 76   log.** that hav
265a0 65 20 62 65 65 6e 20 63 68 65 63 6b 70 6f 69 6e  e been checkpoin
265b0 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
265c0 6e 74 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63  nt test_wal_chec
265d0 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 43 6c 69  kpoint_v2(.  Cli
265e0 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61  entData clientDa
265f0 74 61 2c 20 2f 2a 20 55 6e 75 73 65 64 20 2a 2f  ta, /* Unused */
26600 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  .  Tcl_Interp *i
26610 6e 74 65 72 70 2c 20 20 20 20 2f 2a 20 54 68 65  nterp,    /* The
26620 20 54 43 4c 20 69 6e 74 65 72 70 72 65 74 65 72   TCL interpreter
26630 20 74 68 61 74 20 69 6e 76 6f 6b 65 64 20 74 68   that invoked th
26640 69 73 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  is command */.  
26650 69 6e 74 20 6f 62 6a 63 2c 20 20 20 20 20 20 20  int objc,       
26660 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
26670 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
26680 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
26690 54 20 6f 62 6a 76 5b 5d 20 20 2f 2a 20 43 6f 6d  T objv[]  /* Com
266a0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
266b0 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
266c0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
266d0 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  *db;.  int rc;..
266e0 20 20 69 6e 74 20 65 4d 6f 64 65 3b 0a 20 20 69    int eMode;.  i
266f0 6e 74 20 6e 4c 6f 67 20 3d 20 2d 35 35 35 3b 0a  nt nLog = -555;.
26700 20 20 69 6e 74 20 6e 43 6b 70 74 20 3d 20 2d 35    int nCkpt = -5
26710 35 35 3b 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 70  55;.  Tcl_Obj *p
26720 52 65 74 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  Ret;..  const ch
26730 61 72 20 2a 20 61 4d 6f 64 65 5b 5d 20 3d 20 7b  ar * aMode[] = {
26740 20 22 70 61 73 73 69 76 65 22 2c 20 22 66 75 6c   "passive", "ful
26750 6c 22 2c 20 22 72 65 73 74 61 72 74 22 2c 20 30  l", "restart", 0
26760 20 7d 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   };.  assert( SQ
26770 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
26780 50 41 53 53 49 56 45 3d 3d 30 20 29 3b 0a 20 20  PASSIVE==0 );.  
26790 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
267a0 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3d 3d  HECKPOINT_FULL==
267b0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  1 );.  assert( S
267c0 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
267d0 5f 52 45 53 54 41 52 54 3d 3d 32 20 29 3b 0a 0a  _RESTART==2 );..
267e0 20 20 69 66 28 20 6f 62 6a 63 21 3d 33 20 26 26    if( objc!=3 &&
267f0 20 6f 62 6a 63 21 3d 34 20 29 7b 0a 20 20 20 20   objc!=4 ){.    
26800 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
26810 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
26820 2c 20 22 44 42 20 4d 4f 44 45 20 3f 4e 41 4d 45  , "DB MODE ?NAME
26830 3f 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ?");.    return 
26840 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
26850 20 20 69 66 28 20 6f 62 6a 63 3d 3d 34 20 29 7b    if( objc==4 ){
26860 0a 20 20 20 20 7a 44 62 20 3d 20 54 63 6c 5f 47  .    zDb = Tcl_G
26870 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 33 5d  etString(objv[3]
26880 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67 65 74  );.  }.  if( get
26890 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65 72 70  DbPointer(interp
268a0 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28  , Tcl_GetString(
268b0 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29 0a 20  objv[1]), &db). 
268c0 20 20 7c 7c 20 54 63 6c 5f 47 65 74 49 6e 64 65    || Tcl_GetInde
268d0 78 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c  xFromObj(interp,
268e0 20 6f 62 6a 76 5b 32 5d 2c 20 61 4d 6f 64 65 2c   objv[2], aMode,
268f0 20 22 6d 6f 64 65 22 2c 20 30 2c 20 26 65 4d 6f   "mode", 0, &eMo
26900 64 65 29 20 0a 20 20 29 7b 0a 20 20 20 20 72 65  de) .  ){.    re
26910 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
26920 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69    }..  rc = sqli
26930 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69  te3_wal_checkpoi
26940 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 65  nt_v2(db, zDb, e
26950 4d 6f 64 65 2c 20 26 6e 4c 6f 67 2c 20 26 6e 43  Mode, &nLog, &nC
26960 6b 70 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  kpt);.  if( rc!=
26970 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
26980 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
26990 20 20 20 20 54 63 6c 5f 53 65 74 52 65 73 75 6c      Tcl_SetResul
269a0 74 28 69 6e 74 65 72 70 2c 20 28 63 68 61 72 20  t(interp, (char 
269b0 2a 29 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  *)sqlite3_errmsg
269c0 28 64 62 29 2c 20 54 43 4c 5f 56 4f 4c 41 54 49  (db), TCL_VOLATI
269d0 4c 45 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  LE);.    return 
269e0 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 0a  TCL_ERROR;.  }..
269f0 20 20 70 52 65 74 20 3d 20 54 63 6c 5f 4e 65 77    pRet = Tcl_New
26a00 4f 62 6a 28 29 3b 0a 20 20 54 63 6c 5f 4c 69 73  Obj();.  Tcl_Lis
26a10 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
26a20 74 28 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20  t(interp, pRet, 
26a30 54 63 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 72 63  Tcl_NewIntObj(rc
26a40 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 3f 31 3a  ==SQLITE_BUSY?1:
26a50 30 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f  0));.  Tcl_ListO
26a60 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28  bjAppendElement(
26a70 69 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63  interp, pRet, Tc
26a80 6c 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 4c 6f 67  l_NewIntObj(nLog
26a90 29 29 3b 0a 20 20 54 63 6c 5f 4c 69 73 74 4f 62  ));.  Tcl_ListOb
26aa0 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 69  jAppendElement(i
26ab0 6e 74 65 72 70 2c 20 70 52 65 74 2c 20 54 63 6c  nterp, pRet, Tcl
26ac0 5f 4e 65 77 49 6e 74 4f 62 6a 28 6e 43 6b 70 74  _NewIntObj(nCkpt
26ad0 29 29 3b 0a 20 20 54 63 6c 5f 53 65 74 4f 62 6a  ));.  Tcl_SetObj
26ae0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 70  Result(interp, p
26af0 52 65 74 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Ret);..  return 
26b00 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
26b10 20 74 63 6c 63 6d 64 3a 20 20 74 65 73 74 5f 73   tclcmd:  test_s
26b20 71 6c 69 74 65 33 5f 6c 6f 67 20 3f 53 43 52 49  qlite3_log ?SCRI
26b30 50 54 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 73 74  PT?.*/.static st
26b40 72 75 63 74 20 4c 6f 67 43 61 6c 6c 62 61 63 6b  ruct LogCallback
26b50 20 7b 0a 20 20 54 63 6c 5f 49 6e 74 65 72 70 20   {.  Tcl_Interp 
26b60 2a 70 49 6e 74 65 72 70 3b 0a 20 20 54 63 6c 5f  *pInterp;.  Tcl_
26b70 4f 62 6a 20 2a 70 4f 62 6a 3b 0a 7d 20 6c 6f 67  Obj *pObj;.} log
26b80 63 61 6c 6c 62 61 63 6b 20 3d 20 7b 30 2c 20 30  callback = {0, 0
26b90 7d 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 78  };.static void x
26ba0 4c 6f 67 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  Logcallback(void
26bb0 20 2a 75 6e 75 73 65 64 2c 20 69 6e 74 20 65 72   *unused, int er
26bc0 72 2c 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a  r, char *zMsg){.
26bd0 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 4e 65 77 20    Tcl_Obj *pNew 
26be0 3d 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f  = Tcl_DuplicateO
26bf0 62 6a 28 6c 6f 67 63 61 6c 6c 62 61 63 6b 2e 70  bj(logcallback.p
26c00 4f 62 6a 29 3b 0a 20 20 54 63 6c 5f 49 6e 63 72  Obj);.  Tcl_Incr
26c10 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29 3b 0a  RefCount(pNew);.
26c20 20 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70    Tcl_ListObjApp
26c30 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20 20 20  endElement(.    
26c40 20 20 30 2c 20 70 4e 65 77 2c 20 54 63 6c 5f 4e    0, pNew, Tcl_N
26c50 65 77 53 74 72 69 6e 67 4f 62 6a 28 73 71 6c 69  ewStringObj(sqli
26c60 74 65 33 45 72 72 4e 61 6d 65 28 65 72 72 29 2c  te3ErrName(err),
26c70 20 2d 31 29 0a 20 20 29 3b 0a 20 20 54 63 6c 5f   -1).  );.  Tcl_
26c80 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
26c90 6d 65 6e 74 28 30 2c 20 70 4e 65 77 2c 20 54 63  ment(0, pNew, Tc
26ca0 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 7a  l_NewStringObj(z
26cb0 4d 73 67 2c 20 2d 31 29 29 3b 0a 20 20 54 63 6c  Msg, -1));.  Tcl
26cc0 5f 45 76 61 6c 4f 62 6a 45 78 28 6c 6f 67 63 61  _EvalObjEx(logca
26cd0 6c 6c 62 61 63 6b 2e 70 49 6e 74 65 72 70 2c 20  llback.pInterp, 
26ce0 70 4e 65 77 2c 20 54 43 4c 5f 45 56 41 4c 5f 47  pNew, TCL_EVAL_G
26cf0 4c 4f 42 41 4c 7c 54 43 4c 5f 45 56 41 4c 5f 44  LOBAL|TCL_EVAL_D
26d00 49 52 45 43 54 29 3b 0a 20 20 54 63 6c 5f 44 65  IRECT);.  Tcl_De
26d10 63 72 52 65 66 43 6f 75 6e 74 28 70 4e 65 77 29  crRefCount(pNew)
26d20 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 74  ;.}.static int t
26d30 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c 6f 67 28  est_sqlite3_log(
26d40 0a 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c  .  ClientData cl
26d50 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f  ientData,.  Tcl_
26d60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
26d70 20 20 20 2f 2a 20 54 68 65 20 54 43 4c 20 69 6e     /* The TCL in
26d80 74 65 72 70 72 65 74 65 72 20 74 68 61 74 20 69  terpreter that i
26d90 6e 76 6f 6b 65 64 20 74 68 69 73 20 63 6f 6d 6d  nvoked this comm
26da0 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 62 6a  and */.  int obj
26db0 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c,              
26dc0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
26dd0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 54 63 6c 5f  uments */.  Tcl_
26de0 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
26df0 5d 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72  ]  /* Command ar
26e00 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20  guments */.){.  
26e10 69 66 28 20 6f 62 6a 63 3e 32 20 29 7b 0a 20 20  if( objc>2 ){.  
26e20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72    Tcl_WrongNumAr
26e30 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62  gs(interp, 1, ob
26e40 6a 76 2c 20 22 53 43 52 49 50 54 22 29 3b 0a 20  jv, "SCRIPT");. 
26e50 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
26e60 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c  ROR;.  }.  if( l
26e70 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20  ogcallback.pObj 
26e80 29 7b 0a 20 20 20 20 54 63 6c 5f 44 65 63 72 52  ){.    Tcl_DecrR
26e90 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62  efCount(logcallb
26ea0 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c  ack.pObj);.    l
26eb0 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 4f 62 6a 20  ogcallback.pObj 
26ec0 3d 20 30 3b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c  = 0;.    logcall
26ed0 62 61 63 6b 2e 70 49 6e 74 65 72 70 20 3d 20 30  back.pInterp = 0
26ee0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
26ef0 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
26f00 49 47 5f 4c 4f 47 2c 20 30 2c 20 30 29 3b 0a 20  IG_LOG, 0, 0);. 
26f10 20 7d 0a 20 20 69 66 28 20 6f 62 6a 63 3e 31 20   }.  if( objc>1 
26f20 29 7b 0a 20 20 20 20 6c 6f 67 63 61 6c 6c 62 61  ){.    logcallba
26f30 63 6b 2e 70 4f 62 6a 20 3d 20 6f 62 6a 76 5b 31  ck.pObj = objv[1
26f40 5d 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  ];.    Tcl_IncrR
26f50 65 66 43 6f 75 6e 74 28 6c 6f 67 63 61 6c 6c 62  efCount(logcallb
26f60 61 63 6b 2e 70 4f 62 6a 29 3b 0a 20 20 20 20 6c  ack.pObj);.    l
26f70 6f 67 63 61 6c 6c 62 61 63 6b 2e 70 49 6e 74 65  ogcallback.pInte
26f80 72 70 20 3d 20 69 6e 74 65 72 70 3b 0a 20 20 20  rp = interp;.   
26f90 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28   sqlite3_config(
26fa0 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
26fb0 47 2c 20 78 4c 6f 67 63 61 6c 6c 62 61 63 6b 2c  G, xLogcallback,
26fc0 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
26fd0 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  n TCL_OK;.}../*.
26fe0 2a 2a 20 20 20 20 20 74 63 6c 5f 6f 62 6a 70 72  **     tcl_objpr
26ff0 6f 63 20 43 4f 4d 4d 41 4e 44 4e 41 4d 45 20 41  oc COMMANDNAME A
27000 52 47 53 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 52 75 6e  RGS....**.** Run
27010 20 61 20 54 43 4c 20 63 6f 6d 6d 61 6e 64 20 75   a TCL command u
27020 73 69 6e 67 20 69 74 73 20 6f 62 6a 50 72 6f 63  sing its objProc
27030 20 69 6e 74 65 72 66 61 63 65 2e 20 20 54 68 72   interface.  Thr
27040 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 0a 2a  ow an error if.*
27050 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 68 61  * the command ha
27060 73 20 6e 6f 20 6f 62 6a 50 72 6f 63 20 69 6e 74  s no objProc int
27070 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
27080 63 20 69 6e 74 20 72 75 6e 41 73 4f 62 6a 50 72  c int runAsObjPr
27090 6f 63 28 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69  oc(.  void * cli
270a0 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49  entData,.  Tcl_I
270b0 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20  nterp *interp,. 
270c0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c   int objc,.  Tcl
270d0 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76  _Obj *CONST objv
270e0 5b 5d 0a 29 7b 0a 20 20 54 63 6c 5f 43 6d 64 49  [].){.  Tcl_CmdI
270f0 6e 66 6f 20 63 6d 64 49 6e 66 6f 3b 0a 20 20 69  nfo cmdInfo;.  i
27100 66 28 20 6f 62 6a 63 3c 32 20 29 7b 0a 20 20 20  f( objc<2 ){.   
27110 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
27120 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a  s(interp, 1, obj
27130 76 2c 20 22 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 22  v, "COMMAND ..."
27140 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
27150 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69  L_ERROR;.  }.  i
27160 66 28 20 21 54 63 6c 5f 47 65 74 43 6f 6d 6d 61  f( !Tcl_GetComma
27170 6e 64 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54  ndInfo(interp, T
27180 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  cl_GetString(obj
27190 76 5b 31 5d 29 2c 20 26 63 6d 64 49 6e 66 6f 29  v[1]), &cmdInfo)
271a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
271b0 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
271c0 20 22 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f   "command not fo
271d0 75 6e 64 3a 20 22 2c 0a 20 20 20 20 20 20 20 20  und: ",.        
271e0 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67     Tcl_GetString
271f0 28 6f 62 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72  (objv[1]), (char
27200 2a 29 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  *)0);.    return
27210 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a   TCL_ERROR;.  }.
27220 20 20 69 66 28 20 63 6d 64 49 6e 66 6f 2e 6f 62    if( cmdInfo.ob
27230 6a 50 72 6f 63 3d 3d 30 20 29 7b 0a 20 20 20 20  jProc==0 ){.    
27240 54 63 6c 5f 41 70 70 65 6e 64 52 65 73 75 6c 74  Tcl_AppendResult
27250 28 69 6e 74 65 72 70 2c 20 22 63 6f 6d 6d 61 6e  (interp, "comman
27260 64 20 68 61 73 20 6e 6f 20 6f 62 6a 50 72 6f 63  d has no objProc
27270 3a 20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  : ",.           
27280 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 6f 62  Tcl_GetString(ob
27290 6a 76 5b 31 5d 29 2c 20 28 63 68 61 72 2a 29 30  jv[1]), (char*)0
272a0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43  );.    return TC
272b0 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 72  L_ERROR;.  }.  r
272c0 65 74 75 72 6e 20 63 6d 64 49 6e 66 6f 2e 6f 62  eturn cmdInfo.ob
272d0 6a 50 72 6f 63 28 63 6d 64 49 6e 66 6f 2e 6f 62  jProc(cmdInfo.ob
272e0 6a 43 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74  jClientData, int
272f0 65 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a  erp, objc-1, obj
27300 76 2b 31 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  v+1);.}..#ifndef
27310 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58 50   SQLITE_OMIT_EXP
27320 4c 41 49 4e 0a 2f 2a 0a 2a 2a 20 57 41 52 4e 49  LAIN./*.** WARNI
27330 4e 47 3a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  NG: The followin
27340 67 20 66 75 6e 63 74 69 6f 6e 2c 20 70 72 69 6e  g function, prin
27350 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
27360 6e 28 29 20 69 73 20 61 6e 20 65 78 61 63 74 0a  n() is an exact.
27370 2a 2a 20 63 6f 70 79 20 6f 66 20 65 78 61 6d 70  ** copy of examp
27380 6c 65 20 63 6f 64 65 20 66 72 6f 6d 20 65 71 70  le code from eqp
27390 2e 69 6e 20 28 65 71 70 2e 68 74 6d 6c 29 2e 20  .in (eqp.html). 
273a0 49 66 20 74 68 69 73 20 63 6f 64 65 20 69 73 20  If this code is 
273b0 6d 6f 64 69 66 69 65 64 2c 0a 2a 2a 20 74 68 65  modified,.** the
273c0 6e 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  n the documentat
273d0 69 6f 6e 20 63 6f 70 79 20 6e 65 65 64 73 20 74  ion copy needs t
273e0 6f 20 62 65 20 6d 6f 64 69 66 69 65 64 20 61 73  o be modified as
273f0 20 77 65 6c 6c 2e 0a 2a 2f 0a 2f 2a 0a 2a 2a 20   well..*/./*.** 
27400 41 72 67 75 6d 65 6e 74 20 70 53 74 6d 74 20 69  Argument pStmt i
27410 73 20 61 20 70 72 65 70 61 72 65 64 20 53 51 4c  s a prepared SQL
27420 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
27430 20 66 75 6e 63 74 69 6f 6e 20 63 6f 6d 70 69 6c   function compil
27440 65 73 0a 2a 2a 20 61 6e 20 45 58 50 4c 41 49 4e  es.** an EXPLAIN
27450 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
27460 61 6e 64 20 74 6f 20 72 65 70 6f 72 74 20 6f 6e  and to report on
27470 20 74 68 65 20 70 72 65 70 61 72 65 64 20 73 74   the prepared st
27480 61 74 65 6d 65 6e 74 2c 0a 2a 2a 20 61 6e 64 20  atement,.** and 
27490 70 72 69 6e 74 73 20 74 68 65 20 72 65 70 6f 72  prints the repor
274a0 74 20 74 6f 20 73 74 64 6f 75 74 20 75 73 69 6e  t to stdout usin
274b0 67 20 70 72 69 6e 74 66 28 29 2e 0a 2a 2f 0a 69  g printf()..*/.i
274c0 6e 74 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51  nt printExplainQ
274d0 75 65 72 79 50 6c 61 6e 28 73 71 6c 69 74 65 33  ueryPlan(sqlite3
274e0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 29 7b 0a 20  _stmt *pStmt){. 
274f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
27500 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
27510 20 2f 2a 20 49 6e 70 75 74 20 53 51 4c 20 2a 2f   /* Input SQL */
27520 0a 20 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69  .  char *zExplai
27530 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
27540 20 20 20 2f 2a 20 53 51 4c 20 77 69 74 68 20 45     /* SQL with E
27550 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
27560 4e 20 70 72 65 70 65 6e 64 65 64 20 2a 2f 0a 20  N prepended */. 
27570 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
27580 45 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20  Explain;        
27590 20 2f 2a 20 43 6f 6d 70 69 6c 65 64 20 45 58 50   /* Compiled EXP
275a0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
275b0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
275c0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
275d0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
275e0 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f 6d  Return code from
275f0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
27600 5f 76 32 28 29 20 2a 2f 0a 0a 20 20 7a 53 71 6c  _v2() */..  zSql
27610 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
27620 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 7a 53 71  Stmt);.  if( zSq
27630 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
27640 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 0a 20 20 7a  LITE_ERROR;..  z
27650 45 78 70 6c 61 69 6e 20 3d 20 73 71 6c 69 74 65  Explain = sqlite
27660 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41  3_mprintf("EXPLA
27670 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73  IN QUERY PLAN %s
27680 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 69 66 28 20  ", zSql);.  if( 
27690 7a 45 78 70 6c 61 69 6e 3d 3d 30 20 29 20 72 65  zExplain==0 ) re
276a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
276b0 4d 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  M;..  rc = sqlit
276c0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 73 71  e3_prepare_v2(sq
276d0 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
276e0 70 53 74 6d 74 29 2c 20 7a 45 78 70 6c 61 69 6e  pStmt), zExplain
276f0 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
27700 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
27710 72 65 65 28 7a 45 78 70 6c 61 69 6e 29 3b 0a 20  ree(zExplain);. 
27720 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
27730 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
27740 0a 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45  .  while( SQLITE
27750 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
27760 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b 0a  ep(pExplain) ){.
27770 20 20 20 20 69 6e 74 20 69 53 65 6c 65 63 74 69      int iSelecti
27780 64 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d = sqlite3_colu
27790 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
277a0 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 69 4f 72   0);.    int iOr
277b0 64 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  der = sqlite3_co
277c0 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69  lumn_int(pExplai
277d0 6e 2c 20 31 29 3b 0a 20 20 20 20 69 6e 74 20 69  n, 1);.    int i
277e0 46 72 6f 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  From = sqlite3_c
277f0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
27800 69 6e 2c 20 32 29 3b 0a 20 20 20 20 63 6f 6e 73  in, 2);.    cons
27810 74 20 63 68 61 72 20 2a 7a 44 65 74 61 69 6c 20  t char *zDetail 
27820 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29  = (const char *)
27830 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
27840 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
27850 3b 0a 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25  ;..    printf("%
27860 64 20 25 64 20 25 64 20 25 73 5c 6e 22 2c 20 69  d %d %d %s\n", i
27870 53 65 6c 65 63 74 69 64 2c 20 69 4f 72 64 65 72  Selectid, iOrder
27880 2c 20 69 46 72 6f 6d 2c 20 7a 44 65 74 61 69 6c  , iFrom, zDetail
27890 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
278a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
278b0 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 7d 0a 0a  e(pExplain);.}..
278c0 73 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 5f  static int test_
278d0 70 72 69 6e 74 5f 65 71 70 28 0a 20 20 76 6f 69  print_eqp(.  voi
278e0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
278f0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
27900 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
27910 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
27920 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69  ST objv[].){.  i
27930 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
27940 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 0a 20  _stmt *pStmt;.. 
27950 20 69 66 28 20 6f 62 6a 63 21 3d 32 20 29 7b 0a   if( objc!=2 ){.
27960 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
27970 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
27980 6f 62 6a 76 2c 20 22 53 54 4d 54 22 29 3b 0a 20  objv, "STMT");. 
27990 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
279a0 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
279b0 65 74 53 74 6d 74 50 6f 69 6e 74 65 72 28 69 6e  etStmtPointer(in
279c0 74 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72  terp, Tcl_GetStr
279d0 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 70  ing(objv[1]), &p
279e0 53 74 6d 74 29 20 29 20 72 65 74 75 72 6e 20 54  Stmt) ) return T
279f0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 72 63 20 3d  CL_ERROR;.  rc =
27a00 20 70 72 69 6e 74 45 78 70 6c 61 69 6e 51 75 65   printExplainQue
27a10 72 79 50 6c 61 6e 28 70 53 74 6d 74 29 3b 0a 20  ryPlan(pStmt);. 
27a20 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 65 65 64   /* This is need
27a30 65 64 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 6f  ed on Windows so
27a40 20 74 68 61 74 20 61 20 74 65 73 74 20 63 61 73   that a test cas
27a50 65 20 75 73 69 6e 67 20 74 68 69 73 20 0a 20 20  e using this .  
27a60 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 63 61 6e 20  ** function can 
27a70 6f 70 65 6e 20 61 20 72 65 61 64 20 70 69 70 65  open a read pipe
27a80 20 61 6e 64 20 67 65 74 20 74 68 65 20 6f 75 74   and get the out
27a90 70 75 74 20 6f 66 0a 20 20 2a 2a 20 70 72 69 6e  put of.  ** prin
27aa0 74 45 78 70 6c 61 69 6e 51 75 65 72 79 50 6c 61  tExplainQueryPla
27ab0 6e 28 29 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  n() immediately.
27ac0 0a 20 20 2a 2f 0a 20 20 66 66 6c 75 73 68 28 73  .  */.  fflush(s
27ad0 74 64 6f 75 74 29 3b 0a 20 20 54 63 6c 5f 53 65  tdout);.  Tcl_Se
27ae0 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  tResult(interp, 
27af0 28 63 68 61 72 20 2a 29 74 31 45 72 72 6f 72 4e  (char *)t1ErrorN
27b00 61 6d 65 28 72 63 29 2c 20 30 29 3b 0a 20 20 72  ame(rc), 0);.  r
27b10 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
27b20 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
27b30 5f 4f 4d 49 54 5f 45 58 50 4c 41 49 4e 20 2a 2f  _OMIT_EXPLAIN */
27b40 0a 0a 2f 2a 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  ../*.** sqlite3_
27b50 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 20 56 45 52  test_control VER
27b60 42 20 41 52 47 53 2e 2e 2e 0a 2a 2f 0a 73 74 61  B ARGS....*/.sta
27b70 74 69 63 20 69 6e 74 20 74 65 73 74 5f 74 65 73  tic int test_tes
27b80 74 5f 63 6f 6e 74 72 6f 6c 28 0a 20 20 76 6f 69  t_control(.  voi
27b90 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
27ba0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
27bb0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
27bc0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
27bd0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
27be0 74 72 75 63 74 20 56 65 72 62 20 7b 0a 20 20 20  truct Verb {.   
27bf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
27c00 6d 65 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  me;.    int i;. 
27c10 20 7d 20 61 56 65 72 62 5b 5d 20 3d 20 7b 0a 20   } aVerb[] = {. 
27c20 20 20 20 7b 20 22 53 51 4c 49 54 45 5f 54 45 53     { "SQLITE_TES
27c30 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
27c40 46 41 55 4c 54 22 2c 20 53 51 4c 49 54 45 5f 54  FAULT", SQLITE_T
27c50 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
27c60 45 5f 46 41 55 4c 54 20 7d 2c 20 0a 20 20 7d 3b  E_FAULT }, .  };
27c70 0a 20 20 69 6e 74 20 69 56 65 72 62 3b 0a 20 20  .  int iVerb;.  
27c80 69 6e 74 20 69 46 6c 61 67 3b 0a 20 20 69 6e 74  int iFlag;.  int
27c90 20 72 63 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63   rc;..  if( objc
27ca0 3c 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  <2 ){.    Tcl_Wr
27cb0 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
27cc0 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 56 45 52  p, 1, objv, "VER
27cd0 42 20 41 52 47 53 2e 2e 2e 22 29 3b 0a 20 20 20  B ARGS...");.   
27ce0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
27cf0 52 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 54  R;.  }..  rc = T
27d00 63 6c 5f 47 65 74 49 6e 64 65 78 46 72 6f 6d 4f  cl_GetIndexFromO
27d10 62 6a 53 74 72 75 63 74 28 0a 20 20 20 20 20 20  bjStruct(.      
27d20 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c  interp, objv[1],
27d30 20 61 56 65 72 62 2c 20 73 69 7a 65 6f 66 28 61   aVerb, sizeof(a
27d40 56 65 72 62 5b 30 5d 29 2c 20 22 56 45 52 42 22  Verb[0]), "VERB"
27d50 2c 20 30 2c 20 26 69 56 65 72 62 0a 20 20 29 3b  , 0, &iVerb.  );
27d60 0a 20 20 69 66 28 20 72 63 21 3d 54 43 4c 5f 4f  .  if( rc!=TCL_O
27d70 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
27d80 20 20 69 46 6c 61 67 20 3d 20 61 56 65 72 62 5b    iFlag = aVerb[
27d90 69 56 65 72 62 5d 2e 69 3b 0a 20 20 73 77 69 74  iVerb].i;.  swit
27da0 63 68 28 20 69 46 6c 61 67 20 29 7b 0a 20 20 20  ch( iFlag ){.   
27db0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
27dc0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
27dd0 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 69  FAULT: {.      i
27de0 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 69 66  nt val;.      if
27df0 28 20 6f 62 6a 63 21 3d 33 20 29 7b 0a 20 20 20  ( objc!=3 ){.   
27e00 20 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75       Tcl_WrongNu
27e10 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 32 2c  mArgs(interp, 2,
27e20 20 6f 62 6a 76 2c 20 22 4f 4e 4f 46 46 22 29 3b   objv, "ONOFF");
27e30 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27e40 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  TCL_ERROR;.     
27e50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 54 63 6c   }.      if( Tcl
27e60 5f 47 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f  _GetBooleanFromO
27e70 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  bj(interp, objv[
27e80 32 5d 2c 20 26 76 61 6c 29 20 29 20 72 65 74 75  2], &val) ) retu
27e90 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
27ea0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
27eb0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
27ec0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
27ed0 4d 45 5f 46 41 55 4c 54 2c 20 76 61 6c 29 3b 0a  ME_FAULT, val);.
27ee0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
27ef0 20 7d 0a 20 20 7d 0a 0a 20 20 54 63 6c 5f 52 65   }.  }..  Tcl_Re
27f00 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72 70  setResult(interp
27f10 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
27f20 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49 54  OK;.}..#if SQLIT
27f30 45 5f 4f 53 5f 55 4e 49 58 0a 23 69 6e 63 6c 75  E_OS_UNIX.#inclu
27f40 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e 68 3e 0a  de <sys/time.h>.
27f50 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 72 65  #include <sys/re
27f60 73 6f 75 72 63 65 2e 68 3e 0a 0a 73 74 61 74 69  source.h>..stati
27f70 63 20 69 6e 74 20 74 65 73 74 5f 67 65 74 72 75  c int test_getru
27f80 73 61 67 65 28 0a 20 20 76 6f 69 64 20 2a 20 63  sage(.  void * c
27f90 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
27fa0 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
27fb0 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
27fc0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
27fd0 6a 76 5b 5d 0a 29 7b 0a 20 20 63 68 61 72 20 62  jv[].){.  char b
27fe0 75 66 5b 31 30 32 34 5d 3b 0a 20 20 73 74 72 75  uf[1024];.  stru
27ff0 63 74 20 72 75 73 61 67 65 20 72 3b 0a 20 20 6d  ct rusage r;.  m
28000 65 6d 73 65 74 28 26 72 2c 20 30 2c 20 73 69 7a  emset(&r, 0, siz
28010 65 6f 66 28 72 29 29 3b 0a 20 20 67 65 74 72 75  eof(r));.  getru
28020 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
28030 2c 20 26 72 29 3b 0a 0a 20 20 73 70 72 69 6e 74  , &r);..  sprint
28040 66 28 62 75 66 2c 20 22 72 75 5f 75 74 69 6d 65  f(buf, "ru_utime
28050 3d 25 64 2e 25 30 36 64 20 72 75 5f 73 74 69 6d  =%d.%06d ru_stim
28060 65 3d 25 64 2e 25 30 36 64 20 72 75 5f 6d 69 6e  e=%d.%06d ru_min
28070 66 6c 74 3d 25 64 20 72 75 5f 6d 61 6a 66 6c 74  flt=%d ru_majflt
28080 3d 25 64 22 2c 20 0a 20 20 20 20 28 69 6e 74 29  =%d", .    (int)
28090 72 2e 72 75 5f 75 74 69 6d 65 2e 74 76 5f 73 65  r.ru_utime.tv_se
280a0 63 2c 20 28 69 6e 74 29 72 2e 72 75 5f 75 74 69  c, (int)r.ru_uti
280b0 6d 65 2e 74 76 5f 75 73 65 63 2c 20 0a 20 20 20  me.tv_usec, .   
280c0 20 28 69 6e 74 29 72 2e 72 75 5f 73 74 69 6d 65   (int)r.ru_stime
280d0 2e 74 76 5f 73 65 63 2c 20 28 69 6e 74 29 72 2e  .tv_sec, (int)r.
280e0 72 75 5f 73 74 69 6d 65 2e 74 76 5f 75 73 65 63  ru_stime.tv_usec
280f0 2c 20 0a 20 20 20 20 28 69 6e 74 29 72 2e 72 75  , .    (int)r.ru
28100 5f 6d 69 6e 66 6c 74 2c 20 28 69 6e 74 29 72 2e  _minflt, (int)r.
28110 72 75 5f 6d 61 6a 66 6c 74 0a 20 20 29 3b 0a 20  ru_majflt.  );. 
28120 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
28130 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65  t(interp, Tcl_Ne
28140 77 53 74 72 69 6e 67 4f 62 6a 28 62 75 66 2c 20  wStringObj(buf, 
28150 2d 31 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  -1));.  return T
28160 43 4c 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  CL_OK;.}.#endif.
28170 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
28180 49 4e 0a 2f 2a 0a 2a 2a 20 49 6e 66 6f 72 6d 61  IN./*.** Informa
28190 74 69 6f 6e 20 70 61 73 73 65 64 20 66 72 6f 6d  tion passed from
281a0 20 74 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64   the main thread
281b0 20 69 6e 74 6f 20 74 68 65 20 77 69 6e 64 6f 77   into the window
281c0 73 20 66 69 6c 65 20 6c 6f 63 6b 65 72 0a 2a 2a  s file locker.**
281d0 20 62 61 63 6b 67 72 6f 75 6e 64 20 74 68 72 65   background thre
281e0 61 64 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 77 69  ad..*/.struct wi
281f0 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 7b 0a  n32FileLocker {.
28200 20 20 63 68 61 72 20 2a 65 76 4e 61 6d 65 3b 20    char *evName; 
28210 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
28220 20 65 76 65 6e 74 20 74 6f 20 73 69 67 6e 61 6c   event to signal
28230 20 74 68 72 65 61 64 20 73 74 61 72 74 75 70 20   thread startup 
28240 2a 2f 0a 20 20 48 41 4e 44 4c 45 20 68 3b 20 20  */.  HANDLE h;  
28250 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 6e 64           /* Hand
28260 6c 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74  le of the file t
28270 6f 20 62 65 20 6c 6f 63 6b 65 64 20 2a 2f 0a 20  o be locked */. 
28280 20 69 6e 74 20 64 65 6c 61 79 31 3b 20 20 20 20   int delay1;    
28290 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62 65       /* Delay be
282a0 66 6f 72 65 20 6c 6f 63 6b 69 6e 67 20 2a 2f 0a  fore locking */.
282b0 20 20 69 6e 74 20 64 65 6c 61 79 32 3b 20 20 20    int delay2;   
282c0 20 20 20 20 20 20 2f 2a 20 44 65 6c 61 79 20 62        /* Delay b
282d0 65 66 6f 72 65 20 75 6e 6c 6f 63 6b 69 6e 67 20  efore unlocking 
282e0 2a 2f 0a 20 20 69 6e 74 20 6f 6b 3b 20 20 20 20  */.  int ok;    
282f0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6e 69           /* Fini
28300 73 68 65 64 20 6f 6b 20 2a 2f 0a 20 20 69 6e 74  shed ok */.  int
28310 20 65 72 72 3b 20 20 20 20 20 20 20 20 20 20 20   err;           
28320 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20 65   /* True if an e
28330 72 72 6f 72 20 6f 63 63 75 72 73 20 2a 2f 0a 7d  rror occurs */.}
28340 3b 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 53  ;.#endif...#if S
28350 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 23 69 6e  QLITE_OS_WIN.#in
28360 63 6c 75 64 65 20 3c 70 72 6f 63 65 73 73 2e 68  clude <process.h
28370 3e 0a 2f 2a 0a 2a 2a 20 54 68 65 20 62 61 63 6b  >./*.** The back
28380 67 72 6f 75 6e 64 20 74 68 72 65 61 64 20 74 68  ground thread th
28390 61 74 20 64 6f 65 73 20 66 69 6c 65 20 6c 6f 63  at does file loc
283a0 6b 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  king..*/.static 
283b0 76 6f 69 64 20 77 69 6e 33 32 5f 66 69 6c 65 5f  void win32_file_
283c0 6c 6f 63 6b 65 72 28 76 6f 69 64 20 2a 70 41 70  locker(void *pAp
283d0 70 44 61 74 61 29 7b 0a 20 20 73 74 72 75 63 74  pData){.  struct
283e0 20 77 69 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72   win32FileLocker
283f0 20 2a 70 20 3d 20 28 73 74 72 75 63 74 20 77 69   *p = (struct wi
28400 6e 33 32 46 69 6c 65 4c 6f 63 6b 65 72 2a 29 70  n32FileLocker*)p
28410 41 70 70 44 61 74 61 3b 0a 20 20 69 66 28 20 70  AppData;.  if( p
28420 2d 3e 65 76 4e 61 6d 65 20 29 7b 0a 20 20 20 20  ->evName ){.    
28430 48 41 4e 44 4c 45 20 65 76 20 3d 20 4f 70 65 6e  HANDLE ev = Open
28440 45 76 65 6e 74 28 45 56 45 4e 54 5f 4d 4f 44 49  Event(EVENT_MODI
28450 46 59 5f 53 54 41 54 45 2c 20 46 41 4c 53 45 2c  FY_STATE, FALSE,
28460 20 70 2d 3e 65 76 4e 61 6d 65 29 3b 0a 20 20 20   p->evName);.   
28470 20 69 66 20 28 20 65 76 20 29 7b 0a 20 20 20 20   if ( ev ){.    
28480 20 20 53 65 74 45 76 65 6e 74 28 65 76 29 3b 0a    SetEvent(ev);.
28490 20 20 20 20 20 20 43 6c 6f 73 65 48 61 6e 64 6c        CloseHandl
284a0 65 28 65 76 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(ev);.    }.  }
284b0 0a 20 20 69 66 28 20 70 2d 3e 64 65 6c 61 79 31  .  if( p->delay1
284c0 20 29 20 53 6c 65 65 70 28 70 2d 3e 64 65 6c 61   ) Sleep(p->dela
284d0 79 31 29 3b 0a 20 20 69 66 28 20 4c 6f 63 6b 46  y1);.  if( LockF
284e0 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30 2c 20  ile(p->h, 0, 0, 
284f0 31 30 30 30 30 30 30 30 30 2c 20 30 29 20 29 7b  100000000, 0) ){
28500 0a 20 20 20 20 53 6c 65 65 70 28 70 2d 3e 64 65  .    Sleep(p->de
28510 6c 61 79 32 29 3b 0a 20 20 20 20 55 6e 6c 6f 63  lay2);.    Unloc
28520 6b 46 69 6c 65 28 70 2d 3e 68 2c 20 30 2c 20 30  kFile(p->h, 0, 0
28530 2c 20 31 30 30 30 30 30 30 30 30 2c 20 30 29 3b  , 100000000, 0);
28540 0a 20 20 20 20 70 2d 3e 6f 6b 20 3d 20 31 3b 0a  .    p->ok = 1;.
28550 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
28560 65 72 72 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 43  err = 1;.  }.  C
28570 6c 6f 73 65 48 61 6e 64 6c 65 28 70 2d 3e 68 29  loseHandle(p->h)
28580 3b 0a 20 20 70 2d 3e 68 20 3d 20 30 3b 0a 20 20  ;.  p->h = 0;.  
28590 70 2d 3e 64 65 6c 61 79 31 20 3d 20 30 3b 0a 20  p->delay1 = 0;. 
285a0 20 70 2d 3e 64 65 6c 61 79 32 20 3d 20 30 3b 0a   p->delay2 = 0;.
285b0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  }.#endif..#if SQ
285c0 4c 49 54 45 5f 4f 53 5f 57 49 4e 0a 2f 2a 0a 2a  LITE_OS_WIN./*.*
285d0 2a 20 20 20 20 20 20 6c 6f 63 6b 5f 77 69 6e 33  *      lock_win3
285e0 32 5f 66 69 6c 65 20 46 49 4c 45 4e 41 4d 45 20  2_file FILENAME 
285f0 44 45 4c 41 59 31 20 44 45 4c 41 59 32 0a 2a 2a  DELAY1 DELAY2.**
28600 0a 2a 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75  .** Get an exclu
28610 73 69 76 65 20 6d 61 6e 64 69 74 6f 72 79 20 6c  sive manditory l
28620 6f 63 6b 20 6f 6e 20 66 69 6c 65 20 66 6f 72 20  ock on file for 
28630 44 45 4c 41 59 32 20 6d 69 6c 6c 69 73 65 63 6f  DELAY2 milliseco
28640 6e 64 73 2e 0a 2a 2a 20 57 61 69 74 20 44 45 4c  nds..** Wait DEL
28650 41 59 31 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73  AY1 milliseconds
28660 20 62 65 66 6f 72 65 20 61 63 71 75 69 72 69 6e   before acquirin
28670 67 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73  g the lock..*/.s
28680 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
28690 66 69 6c 65 5f 6c 6f 63 6b 28 0a 20 20 76 6f 69  file_lock(.  voi
286a0 64 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a  d * clientData,.
286b0 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
286c0 74 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63  terp,.  int objc
286d0 2c 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e  ,.  Tcl_Obj *CON
286e0 53 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 73  ST objv[].){.  s
286f0 74 61 74 69 63 20 73 74 72 75 63 74 20 77 69 6e  tatic struct win
28700 33 32 46 69 6c 65 4c 6f 63 6b 65 72 20 78 20 3d  32FileLocker x =
28710 20 7b 20 22 77 69 6e 33 32 5f 66 69 6c 65 5f 6c   { "win32_file_l
28720 6f 63 6b 22 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ock", 0, 0, 0, 0
28730 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
28740 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 0a  har *zFilename;.
28750 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
28760 3b 0a 20 20 69 6e 74 20 72 65 74 72 79 20 3d 20  ;.  int retry = 
28770 30 3b 0a 20 20 48 41 4e 44 4c 45 20 65 76 3b 0a  0;.  HANDLE ev;.
28780 20 20 44 57 4f 52 44 20 77 52 65 73 75 6c 74 3b    DWORD wResult;
28790 0a 20 20 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  .  .  if( objc!=
287a0 34 20 26 26 20 6f 62 6a 63 21 3d 31 20 29 7b 0a  4 && objc!=1 ){.
287b0 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d      Tcl_WrongNum
287c0 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
287d0 6f 62 6a 76 2c 20 22 46 49 4c 45 4e 41 4d 45 20  objv, "FILENAME 
287e0 44 45 4c 41 59 31 20 44 45 4c 41 59 32 22 29 3b  DELAY1 DELAY2");
287f0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
28800 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28  ERROR;.  }.  if(
28810 20 6f 62 6a 63 3d 3d 31 20 29 7b 0a 20 20 20 20   objc==1 ){.    
28820 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
28830 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a  (sizeof(zBuf), z
28840 42 75 66 2c 20 22 25 64 20 25 64 20 25 64 20 25  Buf, "%d %d %d %
28850 64 20 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20  d %d",.         
28860 20 20 20 20 20 20 20 20 20 20 20 20 78 2e 6f 6b              x.ok
28870 2c 20 78 2e 65 72 72 2c 20 78 2e 64 65 6c 61 79  , x.err, x.delay
28880 31 2c 20 78 2e 64 65 6c 61 79 32 2c 20 78 2e 68  1, x.delay2, x.h
28890 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  );.    Tcl_Appen
288a0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
288b0 7a 42 75 66 2c 20 28 63 68 61 72 2a 29 30 29 3b  zBuf, (char*)0);
288c0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
288d0 4f 4b 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  OK;.  }.  while(
288e0 20 78 2e 68 20 26 26 20 72 65 74 72 79 3c 33 30   x.h && retry<30
288f0 20 29 7b 0a 20 20 20 20 72 65 74 72 79 2b 2b 3b   ){.    retry++;
28900 0a 20 20 20 20 53 6c 65 65 70 28 31 30 30 29 3b  .    Sleep(100);
28910 0a 20 20 7d 0a 20 20 69 66 28 20 78 2e 68 20 29  .  }.  if( x.h )
28920 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64  {.    Tcl_Append
28930 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
28940 62 75 73 79 22 2c 20 28 63 68 61 72 2a 29 30 29  busy", (char*)0)
28950 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
28960 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66  _ERROR;.  }.  if
28970 28 20 54 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d  ( Tcl_GetIntFrom
28980 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76  Obj(interp, objv
28990 5b 32 5d 2c 20 26 78 2e 64 65 6c 61 79 31 29 20  [2], &x.delay1) 
289a0 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ) return TCL_ERR
289b0 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47 65  OR;.  if( Tcl_Ge
289c0 74 49 6e 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65  tIntFromObj(inte
289d0 72 70 2c 20 6f 62 6a 76 5b 33 5d 2c 20 26 78 2e  rp, objv[3], &x.
289e0 64 65 6c 61 79 32 29 20 29 20 72 65 74 75 72 6e  delay2) ) return
289f0 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7a 46   TCL_ERROR;.  zF
28a00 69 6c 65 6e 61 6d 65 20 3d 20 54 63 6c 5f 47 65  ilename = Tcl_Ge
28a10 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 31 5d 29  tString(objv[1])
28a20 3b 0a 20 20 78 2e 68 20 3d 20 43 72 65 61 74 65  ;.  x.h = Create
28a30 46 69 6c 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  File(zFilename, 
28a40 47 45 4e 45 52 49 43 5f 52 45 41 44 7c 47 45 4e  GENERIC_READ|GEN
28a50 45 52 49 43 5f 57 52 49 54 45 2c 0a 20 20 20 20  ERIC_WRITE,.    
28a60 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 53            FILE_S
28a70 48 41 52 45 5f 52 45 41 44 7c 46 49 4c 45 5f 53  HARE_READ|FILE_S
28a80 48 41 52 45 5f 57 52 49 54 45 2c 20 30 2c 20 4f  HARE_WRITE, 0, O
28a90 50 45 4e 5f 41 4c 57 41 59 53 2c 0a 20 20 20 20  PEN_ALWAYS,.    
28aa0 20 20 20 20 20 20 20 20 20 20 46 49 4c 45 5f 41            FILE_A
28ab0 54 54 52 49 42 55 54 45 5f 4e 4f 52 4d 41 4c 2c  TTRIBUTE_NORMAL,
28ac0 20 30 29 3b 0a 20 20 69 66 28 20 21 78 2e 68 20   0);.  if( !x.h 
28ad0 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65 6e  ){.    Tcl_Appen
28ae0 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  dResult(interp, 
28af0 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
28b00 65 3a 20 22 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  e: ", zFilename,
28b10 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20 20   (char*)0);.    
28b20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
28b30 3b 0a 20 20 7d 0a 20 20 65 76 20 3d 20 43 72 65  ;.  }.  ev = Cre
28b40 61 74 65 45 76 65 6e 74 28 4e 55 4c 4c 2c 20 54  ateEvent(NULL, T
28b50 52 55 45 2c 20 46 41 4c 53 45 2c 20 78 2e 65 76  RUE, FALSE, x.ev
28b60 4e 61 6d 65 29 3b 0a 20 20 69 66 20 28 20 21 65  Name);.  if ( !e
28b70 76 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70  v ){.    Tcl_App
28b80 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70  endResult(interp
28b90 2c 20 22 63 61 6e 6e 6f 74 20 63 72 65 61 74 65  , "cannot create
28ba0 20 65 76 65 6e 74 3a 20 22 2c 20 78 2e 65 76 4e   event: ", x.evN
28bb0 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a  ame, (char*)0);.
28bc0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
28bd0 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 5f 62 65 67  RROR;.  }.  _beg
28be0 69 6e 74 68 72 65 61 64 28 77 69 6e 33 32 5f 66  inthread(win32_f
28bf0 69 6c 65 5f 6c 6f 63 6b 65 72 2c 20 30 2c 20 28  ile_locker, 0, (
28c00 76 6f 69 64 2a 29 26 78 29 3b 0a 20 20 53 6c 65  void*)&x);.  Sle
28c10 65 70 28 30 29 3b 0a 20 20 69 66 20 28 20 28 77  ep(0);.  if ( (w
28c20 52 65 73 75 6c 74 20 3d 20 57 61 69 74 46 6f 72  Result = WaitFor
28c30 53 69 6e 67 6c 65 4f 62 6a 65 63 74 28 65 76 2c  SingleObject(ev,
28c40 20 31 30 30 30 30 29 29 21 3d 57 41 49 54 5f 4f   10000))!=WAIT_O
28c50 42 4a 45 43 54 5f 30 20 29 7b 0a 20 20 20 20 73  BJECT_0 ){.    s
28c60 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
28c70 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
28c80 75 66 2c 20 22 30 78 25 78 22 2c 20 77 52 65 73  uf, "0x%x", wRes
28c90 75 6c 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70  ult);.    Tcl_Ap
28ca0 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72  pendResult(inter
28cb0 70 2c 20 22 77 61 69 74 20 66 61 69 6c 65 64 3a  p, "wait failed:
28cc0 20 22 2c 20 7a 42 75 66 2c 20 28 63 68 61 72 2a   ", zBuf, (char*
28cd0 29 30 29 3b 0a 20 20 20 20 43 6c 6f 73 65 48 61  )0);.    CloseHa
28ce0 6e 64 6c 65 28 65 76 29 3b 0a 20 20 20 20 72 65  ndle(ev);.    re
28cf0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a  turn TCL_ERROR;.
28d00 20 20 7d 0a 20 20 43 6c 6f 73 65 48 61 6e 64 6c    }.  CloseHandl
28d10 65 28 65 76 29 3b 0a 20 20 72 65 74 75 72 6e 20  e(ev);.  return 
28d20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
28d30 20 20 20 20 20 20 65 78 69 73 74 73 5f 77 69 6e        exists_win
28d40 33 32 5f 70 61 74 68 20 50 41 54 48 0a 2a 2a 0a  32_path PATH.**.
28d50 2a 2a 20 52 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ** Returns non-z
28d60 65 72 6f 20 69 66 20 74 68 65 20 73 70 65 63 69  ero if the speci
28d70 66 69 65 64 20 70 61 74 68 20 65 78 69 73 74 73  fied path exists
28d80 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79 20 71 75  , whose fully qu
28d90 61 6c 69 66 69 65 64 20 6e 61 6d 65 0a 2a 2a 20  alified name.** 
28da0 6d 61 79 20 65 78 63 65 65 64 20 32 36 30 20 63  may exceed 260 c
28db0 68 61 72 61 63 74 65 72 73 20 69 66 20 69 74 20  haracters if it 
28dc0 69 73 20 70 72 65 66 69 78 65 64 20 77 69 74 68  is prefixed with
28dd0 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74   "\\?\"..*/.stat
28de0 69 63 20 69 6e 74 20 77 69 6e 33 32 5f 65 78 69  ic int win32_exi
28df0 73 74 73 5f 70 61 74 68 28 0a 20 20 76 6f 69 64  sts_path(.  void
28e00 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
28e10 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
28e20 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
28e30 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
28e40 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
28e50 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
28e60 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
28e70 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
28e80 2c 20 22 50 41 54 48 22 29 3b 0a 20 20 20 20 72  , "PATH");.    r
28e90 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
28ea0 0a 20 20 7d 0a 20 20 54 63 6c 5f 53 65 74 4f 62  .  }.  Tcl_SetOb
28eb0 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20  jResult(interp, 
28ec0 54 63 6c 5f 4e 65 77 42 6f 6f 6c 65 61 6e 4f 62  Tcl_NewBooleanOb
28ed0 6a 28 0a 20 20 20 20 20 20 47 65 74 46 69 6c 65  j(.      GetFile
28ee0 41 74 74 72 69 62 75 74 65 73 57 28 20 54 63 6c  AttributesW( Tcl
28ef0 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a 76  _GetUnicode(objv
28f00 5b 31 5d 29 29 21 3d 49 4e 56 41 4c 49 44 5f 46  [1]))!=INVALID_F
28f10 49 4c 45 5f 41 54 54 52 49 42 55 54 45 53 20 29  ILE_ATTRIBUTES )
28f20 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  );.  return TCL_
28f30 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 20 20 20  OK;.}../*.**    
28f40 20 20 66 69 6e 64 5f 77 69 6e 33 32 5f 66 69 6c    find_win32_fil
28f50 65 20 50 41 54 54 45 52 4e 0a 2a 2a 0a 2a 2a 20  e PATTERN.**.** 
28f60 52 65 74 75 72 6e 73 20 61 20 6c 69 73 74 20 6f  Returns a list o
28f70 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 20 64  f entries in a d
28f80 69 72 65 63 74 6f 72 79 20 74 68 61 74 20 6d 61  irectory that ma
28f90 74 63 68 20 74 68 65 20 73 70 65 63 69 66 69 65  tch the specifie
28fa0 64 20 70 61 74 74 65 72 6e 2c 0a 2a 2a 20 77 68  d pattern,.** wh
28fb0 6f 73 65 20 66 75 6c 6c 79 20 71 75 61 6c 69 66  ose fully qualif
28fc0 69 65 64 20 6e 61 6d 65 20 6d 61 79 20 65 78 63  ied name may exc
28fd0 65 65 64 20 32 34 38 20 63 68 61 72 61 63 74 65  eed 248 characte
28fe0 72 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66  rs if it is pref
28ff0 69 78 65 64 20 77 69 74 68 0a 2a 2a 20 22 5c 5c  ixed with.** "\\
29000 3f 5c 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ?\"..*/.static i
29010 6e 74 20 77 69 6e 33 32 5f 66 69 6e 64 5f 66 69  nt win32_find_fi
29020 6c 65 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65  le(.  void *clie
29030 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e  ntData,.  Tcl_In
29040 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20  terp *interp,.  
29050 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f  int objc,.  Tcl_
29060 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b  Obj *CONST objv[
29070 5d 0a 29 7b 0a 20 20 48 41 4e 44 4c 45 20 68 46  ].){.  HANDLE hF
29080 69 6e 64 46 69 6c 65 20 3d 20 49 4e 56 41 4c 49  indFile = INVALI
29090 44 5f 48 41 4e 44 4c 45 5f 56 41 4c 55 45 3b 0a  D_HANDLE_VALUE;.
290a0 20 20 57 49 4e 33 32 5f 46 49 4e 44 5f 44 41 54    WIN32_FIND_DAT
290b0 41 57 20 66 69 6e 64 44 61 74 61 3b 0a 20 20 54  AW findData;.  T
290c0 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 4f 62 6a 3b  cl_Obj *listObj;
290d0 0a 20 20 44 57 4f 52 44 20 6c 61 73 74 45 72 72  .  DWORD lastErr
290e0 6e 6f 3b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d  no;.  if( objc!=
290f0 32 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f  2 ){.    Tcl_Wro
29100 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70  ngNumArgs(interp
29110 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 50 41 54 54  , 1, objv, "PATT
29120 45 52 4e 22 29 3b 0a 20 20 20 20 72 65 74 75 72  ERN");.    retur
29130 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29140 0a 20 20 68 46 69 6e 64 46 69 6c 65 20 3d 20 46  .  hFindFile = F
29150 69 6e 64 46 69 72 73 74 46 69 6c 65 57 28 54 63  indFirstFileW(Tc
29160 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62 6a  l_GetUnicode(obj
29170 76 5b 31 5d 29 2c 20 26 66 69 6e 64 44 61 74 61  v[1]), &findData
29180 29 3b 0a 20 20 69 66 28 20 68 46 69 6e 64 46 69  );.  if( hFindFi
29190 6c 65 3d 3d 49 4e 56 41 4c 49 44 5f 48 41 4e 44  le==INVALID_HAND
291a0 4c 45 5f 56 41 4c 55 45 20 29 7b 0a 20 20 20 20  LE_VALUE ){.    
291b0 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
291c0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77  (interp, Tcl_New
291d0 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74 4c 61  WideIntObj(GetLa
291e0 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20 20 20  stError()));.   
291f0 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29200 52 3b 0a 20 20 7d 0a 20 20 6c 69 73 74 4f 62 6a  R;.  }.  listObj
29210 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b   = Tcl_NewObj();
29220 0a 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f  .  Tcl_IncrRefCo
29230 75 6e 74 28 6c 69 73 74 4f 62 6a 29 3b 0a 20 20  unt(listObj);.  
29240 64 6f 20 7b 0a 20 20 20 20 54 63 6c 5f 4c 69 73  do {.    Tcl_Lis
29250 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
29260 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 4f 62  t(interp, listOb
29270 6a 2c 20 54 63 6c 5f 4e 65 77 55 6e 69 63 6f 64  j, Tcl_NewUnicod
29280 65 4f 62 6a 28 0a 20 20 20 20 20 20 20 20 66 69  eObj(.        fi
29290 6e 64 44 61 74 61 2e 63 46 69 6c 65 4e 61 6d 65  ndData.cFileName
292a0 2c 20 2d 31 29 29 3b 0a 20 20 20 20 54 63 6c 5f  , -1));.    Tcl_
292b0 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
292c0 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  ment(interp, lis
292d0 74 4f 62 6a 2c 20 54 63 6c 5f 4e 65 77 57 69 64  tObj, Tcl_NewWid
292e0 65 49 6e 74 4f 62 6a 28 0a 20 20 20 20 20 20 20  eIntObj(.       
292f0 20 66 69 6e 64 44 61 74 61 2e 64 77 46 69 6c 65   findData.dwFile
29300 41 74 74 72 69 62 75 74 65 73 29 29 3b 0a 20 20  Attributes));.  
29310 7d 20 77 68 69 6c 65 28 20 46 69 6e 64 4e 65 78  } while( FindNex
29320 74 46 69 6c 65 57 28 68 46 69 6e 64 46 69 6c 65  tFileW(hFindFile
29330 2c 20 26 66 69 6e 64 44 61 74 61 29 20 29 3b 0a  , &findData) );.
29340 20 20 6c 61 73 74 45 72 72 6e 6f 20 3d 20 47 65    lastErrno = Ge
29350 74 4c 61 73 74 45 72 72 6f 72 28 29 3b 0a 20 20  tLastError();.  
29360 69 66 28 20 6c 61 73 74 45 72 72 6e 6f 21 3d 4e  if( lastErrno!=N
29370 4f 5f 45 52 52 4f 52 20 26 26 20 6c 61 73 74 45  O_ERROR && lastE
29380 72 72 6e 6f 21 3d 45 52 52 4f 52 5f 4e 4f 5f 4d  rrno!=ERROR_NO_M
29390 4f 52 45 5f 46 49 4c 45 53 20 29 7b 0a 20 20 20  ORE_FILES ){.   
293a0 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 69 6e 64   FindClose(hFind
293b0 46 69 6c 65 29 3b 0a 20 20 20 20 54 63 6c 5f 44  File);.    Tcl_D
293c0 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74  ecrRefCount(list
293d0 4f 62 6a 29 3b 0a 20 20 20 20 54 63 6c 5f 53 65  Obj);.    Tcl_Se
293e0 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
293f0 70 2c 20 54 63 6c 5f 4e 65 77 57 69 64 65 49 6e  p, Tcl_NewWideIn
29400 74 4f 62 6a 28 47 65 74 4c 61 73 74 45 72 72 6f  tObj(GetLastErro
29410 72 28 29 29 29 3b 0a 20 20 20 20 72 65 74 75 72  r()));.    retur
29420 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
29430 0a 20 20 46 69 6e 64 43 6c 6f 73 65 28 68 46 69  .  FindClose(hFi
29440 6e 64 46 69 6c 65 29 3b 0a 20 20 54 63 6c 5f 53  ndFile);.  Tcl_S
29450 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65  etObjResult(inte
29460 72 70 2c 20 6c 69 73 74 4f 62 6a 29 3b 0a 20 20  rp, listObj);.  
29470 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
29480 0a 0a 2f 2a 0a 2a 2a 20 20 20 20 20 20 64 65 6c  ../*.**      del
29490 65 74 65 5f 77 69 6e 33 32 5f 66 69 6c 65 20 46  ete_win32_file F
294a0 49 4c 45 4e 41 4d 45 0a 2a 2a 0a 2a 2a 20 44 65  ILENAME.**.** De
294b0 6c 65 74 65 73 20 74 68 65 20 73 70 65 63 69 66  letes the specif
294c0 69 65 64 20 66 69 6c 65 2c 20 77 68 6f 73 65 20  ied file, whose 
294d0 66 75 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20  fully qualified 
294e0 6e 61 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20  name may exceed 
294f0 32 36 30 0a 2a 2a 20 63 68 61 72 61 63 74 65 72  260.** character
29500 73 20 69 66 20 69 74 20 69 73 20 70 72 65 66 69  s if it is prefi
29510 78 65 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e  xed with "\\?\".
29520 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
29530 69 6e 33 32 5f 64 65 6c 65 74 65 5f 66 69 6c 65  in32_delete_file
29540 28 0a 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e 74  (.  void *client
29550 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
29560 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
29570 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
29580 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
29590 29 7b 0a 20 20 69 66 28 20 6f 62 6a 63 21 3d 32  ){.  if( objc!=2
295a0 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72 6f 6e   ){.    Tcl_Wron
295b0 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
295c0 20 31 2c 20 6f 62 6a 76 2c 20 22 46 49 4c 45 4e   1, objv, "FILEN
295d0 41 4d 45 22 29 3b 0a 20 20 20 20 72 65 74 75 72  AME");.    retur
295e0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
295f0 0a 20 20 69 66 28 20 21 44 65 6c 65 74 65 46 69  .  if( !DeleteFi
29600 6c 65 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f  leW(Tcl_GetUnico
29610 64 65 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a  de(objv[1])) ){.
29620 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
29630 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
29640 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47  _NewWideIntObj(G
29650 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b  etLastError()));
29660 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
29670 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c  ERROR;.  }.  Tcl
29680 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74  _ResetResult(int
29690 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54  erp);.  return T
296a0 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  CL_OK;.}../*.** 
296b0 20 20 20 20 20 6d 61 6b 65 5f 77 69 6e 33 32 5f       make_win32_
296c0 64 69 72 20 44 49 52 45 43 54 4f 52 59 0a 2a 2a  dir DIRECTORY.**
296d0 0a 2a 2a 20 43 72 65 61 74 65 73 20 74 68 65 20  .** Creates the 
296e0 73 70 65 63 69 66 69 65 64 20 64 69 72 65 63 74  specified direct
296f0 6f 72 79 2c 20 77 68 6f 73 65 20 66 75 6c 6c 79  ory, whose fully
29700 20 71 75 61 6c 69 66 69 65 64 20 6e 61 6d 65 20   qualified name 
29710 6d 61 79 20 65 78 63 65 65 64 20 32 34 38 0a 2a  may exceed 248.*
29720 2a 20 63 68 61 72 61 63 74 65 72 73 20 69 66 20  * characters if 
29730 69 74 20 69 73 20 70 72 65 66 69 78 65 64 20 77  it is prefixed w
29740 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a 2f 0a 73  ith "\\?\"..*/.s
29750 74 61 74 69 63 20 69 6e 74 20 77 69 6e 33 32 5f  tatic int win32_
29760 6d 6b 64 69 72 28 0a 20 20 76 6f 69 64 20 2a 63  mkdir(.  void *c
29770 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 54 63 6c  lientData,.  Tcl
29780 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
29790 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 54  .  int objc,.  T
297a0 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54 20 6f 62  cl_Obj *CONST ob
297b0 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28 20 6f 62  jv[].){.  if( ob
297c0 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20 54 63 6c  jc!=2 ){.    Tcl
297d0 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e  _WrongNumArgs(in
297e0 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22  terp, 1, objv, "
297f0 44 49 52 45 43 54 4f 52 59 22 29 3b 0a 20 20 20  DIRECTORY");.   
29800 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f   return TCL_ERRO
29810 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 43 72  R;.  }.  if( !Cr
29820 65 61 74 65 44 69 72 65 63 74 6f 72 79 57 28 54  eateDirectoryW(T
29830 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65 28 6f 62  cl_GetUnicode(ob
29840 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c 29 20 29 7b  jv[1]), NULL) ){
29850 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52  .    Tcl_SetObjR
29860 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63  esult(interp, Tc
29870 6c 5f 4e 65 77 57 69 64 65 49 6e 74 4f 62 6a 28  l_NewWideIntObj(
29880 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 29 29  GetLastError()))
29890 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ;.    return TCL
298a0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63  _ERROR;.  }.  Tc
298b0 6c 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e  l_ResetResult(in
298c0 74 65 72 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  terp);.  return 
298d0 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  TCL_OK;.}../*.**
298e0 20 20 20 20 20 20 72 65 6d 6f 76 65 5f 77 69 6e        remove_win
298f0 33 32 5f 64 69 72 20 44 49 52 45 43 54 4f 52 59  32_dir DIRECTORY
29900 0a 2a 2a 0a 2a 2a 20 52 65 6d 6f 76 65 73 20 74  .**.** Removes t
29910 68 65 20 73 70 65 63 69 66 69 65 64 20 64 69 72  he specified dir
29920 65 63 74 6f 72 79 2c 20 77 68 6f 73 65 20 66 75  ectory, whose fu
29930 6c 6c 79 20 71 75 61 6c 69 66 69 65 64 20 6e 61  lly qualified na
29940 6d 65 20 6d 61 79 20 65 78 63 65 65 64 20 32 34  me may exceed 24
29950 38 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 73 20  8.** characters 
29960 69 66 20 69 74 20 69 73 20 70 72 65 66 69 78 65  if it is prefixe
29970 64 20 77 69 74 68 20 22 5c 5c 3f 5c 22 2e 0a 2a  d with "\\?\"..*
29980 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 6e  /.static int win
29990 33 32 5f 72 6d 64 69 72 28 0a 20 20 76 6f 69 64  32_rmdir(.  void
299a0 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20   *clientData,.  
299b0 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
299c0 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c 0a  rp,.  int objc,.
299d0 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53 54    Tcl_Obj *CONST
299e0 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 69 66 28   objv[].){.  if(
299f0 20 6f 62 6a 63 21 3d 32 20 29 7b 0a 20 20 20 20   objc!=2 ){.    
29a00 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73  Tcl_WrongNumArgs
29a10 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76  (interp, 1, objv
29a20 2c 20 22 44 49 52 45 43 54 4f 52 59 22 29 3b 0a  , "DIRECTORY");.
29a30 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
29a40 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
29a50 21 52 65 6d 6f 76 65 44 69 72 65 63 74 6f 72 79  !RemoveDirectory
29a60 57 28 54 63 6c 5f 47 65 74 55 6e 69 63 6f 64 65  W(Tcl_GetUnicode
29a70 28 6f 62 6a 76 5b 31 5d 29 29 20 29 7b 0a 20 20  (objv[1])) ){.  
29a80 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
29a90 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e  lt(interp, Tcl_N
29aa0 65 77 57 69 64 65 49 6e 74 4f 62 6a 28 47 65 74  ewWideIntObj(Get
29ab0 4c 61 73 74 45 72 72 6f 72 28 29 29 29 3b 0a 20  LastError()));. 
29ac0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
29ad0 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 52  ROR;.  }.  Tcl_R
29ae0 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 65 72  esetResult(inter
29af0 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c  p);.  return TCL
29b00 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a  _OK;.}.#endif...
29b10 2f 2a 0a 2a 2a 20 20 20 20 20 20 6f 70 74 69 6d  /*.**      optim
29b20 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 20  ization_control 
29b30 44 42 20 4f 50 54 20 42 4f 4f 4c 45 41 4e 0a 2a  DB OPT BOOLEAN.*
29b40 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
29b50 69 73 61 62 6c 65 20 71 75 65 72 79 20 6f 70 74  isable query opt
29b60 69 6d 69 7a 61 74 69 6f 6e 73 20 75 73 69 6e 67  imizations using
29b70 20 74 68 65 20 73 71 6c 69 74 65 33 5f 74 65 73   the sqlite3_tes
29b80 74 5f 63 6f 6e 74 72 6f 6c 28 29 0a 2a 2a 20 69  t_control().** i
29b90 6e 74 65 72 66 61 63 65 2e 20 20 44 69 73 61 62  nterface.  Disab
29ba0 6c 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73  le if BOOLEAN is
29bb0 20 66 61 6c 73 65 20 61 6e 64 20 65 6e 61 62 6c   false and enabl
29bc0 65 20 69 66 20 42 4f 4f 4c 45 41 4e 20 69 73 20  e if BOOLEAN is 
29bd0 74 72 75 65 2e 0a 2a 2a 20 4f 50 54 20 69 73 20  true..** OPT is 
29be0 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
29bf0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 74 6f 20  optimization to 
29c00 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 2a 2f 0a  be disabled..*/.
29c10 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6d  static int optim
29c20 69 7a 61 74 69 6f 6e 5f 63 6f 6e 74 72 6f 6c 28  ization_control(
29c30 0a 20 20 76 6f 69 64 20 2a 20 63 6c 69 65 6e 74  .  void * client
29c40 44 61 74 61 2c 0a 20 20 54 63 6c 5f 49 6e 74 65  Data,.  Tcl_Inte
29c50 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 69 6e  rp *interp,.  in
29c60 74 20 6f 62 6a 63 2c 0a 20 20 54 63 6c 5f 4f 62  t objc,.  Tcl_Ob
29c70 6a 20 2a 43 4f 4e 53 54 20 6f 62 6a 76 5b 5d 0a  j *CONST objv[].
29c80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71  ){.  int i;.  sq
29c90 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63 6f 6e  lite3 *db;.  con
29ca0 73 74 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20  st char *zOpt;. 
29cb0 20 69 6e 74 20 6f 6e 6f 66 66 3b 0a 20 20 69 6e   int onoff;.  in
29cc0 74 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 73 74  t mask = 0;.  st
29cd0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
29ce0 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  t {.    const ch
29cf0 61 72 20 2a 7a 4f 70 74 4e 61 6d 65 3b 0a 20 20  ar *zOptName;.  
29d00 20 20 69 6e 74 20 6d 61 73 6b 3b 0a 20 20 7d 20    int mask;.  } 
29d10 61 4f 70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b  aOpt[] = {.    {
29d20 20 22 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20   "all",         
29d30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 41          SQLITE_A
29d40 6c 6c 4f 70 74 73 20 20 20 20 20 20 20 20 7d 2c  llOpts        },
29d50 0a 20 20 20 20 7b 20 22 6e 6f 6e 65 22 2c 20 20  .    { "none",  
29d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
29d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29d80 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 71 75      },.    { "qu
29d90 65 72 79 2d 66 6c 61 74 74 65 6e 65 72 22 2c 20  ery-flattener", 
29da0 20 20 20 20 53 51 4c 49 54 45 5f 51 75 65 72 79      SQLITE_Query
29db0 46 6c 61 74 74 65 6e 65 72 20 7d 2c 0a 20 20 20  Flattener },.   
29dc0 20 7b 20 22 63 6f 6c 75 6d 6e 2d 63 61 63 68 65   { "column-cache
29dd0 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
29de0 5f 43 6f 6c 75 6d 6e 43 61 63 68 65 20 20 20 20  _ColumnCache    
29df0 7d 2c 0a 20 20 20 20 7b 20 22 67 72 6f 75 70 62  },.    { "groupb
29e00 79 2d 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20  y-order",       
29e10 53 51 4c 49 54 45 5f 47 72 6f 75 70 42 79 4f 72  SQLITE_GroupByOr
29e20 64 65 72 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  der   },.    { "
29e30 66 61 63 74 6f 72 2d 63 6f 6e 73 74 61 6e 74 73  factor-constants
29e40 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 61 63  ",    SQLITE_Fac
29e50 74 6f 72 4f 75 74 43 6f 6e 73 74 20 7d 2c 0a 20  torOutConst },. 
29e60 20 20 20 7b 20 22 72 65 61 6c 2d 61 73 2d 69 6e     { "real-as-in
29e70 74 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49  t",         SQLI
29e80 54 45 5f 49 64 78 52 65 61 6c 41 73 49 6e 74 20  TE_IdxRealAsInt 
29e90 20 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 73 74    },.    { "dist
29ea0 69 6e 63 74 2d 6f 70 74 22 2c 20 20 20 20 20 20  inct-opt",      
29eb0 20 20 53 51 4c 49 54 45 5f 44 69 73 74 69 6e 63    SQLITE_Distinc
29ec0 74 4f 70 74 20 20 20 20 7d 2c 0a 20 20 20 20 7b  tOpt    },.    {
29ed0 20 22 63 6f 76 65 72 2d 69 64 78 2d 73 63 61 6e   "cover-idx-scan
29ee0 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 43  ",      SQLITE_C
29ef0 6f 76 65 72 49 64 78 53 63 61 6e 20 20 20 7d 2c  overIdxScan   },
29f00 0a 20 20 20 20 7b 20 22 6f 72 64 65 72 2d 62 79  .    { "order-by
29f10 2d 69 64 78 2d 6a 6f 69 6e 22 2c 20 20 20 53 51  -idx-join",   SQ
29f20 4c 49 54 45 5f 4f 72 64 65 72 42 79 49 64 78 4a  LITE_OrderByIdxJ
29f30 6f 69 6e 20 7d 2c 0a 20 20 20 20 7b 20 22 74 72  oin },.    { "tr
29f40 61 6e 73 69 74 69 76 65 22 2c 20 20 20 20 20 20  ansitive",      
29f50 20 20 20 20 53 51 4c 49 54 45 5f 54 72 61 6e 73      SQLITE_Trans
29f60 69 74 69 76 65 20 20 20 20 20 7d 2c 0a 20 20 20  itive     },.   
29f70 20 7b 20 22 73 75 62 71 75 65 72 79 2d 63 6f 72   { "subquery-cor
29f80 6f 75 74 69 6e 65 22 2c 20 20 53 51 4c 49 54 45  outine",  SQLITE
29f90 5f 53 75 62 71 43 6f 72 6f 75 74 69 6e 65 20 20  _SubqCoroutine  
29fa0 7d 2c 0a 20 20 20 20 7b 20 22 6f 6d 69 74 2d 6e  },.    { "omit-n
29fb0 6f 6f 70 2d 6a 6f 69 6e 22 2c 20 20 20 20 20 20  oop-join",      
29fc0 53 51 4c 49 54 45 5f 4f 6d 69 74 4e 6f 6f 70 4a  SQLITE_OmitNoopJ
29fd0 6f 69 6e 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22  oin   },.    { "
29fe0 73 74 61 74 33 22 2c 20 20 20 20 20 20 20 20 20  stat3",         
29ff0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 53 74 61        SQLITE_Sta
2a000 74 33 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  t3          },. 
2a010 20 7d 3b 0a 0a 20 20 69 66 28 20 6f 62 6a 63 21   };..  if( objc!
2a020 3d 34 20 29 7b 0a 20 20 20 20 54 63 6c 5f 57 72  =4 ){.    Tcl_Wr
2a030 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72  ongNumArgs(inter
2a040 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 44 42 20  p, 1, objv, "DB 
2a050 4f 50 54 20 42 4f 4f 4c 45 41 4e 22 29 3b 0a 20  OPT BOOLEAN");. 
2a060 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2a070 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20 67  ROR;.  }.  if( g
2a080 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74 65  etDbPointer(inte
2a090 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69 6e  rp, Tcl_GetStrin
2a0a0 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62 29  g(objv[1]), &db)
2a0b0 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52   ) return TCL_ER
2a0c0 52 4f 52 3b 0a 20 20 69 66 28 20 54 63 6c 5f 47  ROR;.  if( Tcl_G
2a0d0 65 74 42 6f 6f 6c 65 61 6e 46 72 6f 6d 4f 62 6a  etBooleanFromObj
2a0e0 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 33 5d  (interp, objv[3]
2a0f0 2c 20 26 6f 6e 6f 66 66 29 20 29 20 72 65 74 75  , &onoff) ) retu
2a100 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
2a110 7a 4f 70 74 20 3d 20 54 63 6c 5f 47 65 74 53 74  zOpt = Tcl_GetSt
2a120 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 20  ring(objv[2]);. 
2a130 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2a140 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28  of(aOpt)/sizeof(
2a150 61 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aOpt[0]); i++){.
2a160 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2a170 4f 70 74 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70  Opt, aOpt[i].zOp
2a180 74 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20  tName)==0 ){.   
2a190 20 20 20 6d 61 73 6b 20 3d 20 61 4f 70 74 5b 69     mask = aOpt[i
2a1a0 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 62 72  ].mask;.      br
2a1b0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
2a1c0 20 69 66 28 20 6f 6e 6f 66 66 20 29 20 6d 61 73   if( onoff ) mas
2a1d0 6b 20 3d 20 7e 6d 61 73 6b 3b 0a 20 20 69 66 28  k = ~mask;.  if(
2a1e0 20 69 3e 3d 73 69 7a 65 6f 66 28 61 4f 70 74 29   i>=sizeof(aOpt)
2a1f0 2f 73 69 7a 65 6f 66 28 61 4f 70 74 5b 30 5d 29  /sizeof(aOpt[0])
2a200 20 29 7b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65   ){.    Tcl_Appe
2a210 6e 64 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  ndResult(interp,
2a220 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6d 69   "unknown optimi
2a230 7a 61 74 69 6f 6e 20 2d 20 73 68 6f 75 6c 64 20  zation - should 
2a240 62 65 20 6f 6e 65 20 6f 66 3a 22 2c 0a 20 20 20  be one of:",.   
2a250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a260 20 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20    (char*)0);.   
2a270 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73 69 7a 65   for(i=0; i<size
2a280 6f 66 28 61 4f 70 74 29 2f 73 69 7a 65 6f 66 28  of(aOpt)/sizeof(
2a290 61 4f 70 74 5b 30 5d 29 3b 20 69 2b 2b 29 7b 0a  aOpt[0]); i++){.
2a2a0 20 20 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64        Tcl_Append
2a2b0 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22  Result(interp, "
2a2c0 20 22 2c 20 61 4f 70 74 5b 69 5d 2e 7a 4f 70 74   ", aOpt[i].zOpt
2a2d0 4e 61 6d 65 2c 20 28 63 68 61 72 2a 29 30 29 3b  Name, (char*)0);
2a2e0 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
2a2f0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 7d  n TCL_ERROR;.  }
2a300 0a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  .  sqlite3_test_
2a310 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2a320 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41  ESTCTRL_OPTIMIZA
2a330 54 49 4f 4e 53 2c 20 64 62 2c 20 6d 61 73 6b 29  TIONS, db, mask)
2a340 3b 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f  ;.  return TCL_O
2a350 4b 3b 0a 7d 0a 0a 74 79 70 65 64 65 66 20 73 74  K;.}..typedef st
2a360 72 75 63 74 20 73 71 6c 69 74 65 33 5f 61 70 69  ruct sqlite3_api
2a370 5f 72 6f 75 74 69 6e 65 73 20 73 71 6c 69 74 65  _routines sqlite
2a380 33 5f 61 70 69 5f 72 6f 75 74 69 6e 65 73 3b 0a  3_api_routines;.
2a390 2f 2a 0a 2a 2a 20 20 20 20 20 6c 6f 61 64 5f 73  /*.**     load_s
2a3a0 74 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 20  tatic_extension 
2a3b0 44 42 20 4e 41 4d 45 20 2e 2e 2e 0a 2a 2a 0a 2a  DB NAME ....**.*
2a3c0 2a 20 4c 6f 61 64 20 6f 6e 65 20 6f 72 20 6d 6f  * Load one or mo
2a3d0 72 65 20 73 74 61 74 69 63 61 6c 6c 79 20 6c 69  re statically li
2a3e0 6e 6b 65 64 20 65 78 74 65 6e 73 69 6f 6e 73 2e  nked extensions.
2a3f0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
2a400 63 6c 4c 6f 61 64 53 74 61 74 69 63 45 78 74 65  clLoadStaticExte
2a410 6e 73 69 6f 6e 43 6d 64 28 0a 20 20 76 6f 69 64  nsionCmd(.  void
2a420 20 2a 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20   * clientData,. 
2a430 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74   Tcl_Interp *int
2a440 65 72 70 2c 0a 20 20 69 6e 74 20 6f 62 6a 63 2c  erp,.  int objc,
2a450 0a 20 20 54 63 6c 5f 4f 62 6a 20 2a 43 4f 4e 53  .  Tcl_Obj *CONS
2a460 54 20 6f 62 6a 76 5b 5d 0a 29 7b 0a 20 20 65 78  T objv[].){.  ex
2a470 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2a480 5f 61 6d 61 74 63 68 5f 69 6e 69 74 28 73 71 6c  _amatch_init(sql
2a490 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2a4a0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2a4b0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2a4c0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2a4d0 63 6c 6f 73 75 72 65 5f 69 6e 69 74 28 73 71 6c  closure_init(sql
2a4e0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2a4f0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2a500 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2a510 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2a520 66 75 7a 7a 65 72 5f 69 6e 69 74 28 73 71 6c 69  fuzzer_init(sqli
2a530 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2a540 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2a550 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2a560 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
2a570 65 65 65 5f 69 6e 69 74 28 73 71 6c 69 74 65 33  eee_init(sqlite3
2a580 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20 73  *,char**,const s
2a590 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74 69  qlite3_api_routi
2a5a0 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e 20  nes*);.  extern 
2a5b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 6e 65 78 74  int sqlite3_next
2a5c0 63 68 61 72 5f 69 6e 69 74 28 73 71 6c 69 74 65  char_init(sqlite
2a5d0 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73 74 20  3*,char**,const 
2a5e0 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f 75 74  sqlite3_api_rout
2a5f0 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65 72 6e  ines*);.  extern
2a600 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 65 72   int sqlite3_per
2a610 63 65 6e 74 69 6c 65 5f 69 6e 69 74 28 73 71 6c  centile_init(sql
2a620 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2a630 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2a640 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2a650 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2a660 72 65 67 65 78 70 5f 69 6e 69 74 28 73 71 6c 69  regexp_init(sqli
2a670 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2a680 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2a690 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2a6a0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  rn int sqlite3_s
2a6b0 70 65 6c 6c 66 69 78 5f 69 6e 69 74 28 73 71 6c  pellfix_init(sql
2a6c0 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e  ite3*,char**,con
2a6d0 73 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72  st sqlite3_api_r
2a6e0 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74  outines*);.  ext
2a6f0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
2a700 74 6f 74 79 70 65 5f 69 6e 69 74 28 73 71 6c 69  totype_init(sqli
2a710 74 65 33 2a 2c 63 68 61 72 2a 2a 2c 63 6f 6e 73  te3*,char**,cons
2a720 74 20 73 71 6c 69 74 65 33 5f 61 70 69 5f 72 6f  t sqlite3_api_ro
2a730 75 74 69 6e 65 73 2a 29 3b 0a 20 20 65 78 74 65  utines*);.  exte
2a740 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  rn int sqlite3_w
2a750 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 28  holenumber_init(
2a760 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a 2c  sqlite3*,char**,
2a770 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61 70  const sqlite3_ap
2a780 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20 20  i_routines*);.  
2a790 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
2a7a0 75 63 74 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  uct {.    const 
2a7b0 63 68 61 72 20 2a 7a 45 78 74 4e 61 6d 65 3b 0a  char *zExtName;.
2a7c0 20 20 20 20 69 6e 74 20 28 2a 70 49 6e 69 74 29      int (*pInit)
2a7d0 28 73 71 6c 69 74 65 33 2a 2c 63 68 61 72 2a 2a  (sqlite3*,char**
2a7e0 2c 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 61  ,const sqlite3_a
2a7f0 70 69 5f 72 6f 75 74 69 6e 65 73 2a 29 3b 0a 20  pi_routines*);. 
2a800 20 7d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 5d 20   } aExtension[] 
2a810 3d 20 7b 0a 20 20 20 20 7b 20 22 61 6d 61 74 63  = {.    { "amatc
2a820 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  h",             
2a830 20 20 20 73 71 6c 69 74 65 33 5f 61 6d 61 74 63     sqlite3_amatc
2a840 68 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  h_init          
2a850 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 63       },.    { "c
2a860 6c 6f 73 75 72 65 22 2c 20 20 20 20 20 20 20 20  losure",        
2a870 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
2a880 6c 6f 73 75 72 65 5f 69 6e 69 74 20 20 20 20 20  losure_init     
2a890 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2a8a0 7b 20 22 66 75 7a 7a 65 72 22 2c 20 20 20 20 20  { "fuzzer",     
2a8b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2a8c0 65 33 5f 66 75 7a 7a 65 72 5f 69 6e 69 74 20 20  e3_fuzzer_init  
2a8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2a8e0 20 20 20 20 7b 20 22 69 65 65 65 37 35 34 22 2c      { "ieee754",
2a8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2a900 71 6c 69 74 65 33 5f 69 65 65 65 5f 69 6e 69 74  qlite3_ieee_init
2a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a920 20 7d 2c 0a 20 20 20 20 7b 20 22 6e 65 78 74 63   },.    { "nextc
2a930 68 61 72 22 2c 20 20 20 20 20 20 20 20 20 20 20  har",           
2a940 20 20 20 73 71 6c 69 74 65 33 5f 6e 65 78 74 63     sqlite3_nextc
2a950 68 61 72 5f 69 6e 69 74 20 20 20 20 20 20 20 20  har_init        
2a960 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 70       },.    { "p
2a970 65 72 63 65 6e 74 69 6c 65 22 2c 20 20 20 20 20  ercentile",     
2a980 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 70         sqlite3_p
2a990 65 72 63 65 6e 74 69 6c 65 5f 69 6e 69 74 20 20  ercentile_init  
2a9a0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2a9b0 7b 20 22 72 65 67 65 78 70 22 2c 20 20 20 20 20  { "regexp",     
2a9c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2a9d0 65 33 5f 72 65 67 65 78 70 5f 69 6e 69 74 20 20  e3_regexp_init  
2a9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2a9f0 20 20 20 20 7b 20 22 73 70 65 6c 6c 66 69 78 22      { "spellfix"
2aa00 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,              s
2aa10 71 6c 69 74 65 33 5f 73 70 65 6c 6c 66 69 78 5f  qlite3_spellfix_
2aa20 69 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20  init            
2aa30 20 7d 2c 0a 20 20 20 20 7b 20 22 74 6f 74 79 70   },.    { "totyp
2aa40 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e",             
2aa50 20 20 20 73 71 6c 69 74 65 33 5f 74 6f 74 79 70     sqlite3_totyp
2aa60 65 5f 69 6e 69 74 20 20 20 20 20 20 20 20 20 20  e_init          
2aa70 20 20 20 20 20 7d 2c 0a 20 20 20 20 7b 20 22 77       },.    { "w
2aa80 68 6f 6c 65 6e 75 6d 62 65 72 22 2c 20 20 20 20  holenumber",    
2aa90 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 77         sqlite3_w
2aaa0 68 6f 6c 65 6e 75 6d 62 65 72 5f 69 6e 69 74 20  holenumber_init 
2aab0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d 3b           },.  };
2aac0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
2aad0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
2aae0 61 6d 65 3b 0a 20 20 69 6e 74 20 69 2c 20 6a 2c  ame;.  int i, j,
2aaf0 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
2ab00 72 4d 73 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  rMsg = 0;.  if( 
2ab10 6f 62 6a 63 3c 33 20 29 7b 0a 20 20 20 20 54 63  objc<3 ){.    Tc
2ab20 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69  l_WrongNumArgs(i
2ab30 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20  nterp, 1, objv, 
2ab40 22 44 42 20 4e 41 4d 45 20 2e 2e 2e 22 29 3b 0a  "DB NAME ...");.
2ab50 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
2ab60 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 69 66 28 20  RROR;.  }.  if( 
2ab70 67 65 74 44 62 50 6f 69 6e 74 65 72 28 69 6e 74  getDbPointer(int
2ab80 65 72 70 2c 20 54 63 6c 5f 47 65 74 53 74 72 69  erp, Tcl_GetStri
2ab90 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 26 64 62  ng(objv[1]), &db
2aba0 29 20 29 20 72 65 74 75 72 6e 20 54 43 4c 5f 45  ) ) return TCL_E
2abb0 52 52 4f 52 3b 0a 20 20 66 6f 72 28 6a 3d 32 3b  RROR;.  for(j=2;
2abc0 20 6a 3c 6f 62 6a 63 3b 20 6a 2b 2b 29 7b 0a 20   j<objc; j++){. 
2abd0 20 20 20 7a 4e 61 6d 65 20 3d 20 54 63 6c 5f 47     zName = Tcl_G
2abe0 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 6a 5d  etString(objv[j]
2abf0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  );.    for(i=0; 
2ac00 69 3c 41 72 72 61 79 53 69 7a 65 28 61 45 78 74  i<ArraySize(aExt
2ac10 65 6e 73 69 6f 6e 29 3b 20 69 2b 2b 29 7b 0a 20  ension); i++){. 
2ac20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2ac30 7a 4e 61 6d 65 2c 20 61 45 78 74 65 6e 73 69 6f  zName, aExtensio
2ac40 6e 5b 69 5d 2e 7a 45 78 74 4e 61 6d 65 29 3d 3d  n[i].zExtName)==
2ac50 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  0 ) break;.    }
2ac60 0a 20 20 20 20 69 66 28 20 69 3e 3d 41 72 72 61  .    if( i>=Arra
2ac70 79 53 69 7a 65 28 61 45 78 74 65 6e 73 69 6f 6e  ySize(aExtension
2ac80 29 20 29 7b 0a 20 20 20 20 20 20 54 63 6c 5f 41  ) ){.      Tcl_A
2ac90 70 70 65 6e 64 52 65 73 75 6c 74 28 69 6e 74 65  ppendResult(inte
2aca0 72 70 2c 20 22 6e 6f 20 73 75 63 68 20 65 78 74  rp, "no such ext
2acb0 65 6e 73 69 6f 6e 3a 20 22 2c 20 7a 4e 61 6d 65  ension: ", zName
2acc0 2c 20 28 63 68 61 72 2a 29 30 29 3b 0a 20 20 20  , (char*)0);.   
2acd0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52     return TCL_ER
2ace0 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  ROR;.    }.    r
2acf0 63 20 3d 20 61 45 78 74 65 6e 73 69 6f 6e 5b 69  c = aExtension[i
2ad00 5d 2e 70 49 6e 69 74 28 64 62 2c 20 26 7a 45 72  ].pInit(db, &zEr
2ad10 72 4d 73 67 2c 20 30 29 3b 0a 20 20 20 20 69 66  rMsg, 0);.    if
2ad20 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2ad30 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  || zErrMsg ){.  
2ad40 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 52 65      Tcl_AppendRe
2ad50 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 22 69 6e  sult(interp, "in
2ad60 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20  itialization of 
2ad70 22 2c 20 7a 4e 61 6d 65 2c 20 22 20 66 61 69 6c  ", zName, " fail
2ad80 65 64 3a 20 22 2c 20 7a 45 72 72 4d 73 67 2c 0a  ed: ", zErrMsg,.
2ad90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ada0 20 20 20 20 20 20 20 28 63 68 61 72 2a 29 30 29         (char*)0)
2adb0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2adc0 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
2add0 20 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f       return TCL_
2ade0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d  ERROR;.    }.  }
2adf0 0a 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b  .  return TCL_OK
2ae00 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  ;.}.../*.** Regi
2ae10 73 74 65 72 20 63 6f 6d 6d 61 6e 64 73 20 77 69  ster commands wi
2ae20 74 68 20 74 68 65 20 54 43 4c 20 69 6e 74 65 72  th the TCL inter
2ae30 70 72 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 53  preter..*/.int S
2ae40 71 6c 69 74 65 74 65 73 74 31 5f 49 6e 69 74 28  qlitetest1_Init(
2ae50 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
2ae60 72 70 29 7b 0a 20 20 65 78 74 65 72 6e 20 69 6e  rp){.  extern in
2ae70 74 20 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  t sqlite3_search
2ae80 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e  _count;.  extern
2ae90 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 6f 75   int sqlite3_fou
2aea0 6e 64 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  nd_count;.  exte
2aeb0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69  rn int sqlite3_i
2aec0 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 3b 0a  nterrupt_count;.
2aed0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2aee0 69 74 65 33 5f 6f 70 65 6e 5f 66 69 6c 65 5f 63  ite3_open_file_c
2aef0 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20 69  ount;.  extern i
2af00 6e 74 20 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f  nt sqlite3_sort_
2af10 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
2af20 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 75 72 72  int sqlite3_curr
2af30 65 6e 74 5f 74 69 6d 65 3b 0a 23 69 66 20 53 51  ent_time;.#if SQ
2af40 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 20 26 26 20  LITE_OS_UNIX && 
2af50 64 65 66 69 6e 65 64 28 5f 5f 41 50 50 4c 45 5f  defined(__APPLE_
2af60 5f 29 20 26 26 20 53 51 4c 49 54 45 5f 45 4e 41  _) && SQLITE_ENA
2af70 42 4c 45 5f 4c 4f 43 4b 49 4e 47 5f 53 54 59 4c  BLE_LOCKING_STYL
2af80 45 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  E.  extern int s
2af90 71 6c 69 74 65 33 5f 68 6f 73 74 69 64 5f 6e 75  qlite3_hostid_nu
2afa0 6d 3b 0a 23 65 6e 64 69 66 0a 20 20 65 78 74 65  m;.#endif.  exte
2afb0 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 6d  rn int sqlite3_m
2afc0 61 78 5f 62 6c 6f 62 73 69 7a 65 3b 0a 20 20 65  ax_blobsize;.  e
2afd0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2afe0 33 42 74 72 65 65 53 68 61 72 65 64 43 61 63 68  3BtreeSharedCach
2aff0 65 52 65 70 6f 72 74 28 76 6f 69 64 2a 2c 0a 20  eReport(void*,. 
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b020 20 20 20 20 20 20 20 20 20 54 63 6c 5f 49 6e 74           Tcl_Int
2b030 65 72 70 2a 2c 69 6e 74 2c 54 63 6c 5f 4f 62 6a  erp*,int,Tcl_Obj
2b040 2a 43 4f 4e 53 54 2a 29 3b 0a 20 20 73 74 61 74  *CONST*);.  stat
2b050 69 63 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  ic struct {.    
2b060 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
2b070 20 20 20 54 63 6c 5f 43 6d 64 50 72 6f 63 20 2a     Tcl_CmdProc *
2b080 78 50 72 6f 63 3b 0a 20 20 7d 20 61 43 6d 64 5b  xProc;.  } aCmd[
2b090 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 64 62  ] = {.     { "db
2b0a0 5f 65 6e 74 65 72 22 2c 20 20 20 20 20 20 20 20  _enter",        
2b0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2b0c0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 65  cl_CmdProc*)db_e
2b0d0 6e 74 65 72 20 20 20 20 20 20 20 20 20 20 20 20  nter            
2b0e0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 62     },.     { "db
2b0f0 5f 6c 65 61 76 65 22 2c 20 20 20 20 20 20 20 20  _leave",        
2b100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 54                (T
2b110 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 62 5f 6c  cl_CmdProc*)db_l
2b120 65 61 76 65 20 20 20 20 20 20 20 20 20 20 20 20  eave            
2b130 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2b140 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
2b150 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  t",           (T
2b160 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2b170 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 20  te3_mprintf_int 
2b180 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2b190 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e  lite3_mprintf_in
2b1a0 74 36 34 22 2c 20 20 20 20 20 20 20 20 20 28 54  t64",         (T
2b1b0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2b1c0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 69 6e 74 36  te3_mprintf_int6
2b1d0 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  4  },.     { "sq
2b1e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f  lite3_mprintf_lo
2b1f0 6e 67 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  ng",          (T
2b200 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2b210 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6c 6f 6e 67  te3_mprintf_long
2b220 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2b230 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
2b240 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 28 54  r",           (T
2b250 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2b260 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 20  te3_mprintf_str 
2b270 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2b280 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73  lite3_snprintf_s
2b290 74 72 22 2c 20 20 20 20 20 20 20 20 20 20 28 54  tr",          (T
2b2a0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2b2b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 73 74 72  te3_snprintf_str
2b2c0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2b2d0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74  lite3_mprintf_st
2b2e0 72 6f 6e 6c 79 22 2c 20 20 20 20 20 20 20 28 54  ronly",       (T
2b2f0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2b300 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 74 72 6f  te3_mprintf_stro
2b310 6e 6c 79 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  nly},.     { "sq
2b320 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f  lite3_mprintf_do
2b330 75 62 6c 65 22 2c 20 20 20 20 20 20 20 20 28 54  uble",        (T
2b340 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2b350 74 65 33 5f 6d 70 72 69 6e 74 66 5f 64 6f 75 62  te3_mprintf_doub
2b360 6c 65 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  le },.     { "sq
2b370 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63  lite3_mprintf_sc
2b380 61 6c 65 64 22 2c 20 20 20 20 20 20 20 20 28 54  aled",        (T
2b390 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69  cl_CmdProc*)sqli
2b3a0 74 65 33 5f 6d 70 72 69 6e 74 66 5f 73 63 61 6c  te3_mprintf_scal
2b3b0 65 64 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ed },.     { "sq
2b3c0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 68 65  lite3_mprintf_he
2b3d0 78 64 6f 75 62 6c 65 22 2c 20 20 20 28 54 63 6c  xdouble",   (Tcl
2b3e0 5f 43 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65  _CmdProc*)sqlite
2b3f0 33 5f 6d 70 72 69 6e 74 66 5f 68 65 78 64 6f 75  3_mprintf_hexdou
2b400 62 6c 65 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ble},.     { "sq
2b410 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 7a 5f  lite3_mprintf_z_
2b420 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54  test",        (T
2b430 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74  cl_CmdProc*)test
2b440 5f 6d 70 72 69 6e 74 66 5f 7a 20 20 20 20 20 20  _mprintf_z      
2b450 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2b460 69 74 65 33 5f 6d 70 72 69 6e 74 66 5f 6e 5f 74  ite3_mprintf_n_t
2b470 65 73 74 22 2c 20 20 20 20 20 20 20 20 28 54 63  est",        (Tc
2b480 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f  l_CmdProc*)test_
2b490 6d 70 72 69 6e 74 66 5f 6e 20 20 20 20 20 20 20  mprintf_n       
2b4a0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2b4b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 5f 69 6e 74  te3_snprintf_int
2b4c0 22 2c 20 20 20 20 20 20 20 20 20 20 28 54 63 6c  ",          (Tcl
2b4d0 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73  _CmdProc*)test_s
2b4e0 6e 70 72 69 6e 74 66 5f 69 6e 74 20 20 20 20 20  nprintf_int     
2b4f0 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2b500 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
2b510 6f 77 69 64 22 2c 20 20 20 20 20 28 54 63 6c 5f  owid",     (Tcl_
2b520 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 6c 61  CmdProc*)test_la
2b530 73 74 5f 72 6f 77 69 64 20 20 20 20 20 20 20 7d  st_rowid       }
2b540 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2b550 33 5f 65 78 65 63 5f 70 72 69 6e 74 66 22 2c 20  3_exec_printf", 
2b560 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2b570 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65  mdProc*)test_exe
2b580 63 5f 70 72 69 6e 74 66 20 20 20 20 20 20 7d 2c  c_printf      },
2b590 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b5a0 5f 65 78 65 63 5f 68 65 78 22 2c 20 20 20 20 20  _exec_hex",     
2b5b0 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2b5c0 64 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63  dProc*)test_exec
2b5d0 5f 68 65 78 20 20 20 20 20 20 20 20 20 7d 2c 0a  _hex         },.
2b5e0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b5f0 65 78 65 63 22 2c 20 20 20 20 20 20 20 20 20 20  exec",          
2b600 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64          (Tcl_Cmd
2b610 50 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 20  Proc*)test_exec 
2b620 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2b630 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2b640 78 65 63 5f 6e 72 22 2c 20 20 20 20 20 20 20 20  xec_nr",        
2b650 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50         (Tcl_CmdP
2b660 72 6f 63 2a 29 74 65 73 74 5f 65 78 65 63 5f 6e  roc*)test_exec_n
2b670 72 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 69  r          },.#i
2b680 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2b690 54 5f 47 45 54 5f 54 41 42 4c 45 0a 20 20 20 20  T_GET_TABLE.    
2b6a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 67 65 74 5f   { "sqlite3_get_
2b6b0 74 61 62 6c 65 5f 70 72 69 6e 74 66 22 2c 20 20  table_printf",  
2b6c0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2b6d0 2a 29 74 65 73 74 5f 67 65 74 5f 74 61 62 6c 65  *)test_get_table
2b6e0 5f 70 72 69 6e 74 66 20 7d 2c 0a 23 65 6e 64 69  _printf },.#endi
2b6f0 66 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  f.     { "sqlite
2b700 33 5f 63 6c 6f 73 65 22 2c 20 20 20 20 20 20 20  3_close",       
2b710 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2b720 6d 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74  mdProc*)sqlite_t
2b730 65 73 74 5f 63 6c 6f 73 65 20 20 20 20 20 7d 2c  est_close     },
2b740 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2b750 5f 63 6c 6f 73 65 5f 76 32 22 2c 20 20 20 20 20  _close_v2",     
2b760 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2b770 64 50 72 6f 63 2a 29 73 71 6c 69 74 65 5f 74 65  dProc*)sqlite_te
2b780 73 74 5f 63 6c 6f 73 65 5f 76 32 20 20 7d 2c 0a  st_close_v2  },.
2b790 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2b7a0 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 22  create_function"
2b7b0 2c 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64  ,       (Tcl_Cmd
2b7c0 50 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74  Proc*)test_creat
2b7d0 65 5f 66 75 6e 63 74 69 6f 6e 20 20 7d 2c 0a 20  e_function  },. 
2b7e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2b7f0 72 65 61 74 65 5f 61 67 67 72 65 67 61 74 65 22  reate_aggregate"
2b800 2c 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50  ,      (Tcl_CmdP
2b810 72 6f 63 2a 29 74 65 73 74 5f 63 72 65 61 74 65  roc*)test_create
2b820 5f 61 67 67 72 65 67 61 74 65 20 7d 2c 0a 20 20  _aggregate },.  
2b830 20 20 20 7b 20 22 73 71 6c 69 74 65 5f 72 65 67     { "sqlite_reg
2b840 69 73 74 65 72 5f 74 65 73 74 5f 66 75 6e 63 74  ister_test_funct
2b850 69 6f 6e 22 2c 20 28 54 63 6c 5f 43 6d 64 50 72  ion", (Tcl_CmdPr
2b860 6f 63 2a 29 74 65 73 74 5f 72 65 67 69 73 74 65  oc*)test_registe
2b870 72 5f 66 75 6e 63 20 20 20 20 7d 2c 0a 20 20 20  r_func    },.   
2b880 20 20 7b 20 22 73 71 6c 69 74 65 5f 61 62 6f 72    { "sqlite_abor
2b890 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2b8a0 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f       (Tcl_CmdPro
2b8b0 63 2a 29 73 71 6c 69 74 65 5f 61 62 6f 72 74 20  c*)sqlite_abort 
2b8c0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2b8d0 20 7b 20 22 73 71 6c 69 74 65 5f 62 69 6e 64 22   { "sqlite_bind"
2b8e0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2b8f0 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63      (Tcl_CmdProc
2b900 2a 29 74 65 73 74 5f 62 69 6e 64 20 20 20 20 20  *)test_bind     
2b910 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2b920 7b 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20  { "breakpoint", 
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b940 20 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a     (Tcl_CmdProc*
2b950 29 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74  )test_breakpoint
2b960 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b         },.     {
2b970 20 22 73 71 6c 69 74 65 33 5f 6b 65 79 22 2c 20   "sqlite3_key", 
2b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b990 20 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29    (Tcl_CmdProc*)
2b9a0 74 65 73 74 5f 6b 65 79 20 20 20 20 20 20 20 20  test_key        
2b9b0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2b9c0 22 73 71 6c 69 74 65 33 5f 72 65 6b 65 79 22 2c  "sqlite3_rekey",
2b9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b9e0 20 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74   (Tcl_CmdProc*)t
2b9f0 65 73 74 5f 72 65 6b 65 79 20 20 20 20 20 20 20  est_rekey       
2ba00 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22       },.     { "
2ba10 73 71 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63  sqlite_set_magic
2ba20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2ba30 28 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 73 71  (Tcl_CmdProc*)sq
2ba40 6c 69 74 65 5f 73 65 74 5f 6d 61 67 69 63 20 20  lite_set_magic  
2ba50 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73      },.     { "s
2ba60 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
2ba70 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ",             (
2ba80 54 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 74 65 73  Tcl_CmdProc*)tes
2ba90 74 5f 69 6e 74 65 72 72 75 70 74 20 20 20 20 20  t_interrupt     
2baa0 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71     },.     { "sq
2bab0 6c 69 74 65 5f 64 65 6c 65 74 65 5f 66 75 6e 63  lite_delete_func
2bac0 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 20 28 54  tion",        (T
2bad0 63 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65  cl_CmdProc*)dele
2bae0 74 65 5f 66 75 6e 63 74 69 6f 6e 20 20 20 20 20  te_function     
2baf0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2bb00 69 74 65 5f 64 65 6c 65 74 65 5f 63 6f 6c 6c 61  ite_delete_colla
2bb10 74 69 6f 6e 22 2c 20 20 20 20 20 20 20 28 54 63  tion",       (Tc
2bb20 6c 5f 43 6d 64 50 72 6f 63 2a 29 64 65 6c 65 74  l_CmdProc*)delet
2bb30 65 5f 63 6f 6c 6c 61 74 69 6f 6e 20 20 20 20 20  e_collation     
2bb40 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2bb50 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
2bb60 69 74 22 2c 20 20 20 20 20 20 20 20 28 54 63 6c  it",        (Tcl
2bb70 5f 43 6d 64 50 72 6f 63 2a 29 67 65 74 5f 61 75  _CmdProc*)get_au
2bb80 74 6f 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20  tocommit        
2bb90 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2bba0 65 33 5f 73 74 61 63 6b 5f 75 73 65 64 22 2c 20  e3_stack_used", 
2bbb0 20 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f             (Tcl_
2bbc0 43 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 73 74  CmdProc*)test_st
2bbd0 61 63 6b 5f 75 73 65 64 20 20 20 20 20 20 20 7d  ack_used       }
2bbe0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2bbf0 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 22 2c  3_busy_timeout",
2bc00 20 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43            (Tcl_C
2bc10 6d 64 50 72 6f 63 2a 29 74 65 73 74 5f 62 75 73  mdProc*)test_bus
2bc20 79 5f 74 69 6d 65 6f 75 74 20 20 20 20 20 7d 2c  y_timeout     },
2bc30 0a 20 20 20 20 20 7b 20 22 70 72 69 6e 74 66 22  .     { "printf"
2bc40 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2bc50 20 20 20 20 20 20 20 20 20 28 54 63 6c 5f 43 6d           (Tcl_Cm
2bc60 64 50 72 6f 63 2a 29 74 65 73 74 5f 70 72 69 6e  dProc*)test_prin
2bc70 74 66 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  tf           },.
2bc80 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 49       { "sqlite3I
2bc90 6f 54 72 61 63 65 22 2c 20 20 20 20 20 20 20 20  oTrace",        
2bca0 20 20 20 20 20 20 28 54 63 6c 5f 43 6d 64 50 72        (Tcl_CmdPr
2bcb0 6f 63 2a 29 74 65 73 74 5f 69 6f 5f 74 72 61 63  oc*)test_io_trac
2bcc0 65 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 7d  e         },.  }
2bcd0 3b 0a 20 20 73 74 61 74 69 63 20 73 74 72 75 63  ;.  static struc
2bce0 74 20 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a  t {.     char *z
2bcf0 4e 61 6d 65 3b 0a 20 20 20 20 20 54 63 6c 5f 4f  Name;.     Tcl_O
2bd00 62 6a 43 6d 64 50 72 6f 63 20 2a 78 50 72 6f 63  bjCmdProc *xProc
2bd10 3b 0a 20 20 20 20 20 76 6f 69 64 20 2a 63 6c 69  ;.     void *cli
2bd20 65 6e 74 44 61 74 61 3b 0a 20 20 7d 20 61 4f 62  entData;.  } aOb
2bd30 6a 43 6d 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  jCmd[] = {.     
2bd40 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6e 6e 65  { "sqlite3_conne
2bd50 63 74 69 6f 6e 5f 70 6f 69 6e 74 65 72 22 2c 20  ction_pointer", 
2bd60 20 20 20 67 65 74 5f 73 71 6c 69 74 65 5f 70 6f     get_sqlite_po
2bd70 69 6e 74 65 72 2c 20 30 20 7d 2c 0a 20 20 20 20  inter, 0 },.    
2bd80 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64   { "sqlite3_bind
2bd90 5f 69 6e 74 22 2c 20 20 20 20 20 20 20 20 20 20  _int",          
2bda0 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 69 6e      test_bind_in
2bdb0 74 2c 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  t,      0 },.   
2bdc0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e    { "sqlite3_bin
2bdd0 64 5f 7a 65 72 6f 62 6c 6f 62 22 2c 20 20 20 20  d_zeroblob",    
2bde0 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 7a       test_bind_z
2bdf0 65 72 6f 62 6c 6f 62 2c 20 30 20 7d 2c 0a 20 20  eroblob, 0 },.  
2be00 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62 69     { "sqlite3_bi
2be10 6e 64 5f 69 6e 74 36 34 22 2c 20 20 20 20 20 20  nd_int64",      
2be20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64 5f        test_bind_
2be30 69 6e 74 36 34 2c 20 20 20 20 30 20 7d 2c 0a 20  int64,    0 },. 
2be40 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2be50 69 6e 64 5f 64 6f 75 62 6c 65 22 2c 20 20 20 20  ind_double",    
2be60 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e 64         test_bind
2be70 5f 64 6f 75 62 6c 65 2c 20 20 20 30 20 7d 2c 0a  _double,   0 },.
2be80 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2be90 62 69 6e 64 5f 6e 75 6c 6c 22 2c 20 20 20 20 20  bind_null",     
2bea0 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69 6e          test_bin
2beb0 64 5f 6e 75 6c 6c 20 20 20 20 20 2c 30 20 7d 2c  d_null     ,0 },
2bec0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2bed0 5f 62 69 6e 64 5f 74 65 78 74 22 2c 20 20 20 20  _bind_text",    
2bee0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62 69           test_bi
2bef0 6e 64 5f 74 65 78 74 20 20 20 20 20 2c 30 20 7d  nd_text     ,0 }
2bf00 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2bf10 33 5f 62 69 6e 64 5f 74 65 78 74 31 36 22 2c 20  3_bind_text16", 
2bf20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 62            test_b
2bf30 69 6e 64 5f 74 65 78 74 31 36 20 20 20 2c 30 20  ind_text16   ,0 
2bf40 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2bf50 65 33 5f 62 69 6e 64 5f 62 6c 6f 62 22 2c 20 20  e3_bind_blob",  
2bf60 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f             test_
2bf70 62 69 6e 64 5f 62 6c 6f 62 20 20 20 20 20 2c 30  bind_blob     ,0
2bf80 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2bf90 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
2bfa0 65 72 5f 63 6f 75 6e 74 22 2c 20 20 74 65 73 74  er_count",  test
2bfb0 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f  _bind_parameter_
2bfc0 63 6f 75 6e 74 2c 20 30 7d 2c 0a 20 20 20 20 20  count, 0},.     
2bfd0 7b 20 22 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f  { "sqlite3_bind_
2bfe0 70 61 72 61 6d 65 74 65 72 5f 6e 61 6d 65 22 2c  parameter_name",
2bff0 20 20 20 74 65 73 74 5f 62 69 6e 64 5f 70 61 72     test_bind_par
2c000 61 6d 65 74 65 72 5f 6e 61 6d 65 2c 20 20 30 7d  ameter_name,  0}
2c010 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c020 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
2c030 5f 69 6e 64 65 78 22 2c 20 20 74 65 73 74 5f 62  _index",  test_b
2c040 69 6e 64 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e  ind_parameter_in
2c050 64 65 78 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  dex, 0},.     { 
2c060 22 73 71 6c 69 74 65 33 5f 63 6c 65 61 72 5f 62  "sqlite3_clear_b
2c070 69 6e 64 69 6e 67 73 22 2c 20 20 20 20 20 20 20  indings",       
2c080 20 74 65 73 74 5f 63 6c 65 61 72 5f 62 69 6e 64   test_clear_bind
2c090 69 6e 67 73 2c 20 30 7d 2c 0a 20 20 20 20 20 7b  ings, 0},.     {
2c0a0 20 22 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 22   "sqlite3_sleep"
2c0b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2c0c0 20 20 74 65 73 74 5f 73 6c 65 65 70 2c 20 20 20    test_sleep,   
2c0d0 20 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20         0},.     
2c0e0 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  { "sqlite3_errco
2c0f0 64 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  de",            
2c100 20 20 20 74 65 73 74 5f 65 72 72 63 6f 64 65 20     test_errcode 
2c110 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20        ,0 },.    
2c120 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 74 65   { "sqlite3_exte
2c130 6e 64 65 64 5f 65 72 72 63 6f 64 65 22 2c 20 20  nded_errcode",  
2c140 20 20 20 20 74 65 73 74 5f 65 78 5f 65 72 72 63      test_ex_errc
2c150 6f 64 65 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20  ode    ,0 },.   
2c160 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72 72    { "sqlite3_err
2c170 6d 73 67 22 2c 20 20 20 20 20 20 20 20 20 20 20  msg",           
2c180 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73 67       test_errmsg
2c190 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20          ,0 },.  
2c1a0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 72     { "sqlite3_er
2c1b0 72 6d 73 67 31 36 22 2c 20 20 20 20 20 20 20 20  rmsg16",        
2c1c0 20 20 20 20 20 20 74 65 73 74 5f 65 72 72 6d 73        test_errms
2c1d0 67 31 36 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20  g16      ,0 },. 
2c1e0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 6f      { "sqlite3_o
2c1f0 70 65 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20  pen",           
2c200 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65 6e         test_open
2c210 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a            ,0 },.
2c220 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c230 6f 70 65 6e 31 36 22 2c 20 20 20 20 20 20 20 20  open16",        
2c240 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70 65          test_ope
2c250 6e 31 36 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  n16        ,0 },
2c260 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c270 5f 6f 70 65 6e 5f 76 32 22 2c 20 20 20 20 20 20  _open_v2",      
2c280 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6f 70           test_op
2c290 65 6e 5f 76 32 20 20 20 20 20 20 20 2c 30 20 7d  en_v2       ,0 }
2c2a0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c2b0 33 5f 63 6f 6d 70 6c 65 74 65 31 36 22 2c 20 20  3_complete16",  
2c2c0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63            test_c
2c2d0 6f 6d 70 6c 65 74 65 31 36 20 20 20 20 2c 30 20  omplete16    ,0 
2c2e0 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  },..     { "sqli
2c2f0 74 65 33 5f 70 72 65 70 61 72 65 22 2c 20 20 20  te3_prepare",   
2c300 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2c310 5f 70 72 65 70 61 72 65 20 20 20 20 20 20 20 2c  _prepare       ,
2c320 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c  0 },.     { "sql
2c330 69 74 65 33 5f 70 72 65 70 61 72 65 31 36 22 2c  ite3_prepare16",
2c340 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
2c350 74 5f 70 72 65 70 61 72 65 31 36 20 20 20 20 20  t_prepare16     
2c360 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71  ,0 },.     { "sq
2c370 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2c380 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 74 65  ",            te
2c390 73 74 5f 70 72 65 70 61 72 65 5f 76 32 20 20 20  st_prepare_v2   
2c3a0 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73   ,0 },.     { "s
2c3b0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 74  qlite3_prepare_t
2c3c0 6b 74 33 31 33 34 22 2c 20 20 20 20 20 20 20 74  kt3134",       t
2c3d0 65 73 74 5f 70 72 65 70 61 72 65 5f 74 6b 74 33  est_prepare_tkt3
2c3e0 31 33 34 2c 20 30 7d 2c 0a 20 20 20 20 20 7b 20  134, 0},.     { 
2c3f0 22 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65  "sqlite3_prepare
2c400 31 36 5f 76 32 22 2c 20 20 20 20 20 20 20 20 20  16_v2",         
2c410 20 74 65 73 74 5f 70 72 65 70 61 72 65 31 36 5f   test_prepare16_
2c420 76 32 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20 7b  v2  ,0 },.     {
2c430 20 22 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69   "sqlite3_finali
2c440 7a 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ze",            
2c450 20 20 74 65 73 74 5f 66 69 6e 61 6c 69 7a 65 20    test_finalize 
2c460 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20 20       ,0 },.     
2c470 7b 20 22 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f  { "sqlite3_stmt_
2c480 73 74 61 74 75 73 22 2c 20 20 20 20 20 20 20 20  status",        
2c490 20 20 20 74 65 73 74 5f 73 74 6d 74 5f 73 74 61     test_stmt_sta
2c4a0 74 75 73 20 20 20 2c 30 20 7d 2c 0a 20 20 20 20  tus   ,0 },.    
2c4b0 20 7b 20 22 73 71 6c 69 74 65 33 5f 72 65 73 65   { "sqlite3_rese
2c4c0 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2c4d0 20 20 20 20 74 65 73 74 5f 72 65 73 65 74 20 20      test_reset  
2c4e0 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20 20         ,0 },.   
2c4f0 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65 78 70    { "sqlite3_exp
2c500 69 72 65 64 22 2c 20 20 20 20 20 20 20 20 20 20  ired",          
2c510 20 20 20 20 20 74 65 73 74 5f 65 78 70 69 72 65       test_expire
2c520 64 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a 20 20  d       ,0 },.  
2c530 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74 72     { "sqlite3_tr
2c540 61 6e 73 66 65 72 5f 62 69 6e 64 69 6e 67 73 22  ansfer_bindings"
2c550 2c 20 20 20 20 20 74 65 73 74 5f 74 72 61 6e 73  ,     test_trans
2c560 66 65 72 5f 62 69 6e 64 20 2c 30 20 7d 2c 0a 20  fer_bind ,0 },. 
2c570 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2c580 68 61 6e 67 65 73 22 2c 20 20 20 20 20 20 20 20  hanges",        
2c590 20 20 20 20 20 20 20 74 65 73 74 5f 63 68 61 6e         test_chan
2c5a0 67 65 73 20 20 20 20 20 20 20 2c 30 20 7d 2c 0a  ges       ,0 },.
2c5b0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c5c0 73 74 65 70 22 2c 20 20 20 20 20 20 20 20 20 20  step",          
2c5d0 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 74 65          test_ste
2c5e0 70 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d 2c  p          ,0 },
2c5f0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2c600 5f 73 71 6c 22 2c 20 20 20 20 20 20 20 20 20 20  _sql",          
2c610 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 73 71           test_sq
2c620 6c 20 20 20 20 20 20 20 20 20 20 20 2c 30 20 7d  l           ,0 }
2c630 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2c640 33 5f 6e 65 78 74 5f 73 74 6d 74 22 2c 20 20 20  3_next_stmt",   
2c650 20 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 6e            test_n
2c660 65 78 74 5f 73 74 6d 74 20 20 20 20 20 2c 30 20  ext_stmt     ,0 
2c670 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2c680 65 33 5f 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79  e3_stmt_readonly
2c690 22 2c 20 20 20 20 20 20 20 20 20 74 65 73 74 5f  ",         test_
2c6a0 73 74 6d 74 5f 72 65 61 64 6f 6e 6c 79 20 2c 30  stmt_readonly ,0
2c6b0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2c6c0 74 65 33 5f 73 74 6d 74 5f 62 75 73 79 22 2c 20  te3_stmt_busy", 
2c6d0 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
2c6e0 5f 73 74 6d 74 5f 62 75 73 79 20 20 20 20 20 2c  _stmt_busy     ,
2c6f0 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75 73 65  0 },.     { "use
2c700 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 22 2c  s_stmt_journal",
2c710 20 20 20 20 20 20 20 20 20 20 20 20 20 75 73 65               use
2c720 73 5f 73 74 6d 74 5f 6a 6f 75 72 6e 61 6c 20 2c  s_stmt_journal ,
2c730 30 20 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 71  0 },..     { "sq
2c740 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
2c750 6d 6f 72 79 22 2c 20 20 20 20 20 20 20 20 74 65  mory",        te
2c760 73 74 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72  st_release_memor
2c770 79 2c 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20  y,     0},.     
2c780 7b 20 22 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  { "sqlite3_db_re
2c790 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 22 2c 20 20  lease_memory",  
2c7a0 20 20 20 74 65 73 74 5f 64 62 5f 72 65 6c 65 61     test_db_relea
2c7b0 73 65 5f 6d 65 6d 6f 72 79 2c 20 20 30 7d 2c 0a  se_memory,  0},.
2c7c0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2c7d0 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20  db_filename",   
2c7e0 20 20 20 20 20 20 20 20 74 65 73 74 5f 64 62 5f          test_db_
2c7f0 66 69 6c 65 6e 61 6d 65 2c 20 20 20 20 20 20 20  filename,       
2c800 20 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c   0},.     { "sql
2c810 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79  ite3_db_readonly
2c820 22 2c 20 20 20 20 20 20 20 20 20 20 20 74 65 73  ",           tes
2c830 74 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 2c 20 20  t_db_readonly,  
2c840 20 20 20 20 20 20 30 7d 2c 0a 20 20 20 20 20 7b        0},.     {
2c850 20 22 73 71 6c 69 74 65 33 5f 73 6f 66 74 5f 68   "sqlite3_soft_h
2c860 65 61 70 5f 6c 69 6d 69 74 22 2c 20 20 20 20 20  eap_limit",     
2c870 20 20 74 65 73 74 5f 73 6f 66 74 5f 68 65 61 70    test_soft_heap
2c880 5f 6c 69 6d 69 74 2c 20 20 20 20 30 7d 2c 0a 20  _limit,    0},. 
2c890 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 74      { "sqlite3_t
2c8a0 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 22 2c 20  hread_cleanup", 
2c8b0 20 20 20 20 20 20 20 74 65 73 74 5f 74 68 72 65         test_thre
2c8c0 61 64 5f 63 6c 65 61 6e 75 70 2c 20 20 20 20 20  ad_cleanup,     
2c8d0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2c8e0 74 65 33 5f 70 61 67 65 72 5f 72 65 66 63 6f 75  te3_pager_refcou
2c8f0 6e 74 73 22 2c 20 20 20 20 20 20 20 74 65 73 74  nts",       test
2c900 5f 70 61 67 65 72 5f 72 65 66 63 6f 75 6e 74 73  _pager_refcounts
2c910 2c 20 20 20 20 30 7d 2c 0a 0a 20 20 20 20 20 7b  ,    0},..     {
2c920 20 22 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65   "sqlite3_load_e
2c930 78 74 65 6e 73 69 6f 6e 22 2c 20 20 20 20 20 20  xtension",      
2c940 20 20 74 65 73 74 5f 6c 6f 61 64 5f 65 78 74 65    test_load_exte
2c950 6e 73 69 6f 6e 2c 20 20 20 20 20 30 7d 2c 0a 20  nsion,     0},. 
2c960 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 65      { "sqlite3_e
2c970 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
2c980 73 69 6f 6e 22 2c 20 74 65 73 74 5f 65 6e 61 62  sion", test_enab
2c990 6c 65 5f 6c 6f 61 64 2c 20 20 20 20 20 20 20 20  le_load,        
2c9a0 30 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  0},.     { "sqli
2c9b0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65 73  te3_extended_res
2c9c0 75 6c 74 5f 63 6f 64 65 73 22 2c 20 74 65 73 74  ult_codes", test
2c9d0 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
2c9e0 5f 63 6f 64 65 73 2c 20 30 7d 2c 0a 20 20 20 20  _codes, 0},.    
2c9f0 20 7b 20 22 73 71 6c 69 74 65 33 5f 6c 69 6d 69   { "sqlite3_limi
2ca00 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  t",             
2ca10 20 20 20 20 74 65 73 74 5f 6c 69 6d 69 74 2c 20      test_limit, 
2ca20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca30 30 7d 2c 0a 0a 20 20 20 20 20 7b 20 22 73 61 76  0},..     { "sav
2ca40 65 5f 70 72 6e 67 5f 73 74 61 74 65 22 2c 20 20  e_prng_state",  
2ca50 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61 76               sav
2ca60 65 5f 70 72 6e 67 5f 73 74 61 74 65 2c 20 20 20  e_prng_state,   
2ca70 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72 65   0 },.     { "re
2ca80 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
2ca90 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ",            re
2caa0 73 74 6f 72 65 5f 70 72 6e 67 5f 73 74 61 74 65  store_prng_state
2cab0 2c 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 72  , 0 },.     { "r
2cac0 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 22  eset_prng_state"
2cad0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  ,              r
2cae0 65 73 65 74 5f 70 72 6e 67 5f 73 74 61 74 65 2c  eset_prng_state,
2caf0 20 20 20 30 20 7d 2c 0a 20 20 20 20 20 7b 20 22     0 },.     { "
2cb00 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
2cb10 74 72 6f 6c 22 2c 20 20 20 20 20 20 20 20 20 20  trol",          
2cb20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 5f 63 6f 6e  optimization_con
2cb30 74 72 6f 6c 2c 30 7d 2c 0a 23 69 66 20 53 51 4c  trol,0},.#if SQL
2cb40 49 54 45 5f 4f 53 5f 57 49 4e 0a 20 20 20 20 20  ITE_OS_WIN.     
2cb50 7b 20 22 6c 6f 63 6b 5f 77 69 6e 33 32 5f 66 69  { "lock_win32_fi
2cb60 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  le",            
2cb70 20 20 20 77 69 6e 33 32 5f 66 69 6c 65 5f 6c 6f     win32_file_lo
2cb80 63 6b 2c 20 20 20 20 30 20 7d 2c 0a 20 20 20 20  ck,    0 },.    
2cb90 20 7b 20 22 65 78 69 73 74 73 5f 77 69 6e 33 32   { "exists_win32
2cba0 5f 70 61 74 68 22 2c 20 20 20 20 20 20 20 20 20  _path",         
2cbb0 20 20 20 20 77 69 6e 33 32 5f 65 78 69 73 74 73      win32_exists
2cbc0 5f 70 61 74 68 2c 20 20 30 20 7d 2c 0a 20 20 20  _path,  0 },.   
2cbd0 20 20 7b 20 22 66 69 6e 64 5f 77 69 6e 33 32 5f    { "find_win32_
2cbe0 66 69 6c 65 22 2c 20 20 20 20 20 20 20 20 20 20  file",          
2cbf0 20 20 20 20 20 77 69 6e 33 32 5f 66 69 6e 64 5f       win32_find_
2cc00 66 69 6c 65 2c 20 20 20 20 30 20 7d 2c 0a 20 20  file,    0 },.  
2cc10 20 20 20 7b 20 22 64 65 6c 65 74 65 5f 77 69 6e     { "delete_win
2cc20 33 32 5f 66 69 6c 65 22 2c 20 20 20 20 20 20 20  32_file",       
2cc30 20 20 20 20 20 20 77 69 6e 33 32 5f 64 65 6c 65        win32_dele
2cc40 74 65 5f 66 69 6c 65 2c 20 20 30 20 7d 2c 0a 20  te_file,  0 },. 
2cc50 20 20 20 20 7b 20 22 6d 61 6b 65 5f 77 69 6e 33      { "make_win3
2cc60 32 5f 64 69 72 22 2c 20 20 20 20 20 20 20 20 20  2_dir",         
2cc70 20 20 20 20 20 20 20 77 69 6e 33 32 5f 6d 6b 64         win32_mkd
2cc80 69 72 2c 20 20 20 20 20 20 20 20 30 20 7d 2c 0a  ir,        0 },.
2cc90 20 20 20 20 20 7b 20 22 72 65 6d 6f 76 65 5f 77       { "remove_w
2cca0 69 6e 33 32 5f 64 69 72 22 2c 20 20 20 20 20 20  in32_dir",      
2ccb0 20 20 20 20 20 20 20 20 77 69 6e 33 32 5f 72 6d          win32_rm
2ccc0 64 69 72 2c 20 20 20 20 20 20 20 20 30 20 7d 2c  dir,        0 },
2ccd0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22  .#endif.     { "
2cce0 74 63 6c 5f 6f 62 6a 70 72 6f 63 22 2c 20 20 20  tcl_objproc",   
2ccf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd00 72 75 6e 41 73 4f 62 6a 50 72 6f 63 2c 20 20 20  runAsObjProc,   
2cd10 20 20 20 20 30 20 7d 2c 0a 0a 20 20 20 20 20 2f      0 },..     /
2cd20 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  * sqlite3_column
2cd30 5f 2a 28 29 20 41 50 49 20 2a 2f 0a 20 20 20 20  _*() API */.    
2cd40 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75   { "sqlite3_colu
2cd50 6d 6e 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20  mn_count",      
2cd60 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d 6e 5f      test_column_
2cd70 63 6f 75 6e 74 20 20 2c 30 20 7d 2c 0a 20 20 20  count  ,0 },.   
2cd80 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 64 61 74    { "sqlite3_dat
2cd90 61 5f 63 6f 75 6e 74 22 2c 20 20 20 20 20 20 20  a_count",       
2cda0 20 20 20 20 20 74 65 73 74 5f 64 61 74 61 5f 63       test_data_c
2cdb0 6f 75 6e 74 20 20 20 20 2c 30 20 7d 2c 0a 20 20  ount    ,0 },.  
2cdc0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f     { "sqlite3_co
2cdd0 6c 75 6d 6e 5f 74 79 70 65 22 2c 20 20 20 20 20  lumn_type",     
2cde0 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75 6d        test_colum
2cdf0 6e 5f 74 79 70 65 20 20 20 2c 30 20 7d 2c 0a 20  n_type   ,0 },. 
2ce00 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2ce10 6f 6c 75 6d 6e 5f 62 6c 6f 62 22 2c 20 20 20 20  olumn_blob",    
2ce20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c 75         test_colu
2ce30 6d 6e 5f 62 6c 6f 62 20 20 20 2c 30 20 7d 2c 0a  mn_blob   ,0 },.
2ce40 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2ce50 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 22 2c 20  column_double", 
2ce60 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f 6c          test_col
2ce70 75 6d 6e 5f 64 6f 75 62 6c 65 20 2c 30 20 7d 2c  umn_double ,0 },
2ce80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2ce90 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 22 2c 20  _column_int64", 
2cea0 20 20 20 20 20 20 20 20 20 74 65 73 74 5f 63 6f           test_co
2ceb0 6c 75 6d 6e 5f 69 6e 74 36 34 20 20 2c 30 20 7d  lumn_int64  ,0 }
2cec0 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2ced0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 22 2c 20  3_column_text", 
2cee0 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38    test_stmt_utf8
2cef0 2c 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65  ,  (void*)sqlite
2cf00 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 20 7d 2c  3_column_text },
2cf10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2cf20 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 22 2c 20 20  _column_name",  
2cf30 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66 38 2c   test_stmt_utf8,
2cf40 20 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33    (void*)sqlite3
2cf50 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 20 7d 2c 0a  _column_name },.
2cf60 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2cf70 63 6f 6c 75 6d 6e 5f 69 6e 74 22 2c 20 20 20 20  column_int",    
2cf80 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20  test_stmt_int,  
2cf90 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f   (void*)sqlite3_
2cfa0 63 6f 6c 75 6d 6e 5f 69 6e 74 20 20 7d 2c 0a 20  column_int  },. 
2cfb0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2cfc0 6f 6c 75 6d 6e 5f 62 79 74 65 73 22 2c 20 20 74  olumn_bytes",  t
2cfd0 65 73 74 5f 73 74 6d 74 5f 69 6e 74 2c 20 20 20  est_stmt_int,   
2cfe0 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33 5f 63  (void*)sqlite3_c
2cff0 6f 6c 75 6d 6e 5f 62 79 74 65 73 7d 2c 0a 23 69  olumn_bytes},.#i
2d000 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d010 54 5f 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20  T_DECLTYPE.     
2d020 7b 20 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  { "sqlite3_colum
2d030 6e 5f 64 65 63 6c 74 79 70 65 22 2c 74 65 73 74  n_decltype",test
2d040 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
2d050 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2d060 5f 64 65 63 6c 74 79 70 65 7d 2c 0a 23 65 6e 64  _decltype},.#end
2d070 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
2d080 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
2d090 45 54 41 44 41 54 41 0a 7b 20 22 73 71 6c 69 74  ETADATA.{ "sqlit
2d0a0 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
2d0b0 73 65 5f 6e 61 6d 65 22 2c 74 65 73 74 5f 73 74  se_name",test_st
2d0c0 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64 2a 29 73  mt_utf8,(void*)s
2d0d0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
2d0e0 74 61 62 61 73 65 5f 6e 61 6d 65 7d 2c 0a 7b 20  tabase_name},.{ 
2d0f0 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2d100 74 61 62 6c 65 5f 6e 61 6d 65 22 2c 74 65 73 74  table_name",test
2d110 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69 64  _stmt_utf8,(void
2d120 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2d130 5f 74 61 62 6c 65 5f 6e 61 6d 65 7d 2c 0a 7b 20  _table_name},.{ 
2d140 22 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  "sqlite3_column_
2d150 6f 72 69 67 69 6e 5f 6e 61 6d 65 22 2c 74 65 73  origin_name",tes
2d160 74 5f 73 74 6d 74 5f 75 74 66 38 2c 28 76 6f 69  t_stmt_utf8,(voi
2d170 64 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  d*)sqlite3_colum
2d180 6e 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 7d 2c 0a  n_origin_name},.
2d190 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
2d1a0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
2d1b0 36 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  6.     { "sqlite
2d1c0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36  3_column_bytes16
2d1d0 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 69 6e 74  ", test_stmt_int
2d1e0 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74 65 33  , (void*)sqlite3
2d1f0 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 31 36 20  _column_bytes16 
2d200 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  },.     { "sqlit
2d210 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31 36  e3_column_text16
2d220 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75 74  ",  test_stmt_ut
2d230 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69  f16, (void*)sqli
2d240 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 31  te3_column_text1
2d250 36 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69  6},.     { "sqli
2d260 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 31  te3_column_name1
2d270 36 22 2c 20 20 74 65 73 74 5f 73 74 6d 74 5f 75  6",  test_stmt_u
2d280 74 66 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c  tf16, (void*)sql
2d290 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
2d2a0 31 36 7d 2c 0a 20 20 20 20 20 7b 20 22 61 64 64  16},.     { "add
2d2b0 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
2d2c0 63 6f 6c 6c 61 74 69 6f 6e 73 22 2c 20 61 64 64  collations", add
2d2d0 5f 61 6c 69 67 6e 6d 65 6e 74 5f 74 65 73 74 5f  _alignment_test_
2d2e0 63 6f 6c 6c 61 74 69 6f 6e 73 2c 20 30 20 20 20  collations, 0   
2d2f0 20 20 20 7d 2c 0a 23 69 66 6e 64 65 66 20 53 51     },.#ifndef SQ
2d300 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54 59  LITE_OMIT_DECLTY
2d310 50 45 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74  PE.     { "sqlit
2d320 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c 74 79  e3_column_declty
2d330 70 65 31 36 22 2c 74 65 73 74 5f 73 74 6d 74 5f  pe16",test_stmt_
2d340 75 74 66 31 36 2c 28 76 6f 69 64 2a 29 73 71 6c  utf16,(void*)sql
2d350 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65 63 6c  ite3_column_decl
2d360 74 79 70 65 31 36 7d 2c 0a 23 65 6e 64 69 66 0a  type16},.#endif.
2d370 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2d380 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
2d390 44 41 54 41 0a 7b 22 73 71 6c 69 74 65 33 5f 63  DATA.{"sqlite3_c
2d3a0 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73 65 5f 6e  olumn_database_n
2d3b0 61 6d 65 31 36 22 2c 0a 20 20 74 65 73 74 5f 73  ame16",.  test_s
2d3c0 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
2d3d0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2d3e0 5f 64 61 74 61 62 61 73 65 5f 6e 61 6d 65 31 36  _database_name16
2d3f0 7d 2c 0a 7b 22 73 71 6c 69 74 65 33 5f 63 6f 6c  },.{"sqlite3_col
2d400 75 6d 6e 5f 74 61 62 6c 65 5f 6e 61 6d 65 31 36  umn_table_name16
2d410 22 2c 20 74 65 73 74 5f 73 74 6d 74 5f 75 74 66  ", test_stmt_utf
2d420 31 36 2c 20 28 76 6f 69 64 2a 29 73 71 6c 69 74  16, (void*)sqlit
2d430 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
2d440 6e 61 6d 65 31 36 7d 2c 0a 7b 22 73 71 6c 69 74  name16},.{"sqlit
2d450 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e  e3_column_origin
2d460 5f 6e 61 6d 65 31 36 22 2c 20 74 65 73 74 5f 73  _name16", test_s
2d470 74 6d 74 5f 75 74 66 31 36 2c 20 28 76 6f 69 64  tmt_utf16, (void
2d480 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2d490 5f 6f 72 69 67 69 6e 5f 6e 61 6d 65 31 36 7d 2c  _origin_name16},
2d4a0 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a 20  .#endif.#endif. 
2d4b0 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 63      { "sqlite3_c
2d4c0 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  reate_collation_
2d4d0 76 32 22 2c 20 74 65 73 74 5f 63 72 65 61 74 65  v2", test_create
2d4e0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 2c 20 30  _collation_v2, 0
2d4f0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69   },.     { "sqli
2d500 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76  te3_global_recov
2d510 65 72 22 2c 20 20 20 20 20 74 65 73 74 5f 67 6c  er",     test_gl
2d520 6f 62 61 6c 5f 72 65 63 6f 76 65 72 2c 20 30 20  obal_recover, 0 
2d530 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 77 6f 72    },.     { "wor
2d540 6b 69 6e 67 5f 36 34 62 69 74 5f 69 6e 74 22 2c  king_64bit_int",
2d550 20 20 20 20 20 20 20 20 20 20 77 6f 72 6b 69 6e            workin
2d560 67 5f 36 34 62 69 74 5f 69 6e 74 2c 20 20 20 30  g_64bit_int,   0
2d570 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76 66     },.     { "vf
2d580 73 5f 75 6e 6c 69 6e 6b 5f 74 65 73 74 22 2c 20  s_unlink_test", 
2d590 20 20 20 20 20 20 20 20 20 20 20 76 66 73 5f 75             vfs_u
2d5a0 6e 6c 69 6e 6b 5f 74 65 73 74 2c 20 20 20 20 20  nlink_test,     
2d5b0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 76  0   },.     { "v
2d5c0 66 73 5f 69 6e 69 74 66 61 69 6c 5f 74 65 73 74  fs_initfail_test
2d5d0 22 2c 20 20 20 20 20 20 20 20 20 20 76 66 73 5f  ",          vfs_
2d5e0 69 6e 69 74 66 61 69 6c 5f 74 65 73 74 2c 20 20  initfail_test,  
2d5f0 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   0   },.     { "
2d600 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 5f 61  vfs_unregister_a
2d610 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66 73  ll",         vfs
2d620 5f 75 6e 72 65 67 69 73 74 65 72 5f 61 6c 6c 2c  _unregister_all,
2d630 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20    0   },.     { 
2d640 22 76 66 73 5f 72 65 72 65 67 69 73 74 65 72 5f  "vfs_reregister_
2d650 61 6c 6c 22 2c 20 20 20 20 20 20 20 20 20 76 66  all",         vf
2d660 73 5f 72 65 72 65 67 69 73 74 65 72 5f 61 6c 6c  s_reregister_all
2d670 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  0   },.     {
2d680 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74   "file_control_t
2d690 65 73 74 22 2c 20 20 20 20 20 20 20 20 20 20 66  est",          f
2d6a0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 73 74  ile_control_test
2d6b0 2c 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20 20  ,   0   },.     
2d6c0 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f  { "file_control_
2d6d0 6c 61 73 74 65 72 72 6e 6f 5f 74 65 73 74 22 2c  lasterrno_test",
2d6e0 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 61   file_control_la
2d6f0 73 74 65 72 72 6e 6f 5f 74 65 73 74 2c 20 20 30  sterrno_test,  0
2d700 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 69     },.     { "fi
2d710 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70  le_control_lockp
2d720 72 6f 78 79 5f 74 65 73 74 22 2c 20 66 69 6c 65  roxy_test", file
2d730 5f 63 6f 6e 74 72 6f 6c 5f 6c 6f 63 6b 70 72 6f  _control_lockpro
2d740 78 79 5f 74 65 73 74 2c 20 20 30 20 20 20 7d 2c  xy_test,  0   },
2d750 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63 6f  .     { "file_co
2d760 6e 74 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f  ntrol_chunksize_
2d770 74 65 73 74 22 2c 20 66 69 6c 65 5f 63 6f 6e 74  test", file_cont
2d780 72 6f 6c 5f 63 68 75 6e 6b 73 69 7a 65 5f 74 65  rol_chunksize_te
2d790 73 74 2c 20 20 30 20 20 20 7d 2c 0a 20 20 20 20  st,  0   },.    
2d7a0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
2d7b0 5f 73 69 7a 65 68 69 6e 74 5f 74 65 73 74 22 2c  _sizehint_test",
2d7c0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 73    file_control_s
2d7d0 69 7a 65 68 69 6e 74 5f 74 65 73 74 2c 20 20 20  izehint_test,   
2d7e0 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2d7f0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33  ile_control_win3
2d800 32 5f 61 76 5f 72 65 74 72 79 22 2c 20 66 69 6c  2_av_retry", fil
2d810 65 5f 63 6f 6e 74 72 6f 6c 5f 77 69 6e 33 32 5f  e_control_win32_
2d820 61 76 5f 72 65 74 72 79 2c 20 20 30 20 20 20 7d  av_retry,  0   }
2d830 2c 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 5f 63  ,.     { "file_c
2d840 6f 6e 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77  ontrol_persist_w
2d850 61 6c 22 2c 20 20 20 20 66 69 6c 65 5f 63 6f 6e  al",    file_con
2d860 74 72 6f 6c 5f 70 65 72 73 69 73 74 5f 77 61 6c  trol_persist_wal
2d870 2c 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20  ,     0   },.   
2d880 20 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f    { "file_contro
2d890 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76 65 72  l_powersafe_over
2d8a0 77 72 69 74 65 22 2c 66 69 6c 65 5f 63 6f 6e 74  write",file_cont
2d8b0 72 6f 6c 5f 70 6f 77 65 72 73 61 66 65 5f 6f 76  rol_powersafe_ov
2d8c0 65 72 77 72 69 74 65 2c 30 7d 2c 0a 20 20 20 20  erwrite,0},.    
2d8d0 20 7b 20 22 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c   { "file_control
2d8e0 5f 76 66 73 6e 61 6d 65 22 2c 20 20 20 20 20 20  _vfsname",      
2d8f0 20 20 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 76    file_control_v
2d900 66 73 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  fsname,         
2d910 30 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  0   },.     { "f
2d920 69 6c 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70  ile_control_temp
2d930 66 69 6c 65 6e 61 6d 65 22 2c 20 20 20 66 69 6c  filename",   fil
2d940 65 5f 63 6f 6e 74 72 6f 6c 5f 74 65 6d 70 66 69  e_control_tempfi
2d950 6c 65 6e 61 6d 65 2c 20 20 20 20 30 20 20 20 7d  lename,    0   }
2d960 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65  ,.     { "sqlite
2d970 33 5f 76 66 73 5f 6c 69 73 74 22 2c 20 20 20 20  3_vfs_list",    
2d980 20 20 20 20 20 20 20 76 66 73 5f 6c 69 73 74 2c         vfs_list,
2d990 20 20 20 20 20 30 20 20 20 7d 2c 0a 20 20 20 20       0   },.    
2d9a0 20 7b 20 22 73 71 6c 69 74 65 33 5f 63 72 65 61   { "sqlite3_crea
2d9b0 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 22 2c  te_function_v2",
2d9c0 20 74 65 73 74 5f 63 72 65 61 74 65 5f 66 75 6e   test_create_fun
2d9d0 63 74 69 6f 6e 5f 76 32 2c 20 30 20 7d 2c 0a 0a  ction_v2, 0 },..
2d9e0 20 20 20 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e       /* Function
2d9f0 73 20 66 72 6f 6d 20 6f 73 2e 68 20 2a 2f 0a 23  s from os.h */.#
2da00 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2da10 49 54 5f 55 54 46 31 36 0a 20 20 20 20 20 7b 20  IT_UTF16.     { 
2da20 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  "add_test_collat
2da30 65 22 2c 20 20 20 20 20 20 20 20 74 65 73 74 5f  e",        test_
2da40 63 6f 6c 6c 61 74 65 2c 20 30 20 20 20 20 20 20  collate, 0      
2da50 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20        },.     { 
2da60 22 61 64 64 5f 74 65 73 74 5f 63 6f 6c 6c 61 74  "add_test_collat
2da70 65 5f 6e 65 65 64 65 64 22 2c 20 74 65 73 74 5f  e_needed", test_
2da80 63 6f 6c 6c 61 74 65 5f 6e 65 65 64 65 64 2c 20  collate_needed, 
2da90 30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 7b 20  0     },.     { 
2daa0 22 61 64 64 5f 74 65 73 74 5f 66 75 6e 63 74 69  "add_test_functi
2dab0 6f 6e 22 2c 20 20 20 20 20 20 20 74 65 73 74 5f  on",       test_
2dac0 66 75 6e 63 74 69 6f 6e 2c 20 30 20 20 20 20 20  function, 0     
2dad0 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
2dae0 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2daf0 74 65 73 74 5f 65 72 72 73 74 72 22 2c 20 20 20  test_errstr",   
2db00 20 20 74 65 73 74 5f 65 72 72 73 74 72 2c 20 30    test_errstr, 0
2db10 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2db20 20 20 20 20 20 7b 20 22 74 63 6c 5f 76 61 72 69       { "tcl_vari
2db30 61 62 6c 65 5f 74 79 70 65 22 2c 20 20 20 20 20  able_type",     
2db40 20 20 74 63 6c 5f 76 61 72 69 61 62 6c 65 5f 74    tcl_variable_t
2db50 79 70 65 2c 20 30 20 20 20 20 20 20 20 7d 2c 0a  ype, 0       },.
2db60 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
2db70 4d 49 54 5f 53 48 41 52 45 44 5f 43 41 43 48 45  MIT_SHARED_CACHE
2db80 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2db90 5f 65 6e 61 62 6c 65 5f 73 68 61 72 65 64 5f 63  _enable_shared_c
2dba0 61 63 68 65 22 2c 20 74 65 73 74 5f 65 6e 61 62  ache", test_enab
2dbb0 6c 65 5f 73 68 61 72 65 64 2c 20 30 20 20 7d 2c  le_shared, 0  },
2dbc0 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2dbd0 5f 73 68 61 72 65 64 5f 63 61 63 68 65 5f 72 65  _shared_cache_re
2dbe0 70 6f 72 74 22 2c 20 73 71 6c 69 74 65 33 42 74  port", sqlite3Bt
2dbf0 72 65 65 53 68 61 72 65 64 43 61 63 68 65 52 65  reeSharedCacheRe
2dc00 70 6f 72 74 2c 20 30 7d 2c 0a 23 65 6e 64 69 66  port, 0},.#endif
2dc10 0a 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33  .     { "sqlite3
2dc20 5f 6c 69 62 76 65 72 73 69 6f 6e 5f 6e 75 6d 62  _libversion_numb
2dc30 65 72 22 2c 20 74 65 73 74 5f 6c 69 62 76 65 72  er", test_libver
2dc40 73 69 6f 6e 5f 6e 75 6d 62 65 72 2c 20 30 20 20  sion_number, 0  
2dc50 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  },.#ifdef SQLITE
2dc60 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
2dc70 45 54 41 44 41 54 41 0a 20 20 20 20 20 7b 20 22  ETADATA.     { "
2dc80 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
2dc90 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 22 2c 20  lumn_metadata", 
2dca0 74 65 73 74 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  test_table_colum
2dcb0 6e 5f 6d 65 74 61 64 61 74 61 2c 20 30 20 20 7d  n_metadata, 0  }
2dcc0 2c 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ,.#endif.#ifndef
2dcd0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 49 4e 43   SQLITE_OMIT_INC
2dce0 52 42 4c 4f 42 0a 20 20 20 20 20 7b 20 22 73 71  RBLOB.     { "sq
2dcf0 6c 69 74 65 33 5f 62 6c 6f 62 5f 72 65 61 64 22  lite3_blob_read"
2dd00 2c 20 20 20 74 65 73 74 5f 62 6c 6f 62 5f 72 65  ,   test_blob_re
2dd10 61 64 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  ad, 0  },.     {
2dd20 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 77   "sqlite3_blob_w
2dd30 72 69 74 65 22 2c 20 20 74 65 73 74 5f 62 6c 6f  rite",  test_blo
2dd40 62 5f 77 72 69 74 65 2c 20 30 20 20 7d 2c 0a 20  b_write, 0  },. 
2dd50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 62      { "sqlite3_b
2dd60 6c 6f 62 5f 72 65 6f 70 65 6e 22 2c 20 74 65 73  lob_reopen", tes
2dd70 74 5f 62 6c 6f 62 5f 72 65 6f 70 65 6e 2c 20 30  t_blob_reopen, 0
2dd80 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 71 6c    },.     { "sql
2dd90 69 74 65 33 5f 62 6c 6f 62 5f 62 79 74 65 73 22  ite3_blob_bytes"
2dda0 2c 20 20 74 65 73 74 5f 62 6c 6f 62 5f 62 79 74  ,  test_blob_byt
2ddb0 65 73 2c 20 30 20 20 7d 2c 0a 20 20 20 20 20 7b  es, 0  },.     {
2ddc0 20 22 73 71 6c 69 74 65 33 5f 62 6c 6f 62 5f 63   "sqlite3_blob_c
2ddd0 6c 6f 73 65 22 2c 20 20 74 65 73 74 5f 62 6c 6f  lose",  test_blo
2dde0 62 5f 63 6c 6f 73 65 2c 20 30 20 20 7d 2c 0a 23  b_close, 0  },.#
2ddf0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 70 63  endif.     { "pc
2de00 61 63 68 65 5f 73 74 61 74 73 22 2c 20 20 20 20  ache_stats",    
2de10 20 20 20 74 65 73 74 5f 70 63 61 63 68 65 5f 73     test_pcache_s
2de20 74 61 74 73 2c 20 30 20 20 7d 2c 0a 23 69 66 64  tats, 0  },.#ifd
2de30 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2de40 5f 55 4e 4c 4f 43 4b 5f 4e 4f 54 49 46 59 0a 20  _UNLOCK_NOTIFY. 
2de50 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 75      { "sqlite3_u
2de60 6e 6c 6f 63 6b 5f 6e 6f 74 69 66 79 22 2c 20 74  nlock_notify", t
2de70 65 73 74 5f 75 6e 6c 6f 63 6b 5f 6e 6f 74 69 66  est_unlock_notif
2de80 79 2c 20 30 20 20 7d 2c 0a 23 65 6e 64 69 66 0a  y, 0  },.#endif.
2de90 20 20 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f       { "sqlite3_
2dea0 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 22 2c  wal_checkpoint",
2deb0 20 20 20 74 65 73 74 5f 77 61 6c 5f 63 68 65 63     test_wal_chec
2dec0 6b 70 6f 69 6e 74 2c 20 30 20 20 7d 2c 0a 20 20  kpoint, 0  },.  
2ded0 20 20 20 7b 20 22 73 71 6c 69 74 65 33 5f 77 61     { "sqlite3_wa
2dee0 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 22  l_checkpoint_v2"
2def0 2c 74 65 73 74 5f 77 61 6c 5f 63 68 65 63 6b 70  ,test_wal_checkp
2df00 6f 69 6e 74 5f 76 32 2c 20 30 20 20 7d 2c 0a 20  oint_v2, 0  },. 
2df10 20 20 20 20 7b 20 22 74 65 73 74 5f 73 71 6c 69      { "test_sqli
2df20 74 65 33 5f 6c 6f 67 22 2c 20 20 20 20 20 20 20  te3_log",       
2df30 20 20 74 65 73 74 5f 73 71 6c 69 74 65 33 5f 6c    test_sqlite3_l
2df40 6f 67 2c 20 30 20 20 7d 2c 0a 23 69 66 6e 64 65  og, 0  },.#ifnde
2df50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 45 58  f SQLITE_OMIT_EX
2df60 50 4c 41 49 4e 0a 20 20 20 20 20 7b 20 22 70 72  PLAIN.     { "pr
2df70 69 6e 74 5f 65 78 70 6c 61 69 6e 5f 71 75 65 72  int_explain_quer
2df80 79 5f 70 6c 61 6e 22 2c 20 74 65 73 74 5f 70 72  y_plan", test_pr
2df90 69 6e 74 5f 65 71 70 2c 20 30 20 20 7d 2c 0a 23  int_eqp, 0  },.#
2dfa0 65 6e 64 69 66 0a 20 20 20 20 20 7b 20 22 73 71  endif.     { "sq
2dfb0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2dfc0 6f 6c 22 2c 20 74 65 73 74 5f 74 65 73 74 5f 63  ol", test_test_c
2dfd0 6f 6e 74 72 6f 6c 20 7d 2c 0a 23 69 66 20 53 51  ontrol },.#if SQ
2dfe0 4c 49 54 45 5f 4f 53 5f 55 4e 49 58 0a 20 20 20  LITE_OS_UNIX.   
2dff0 20 20 7b 20 22 67 65 74 72 75 73 61 67 65 22 2c    { "getrusage",
2e000 20 74 65 73 74 5f 67 65 74 72 75 73 61 67 65 20   test_getrusage 
2e010 7d 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 7b  },.#endif.     {
2e020 20 22 6c 6f 61 64 5f 73 74 61 74 69 63 5f 65 78   "load_static_ex
2e030 74 65 6e 73 69 6f 6e 22 2c 20 74 63 6c 4c 6f 61  tension", tclLoa
2e040 64 53 74 61 74 69 63 45 78 74 65 6e 73 69 6f 6e  dStaticExtension
2e050 43 6d 64 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74  Cmd },.  };.  st
2e060 61 74 69 63 20 69 6e 74 20 62 69 74 6d 61 73 6b  atic int bitmask
2e070 5f 73 69 7a 65 20 3d 20 73 69 7a 65 6f 66 28 42  _size = sizeof(B
2e080 69 74 6d 61 73 6b 29 2a 38 3b 0a 20 20 69 6e 74  itmask)*8;.  int
2e090 20 69 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74   i;.  extern int
2e0a0 20 73 71 6c 69 74 65 33 5f 73 79 6e 63 5f 63 6f   sqlite3_sync_co
2e0b0 75 6e 74 2c 20 73 71 6c 69 74 65 33 5f 66 75 6c  unt, sqlite3_ful
2e0c0 6c 73 79 6e 63 5f 63 6f 75 6e 74 3b 0a 20 20 65  lsync_count;.  e
2e0d0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2e0e0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
2e0f0 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73  ;.  extern int s
2e100 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e  qlite3_like_coun
2e110 74 3b 0a 20 20 65 78 74 65 72 6e 20 69 6e 74 20  t;.  extern int 
2e120 73 71 6c 69 74 65 33 5f 78 66 65 72 6f 70 74 5f  sqlite3_xferopt_
2e130 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65 72 6e 20  count;.  extern 
2e140 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
2e150 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 3b 0a  r_readdb_count;.
2e160 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
2e170 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
2e180 64 62 5f 63 6f 75 6e 74 3b 0a 20 20 65 78 74 65  db_count;.  exte
2e190 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  rn int sqlite3_p
2e1a0 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
2e1b0 74 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53  t;.#if SQLITE_OS
2e1c0 5f 57 49 4e 0a 20 20 65 78 74 65 72 6e 20 69 6e  _WIN.  extern in
2e1d0 74 20 73 71 6c 69 74 65 33 5f 6f 73 5f 74 79 70  t sqlite3_os_typ
2e1e0 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  e;.#endif.#ifdef
2e1f0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
2e200 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2e210 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20 20  e3WhereTrace;.  
2e220 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
2e230 65 33 4f 53 54 72 61 63 65 3b 0a 20 20 65 78 74  e3OSTrace;.  ext
2e240 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57  ern int sqlite3W
2e250 61 6c 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a  alTrace;.#endif.
2e260 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
2e270 53 54 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ST.#ifdef SQLITE
2e280 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 65  _ENABLE_FTS3.  e
2e290 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
2e2a0 33 5f 66 74 73 33 5f 65 6e 61 62 6c 65 5f 70 61  3_fts3_enable_pa
2e2b0 72 65 6e 74 68 65 73 65 73 3b 0a 23 65 6e 64 69  rentheses;.#endi
2e2c0 66 0a 23 65 6e 64 69 66 0a 0a 20 20 66 6f 72 28  f.#endif..  for(
2e2d0 69 3d 30 3b 20 69 3c 73 69 7a 65 6f 66 28 61 43  i=0; i<sizeof(aC
2e2e0 6d 64 29 2f 73 69 7a 65 6f 66 28 61 43 6d 64 5b  md)/sizeof(aCmd[
2e2f0 30 5d 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54  0]); i++){.    T
2e300 63 6c 5f 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64  cl_CreateCommand
2e310 28 69 6e 74 65 72 70 2c 20 61 43 6d 64 5b 69 5d  (interp, aCmd[i]
2e320 2e 7a 4e 61 6d 65 2c 20 61 43 6d 64 5b 69 5d 2e  .zName, aCmd[i].
2e330 78 50 72 6f 63 2c 20 30 2c 20 30 29 3b 0a 20 20  xProc, 0, 0);.  
2e340 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 73  }.  for(i=0; i<s
2e350 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 29 2f 73  izeof(aObjCmd)/s
2e360 69 7a 65 6f 66 28 61 4f 62 6a 43 6d 64 5b 30 5d  izeof(aObjCmd[0]
2e370 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 54 63 6c  ); i++){.    Tcl
2e380 5f 43 72 65 61 74 65 4f 62 6a 43 6f 6d 6d 61 6e  _CreateObjComman
2e390 64 28 69 6e 74 65 72 70 2c 20 61 4f 62 6a 43 6d  d(interp, aObjCm
2e3a0 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 0a 20 20 20  d[i].zName, .   
2e3b0 20 20 20 20 20 61 4f 62 6a 43 6d 64 5b 69 5d 2e       aObjCmd[i].
2e3c0 78 50 72 6f 63 2c 20 61 4f 62 6a 43 6d 64 5b 69  xProc, aObjCmd[i
2e3d0 5d 2e 63 6c 69 65 6e 74 44 61 74 61 2c 20 30 29  ].clientData, 0)
2e3e0 3b 0a 20 20 7d 0a 20 20 54 63 6c 5f 4c 69 6e 6b  ;.  }.  Tcl_Link
2e3f0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2e400 69 74 65 5f 73 65 61 72 63 68 5f 63 6f 75 6e 74  ite_search_count
2e410 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
2e420 29 26 73 71 6c 69 74 65 33 5f 73 65 61 72 63 68  )&sqlite3_search
2e430 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b  _count, TCL_LINK
2e440 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e  _INT);.  Tcl_Lin
2e450 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71  kVar(interp, "sq
2e460 6c 69 74 65 5f 66 6f 75 6e 64 5f 63 6f 75 6e 74  lite_found_count
2e470 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a  ", .      (char*
2e480 29 26 73 71 6c 69 74 65 33 5f 66 6f 75 6e 64 5f  )&sqlite3_found_
2e490 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  count, TCL_LINK_
2e4a0 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b  INT);.  Tcl_Link
2e4b0 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c  Var(interp, "sql
2e4c0 69 74 65 5f 73 6f 72 74 5f 63 6f 75 6e 74 22 2c  ite_sort_count",
2e4d0 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
2e4e0 73 71 6c 69 74 65 33 5f 73 6f 72 74 5f 63 6f 75  sqlite3_sort_cou
2e4f0 6e 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54  nt, TCL_LINK_INT
2e500 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  );.  Tcl_LinkVar
2e510 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2e520 33 5f 6d 61 78 5f 62 6c 6f 62 73 69 7a 65 22 2c  3_max_blobsize",
2e530 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26   .      (char*)&
2e540 73 71 6c 69 74 65 33 5f 6d 61 78 5f 62 6c 6f 62  sqlite3_max_blob
2e550 73 69 7a 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  size, TCL_LINK_I
2e560 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NT);.  Tcl_LinkV
2e570 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2e580 74 65 5f 6c 69 6b 65 5f 63 6f 75 6e 74 22 2c 20  te_like_count", 
2e590 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73  .      (char*)&s
2e5a0 71 6c 69 74 65 33 5f 6c 69 6b 65 5f 63 6f 75 6e  qlite3_like_coun
2e5b0 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2e5c0 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  ;.  Tcl_LinkVar(
2e5d0 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2e5e0 69 6e 74 65 72 72 75 70 74 5f 63 6f 75 6e 74 22  interrupt_count"
2e5f0 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  , .      (char*)
2e600 26 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75  &sqlite3_interru
2e610 70 74 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  pt_count, TCL_LI
2e620 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63 6c 5f 4c  NK_INT);.  Tcl_L
2e630 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2e640 73 71 6c 69 74 65 5f 6f 70 65 6e 5f 66 69 6c 65  sqlite_open_file
2e650 5f 63 6f 75 6e 74 22 2c 20 0a 20 20 20 20 20 20  _count", .      
2e660 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2e670 6f 70 65 6e 5f 66 69 6c 65 5f 63 6f 75 6e 74 2c  open_file_count,
2e680 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
2e690 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2e6a0 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 63 75  terp, "sqlite_cu
2e6b0 72 72 65 6e 74 5f 74 69 6d 65 22 2c 20 0a 20 20  rrent_time", .  
2e6c0 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69      (char*)&sqli
2e6d0 74 65 33 5f 63 75 72 72 65 6e 74 5f 74 69 6d 65  te3_current_time
2e6e0 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b  , TCL_LINK_INT);
2e6f0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 55  .#if SQLITE_OS_U
2e700 4e 49 58 20 26 26 20 64 65 66 69 6e 65 64 28 5f  NIX && defined(_
2e710 5f 41 50 50 4c 45 5f 5f 29 20 26 26 20 53 51 4c  _APPLE__) && SQL
2e720 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 43 4b 49  ITE_ENABLE_LOCKI
2e730 4e 47 5f 53 54 59 4c 45 0a 20 20 54 63 6c 5f 4c  NG_STYLE.  Tcl_L
2e740 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2e750 73 71 6c 69 74 65 5f 68 6f 73 74 69 64 5f 6e 75  sqlite_hostid_nu
2e760 6d 22 2c 20 0a 20 20 20 20 20 20 28 63 68 61 72  m", .      (char
2e770 2a 29 26 73 71 6c 69 74 65 33 5f 68 6f 73 74 69  *)&sqlite3_hosti
2e780 64 5f 6e 75 6d 2c 20 54 43 4c 5f 4c 49 4e 4b 5f  d_num, TCL_LINK_
2e790 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 20 20 54  INT);.#endif.  T
2e7a0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2e7b0 70 2c 20 22 73 71 6c 69 74 65 33 5f 78 66 65 72  p, "sqlite3_xfer
2e7c0 6f 70 74 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20  opt_count",.    
2e7d0 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65    (char*)&sqlite
2e7e0 33 5f 78 66 65 72 6f 70 74 5f 63 6f 75 6e 74 2c  3_xferopt_count,
2e7f0 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
2e800 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2e810 74 65 72 70 2c 20 22 73 71 6c 69 74 65 33 5f 70  terp, "sqlite3_p
2e820 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
2e830 74 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  t",.      (char*
2e840 29 26 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  )&sqlite3_pager_
2e850 72 65 61 64 64 62 5f 63 6f 75 6e 74 2c 20 54 43  readdb_count, TC
2e860 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54  L_LINK_INT);.  T
2e870 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2e880 70 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65  p, "sqlite3_page
2e890 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 22  r_writedb_count"
2e8a0 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2e8b0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
2e8c0 69 74 65 64 62 5f 63 6f 75 6e 74 2c 20 54 43 4c  itedb_count, TCL
2e8d0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
2e8e0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2e8f0 2c 20 22 73 71 6c 69 74 65 33 5f 70 61 67 65 72  , "sqlite3_pager
2e900 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 22 2c 0a  _writej_count",.
2e910 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2e920 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
2e930 65 6a 5f 63 6f 75 6e 74 2c 20 54 43 4c 5f 4c 49  ej_count, TCL_LI
2e940 4e 4b 5f 49 4e 54 29 3b 0a 23 69 66 6e 64 65 66  NK_INT);.#ifndef
2e950 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
2e960 31 36 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  16.  Tcl_LinkVar
2e970 28 69 6e 74 65 72 70 2c 20 22 75 6e 61 6c 69 67  (interp, "unalig
2e980 6e 65 64 5f 73 74 72 69 6e 67 5f 63 6f 75 6e 74  ned_string_count
2e990 65 72 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72  er",.      (char
2e9a0 2a 29 26 75 6e 61 6c 69 67 6e 65 64 5f 73 74 72  *)&unaligned_str
2e9b0 69 6e 67 5f 63 6f 75 6e 74 65 72 2c 20 54 43 4c  ing_counter, TCL
2e9c0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64  _LINK_INT);.#end
2e9d0 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
2e9e0 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 54  E_OMIT_UTF16.  T
2e9f0 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2ea00 70 2c 20 22 73 71 6c 69 74 65 5f 6c 61 73 74 5f  p, "sqlite_last_
2ea10 6e 65 65 64 65 64 5f 63 6f 6c 6c 61 74 69 6f 6e  needed_collation
2ea20 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29  ",.      (char*)
2ea30 26 70 7a 4e 65 65 64 65 64 43 6f 6c 6c 61 74 69  &pzNeededCollati
2ea40 6f 6e 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52  on, TCL_LINK_STR
2ea50 49 4e 47 7c 54 43 4c 5f 4c 49 4e 4b 5f 52 45 41  ING|TCL_LINK_REA
2ea60 44 5f 4f 4e 4c 59 29 3b 0a 23 65 6e 64 69 66 0a  D_ONLY);.#endif.
2ea70 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
2ea80 4e 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28  N.  Tcl_LinkVar(
2ea90 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f  interp, "sqlite_
2eaa0 6f 73 5f 74 79 70 65 22 2c 0a 20 20 20 20 20 20  os_type",.      
2eab0 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33 5f  (char*)&sqlite3_
2eac0 6f 73 5f 74 79 70 65 2c 20 54 43 4c 5f 4c 49 4e  os_type, TCL_LIN
2ead0 4b 5f 49 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23  K_INT);.#endif.#
2eae0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
2eaf0 54 0a 20 20 7b 0a 20 20 20 20 73 74 61 74 69 63  T.  {.    static
2eb00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 71 75 65   const char *que
2eb10 72 79 5f 70 6c 61 6e 20 3d 20 22 2a 2a 2a 20 4f  ry_plan = "*** O
2eb20 42 53 4f 4c 45 54 45 20 56 41 52 49 41 42 4c 45  BSOLETE VARIABLE
2eb30 20 2a 2a 2a 22 3b 0a 20 20 20 20 54 63 6c 5f 4c   ***";.    Tcl_L
2eb40 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2eb50 73 71 6c 69 74 65 5f 71 75 65 72 79 5f 70 6c 61  sqlite_query_pla
2eb60 6e 22 2c 0a 20 20 20 20 20 20 20 28 63 68 61 72  n",.       (char
2eb70 2a 29 26 71 75 65 72 79 5f 70 6c 61 6e 2c 20 54  *)&query_plan, T
2eb80 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49 4e 47 7c 54  CL_LINK_STRING|T
2eb90 43 4c 5f 4c 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c  CL_LINK_READ_ONL
2eba0 59 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23  Y);.  }.#endif.#
2ebb0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
2ebc0 55 47 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72  UG.  Tcl_LinkVar
2ebd0 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69 74 65  (interp, "sqlite
2ebe0 5f 77 68 65 72 65 5f 74 72 61 63 65 22 2c 0a 20  _where_trace",. 
2ebf0 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c       (char*)&sql
2ec00 69 74 65 33 57 68 65 72 65 54 72 61 63 65 2c 20  ite3WhereTrace, 
2ec10 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20  TCL_LINK_INT);. 
2ec20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74   Tcl_LinkVar(int
2ec30 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 73 5f  erp, "sqlite_os_
2ec40 74 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63  trace",.      (c
2ec50 68 61 72 2a 29 26 73 71 6c 69 74 65 33 4f 53 54  har*)&sqlite3OST
2ec60 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
2ec70 4e 54 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  NT);.#ifndef SQL
2ec80 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 54  ITE_OMIT_WAL.  T
2ec90 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72  cl_LinkVar(inter
2eca0 70 2c 20 22 73 71 6c 69 74 65 5f 77 61 6c 5f 74  p, "sqlite_wal_t
2ecb0 72 61 63 65 22 2c 0a 20 20 20 20 20 20 28 63 68  race",.      (ch
2ecc0 61 72 2a 29 26 73 71 6c 69 74 65 33 57 61 6c 54  ar*)&sqlite3WalT
2ecd0 72 61 63 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49  race, TCL_LINK_I
2ece0 4e 54 29 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64  NT);.#endif.#end
2ecf0 69 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  if.#ifndef SQLIT
2ed00 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 20 20  E_OMIT_DISKIO.  
2ed10 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2ed20 72 70 2c 20 22 73 71 6c 69 74 65 5f 6f 70 65 6e  rp, "sqlite_open
2ed30 74 65 6d 70 5f 63 6f 75 6e 74 22 2c 0a 20 20 20  temp_count",.   
2ed40 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2ed50 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e  e3_opentemp_coun
2ed60 74 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29  t, TCL_LINK_INT)
2ed70 3b 0a 23 65 6e 64 69 66 0a 20 20 54 63 6c 5f 4c  ;.#endif.  Tcl_L
2ed80 69 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22  inkVar(interp, "
2ed90 73 71 6c 69 74 65 5f 73 74 61 74 69 63 5f 62 69  sqlite_static_bi
2eda0 6e 64 5f 76 61 6c 75 65 22 2c 0a 20 20 20 20 20  nd_value",.     
2edb0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 5f   (char*)&sqlite_
2edc0 73 74 61 74 69 63 5f 62 69 6e 64 5f 76 61 6c 75  static_bind_valu
2edd0 65 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  e, TCL_LINK_STRI
2ede0 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
2edf0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2ee00 74 65 5f 73 74 61 74 69 63 5f 62 69 6e 64 5f 6e  te_static_bind_n
2ee10 62 79 74 65 22 2c 0a 20 20 20 20 20 20 28 63 68  byte",.      (ch
2ee20 61 72 2a 29 26 73 71 6c 69 74 65 5f 73 74 61 74  ar*)&sqlite_stat
2ee30 69 63 5f 62 69 6e 64 5f 6e 62 79 74 65 2c 20 54  ic_bind_nbyte, T
2ee40 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20  CL_LINK_INT);.  
2ee50 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65  Tcl_LinkVar(inte
2ee60 72 70 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  rp, "sqlite_temp
2ee70 5f 64 69 72 65 63 74 6f 72 79 22 2c 0a 20 20 20  _directory",.   
2ee80 20 20 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74     (char*)&sqlit
2ee90 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2eea0 79 2c 20 54 43 4c 5f 4c 49 4e 4b 5f 53 54 52 49  y, TCL_LINK_STRI
2eeb0 4e 47 29 3b 0a 20 20 54 63 6c 5f 4c 69 6e 6b 56  NG);.  Tcl_LinkV
2eec0 61 72 28 69 6e 74 65 72 70 2c 20 22 73 71 6c 69  ar(interp, "sqli
2eed0 74 65 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  te_data_director
2eee0 79 22 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a  y",.      (char*
2eef0 29 26 73 71 6c 69 74 65 33 5f 64 61 74 61 5f 64  )&sqlite3_data_d
2ef00 69 72 65 63 74 6f 72 79 2c 20 54 43 4c 5f 4c 49  irectory, TCL_LI
2ef10 4e 4b 5f 53 54 52 49 4e 47 29 3b 0a 20 20 54 63  NK_STRING);.  Tc
2ef20 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2ef30 2c 20 22 62 69 74 6d 61 73 6b 5f 73 69 7a 65 22  , "bitmask_size"
2ef40 2c 0a 20 20 20 20 20 20 28 63 68 61 72 2a 29 26  ,.      (char*)&
2ef50 62 69 74 6d 61 73 6b 5f 73 69 7a 65 2c 20 54 43  bitmask_size, TC
2ef60 4c 5f 4c 49 4e 4b 5f 49 4e 54 7c 54 43 4c 5f 4c  L_LINK_INT|TCL_L
2ef70 49 4e 4b 5f 52 45 41 44 5f 4f 4e 4c 59 29 3b 0a  INK_READ_ONLY);.
2ef80 20 20 54 63 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e    Tcl_LinkVar(in
2ef90 74 65 72 70 2c 20 22 73 71 6c 69 74 65 5f 73 79  terp, "sqlite_sy
2efa0 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  nc_count",.     
2efb0 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
2efc0 5f 73 79 6e 63 5f 63 6f 75 6e 74 2c 20 54 43 4c  _sync_count, TCL
2efd0 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 20 20 54 63  _LINK_INT);.  Tc
2efe0 6c 5f 4c 69 6e 6b 56 61 72 28 69 6e 74 65 72 70  l_LinkVar(interp
2eff0 2c 20 22 73 71 6c 69 74 65 5f 66 75 6c 6c 73 79  , "sqlite_fullsy
2f000 6e 63 5f 63 6f 75 6e 74 22 2c 0a 20 20 20 20 20  nc_count",.     
2f010 20 28 63 68 61 72 2a 29 26 73 71 6c 69 74 65 33   (char*)&sqlite3
2f020 5f 66 75 6c 6c 73 79 6e 63 5f 63 6f 75 6e 74 2c  _fullsync_count,
2f030 20 54 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a   TCL_LINK_INT);.
2f040 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
2f050 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 29 20  TE_ENABLE_FTS3) 
2f060 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
2f070 45 5f 54 45 53 54 29 0a 20 20 54 63 6c 5f 4c 69  E_TEST).  Tcl_Li
2f080 6e 6b 56 61 72 28 69 6e 74 65 72 70 2c 20 22 73  nkVar(interp, "s
2f090 71 6c 69 74 65 5f 66 74 73 33 5f 65 6e 61 62 6c  qlite_fts3_enabl
2f0a0 65 5f 70 61 72 65 6e 74 68 65 73 65 73 22 2c 0a  e_parentheses",.
2f0b0 20 20 20 20 20 20 28 63 68 61 72 2a 29 26 73 71        (char*)&sq
2f0c0 6c 69 74 65 33 5f 66 74 73 33 5f 65 6e 61 62 6c  lite3_fts3_enabl
2f0d0 65 5f 70 61 72 65 6e 74 68 65 73 65 73 2c 20 54  e_parentheses, T
2f0e0 43 4c 5f 4c 49 4e 4b 5f 49 4e 54 29 3b 0a 23 65  CL_LINK_INT);.#e
2f0f0 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 54 43  ndif.  return TC
2f100 4c 5f 4f 4b 3b 0a 7d 0a                          L_OK;.}.